You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by mm...@apache.org on 2018/09/20 08:53:53 UTC

[incubator-pulsar] branch asf-site updated: Updated site at revision 0ab2325

This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/incubator-pulsar.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new b2b67e5  Updated site at revision 0ab2325
b2b67e5 is described below

commit b2b67e5ec3f5c5d4717546c54cd8982b28a021b7
Author: jenkins <bu...@apache.org>
AuthorDate: Thu Sep 20 08:53:44 2018 +0000

    Updated site at revision 0ab2325
---
 content/api/python/index.html                      | 886 +++------------------
 content/docs/en/sql-getting-started.html           |   4 +-
 content/docs/en/sql-getting-started/index.html     |   4 +-
 content/docs/fr/sql-getting-started.html           |   4 +-
 content/docs/fr/sql-getting-started/index.html     |   4 +-
 content/docs/ja/sql-getting-started.html           |   4 +-
 content/docs/ja/sql-getting-started/index.html     |   4 +-
 .../docs/latest/adaptors/PulsarSpark/index.html    |   2 +-
 .../docs/latest/adaptors/PulsarStorm/index.html    |   2 +-
 content/docs/latest/admin-api/overview/index.html  |   8 +-
 content/docs/latest/clients/Java/index.html        |   2 +-
 .../latest/cookbooks/PartitionedTopics/index.html  |   2 +-
 .../latest/cookbooks/RetentionExpiry/index.html    |   2 +-
 .../docs/latest/cookbooks/compaction/index.html    |   2 +-
 .../cookbooks/message-deduplication/index.html     |   2 +-
 .../docs/latest/cookbooks/message-queue/index.html |   2 +-
 .../latest/cookbooks/tiered-storage/index.html     |   2 +-
 .../docs/latest/deployment/aws-cluster/index.html  |   2 +-
 content/docs/latest/deployment/cluster/index.html  |   2 +-
 content/docs/latest/deployment/instance/index.html |   2 +-
 content/docs/latest/reference/CliTools/index.html  |   4 +-
 .../docs/latest/security/authorization/index.html  |   4 +-
 content/docs/zh-CN/sql-getting-started.html        |   4 +-
 content/docs/zh-CN/sql-getting-started/index.html  |   4 +-
 content/swagger/swagger.json                       |  34 +-
 25 files changed, 151 insertions(+), 841 deletions(-)

diff --git a/content/api/python/index.html b/content/api/python/index.html
index 7d5e956..72a09f8 100644
--- a/content/api/python/index.html
+++ b/content/api/python/index.html
@@ -1011,8 +1011,6 @@ table {
     <li class="mono"><a href="#pulsar.Client.create_producer">create_producer</a></li>
     <li class="mono"><a href="#pulsar.Client.create_reader">create_reader</a></li>
     <li class="mono"><a href="#pulsar.Client.subscribe">subscribe</a></li>
-    <li class="mono"><a href="#pulsar.Client.subscribe_pattern">subscribe_pattern</a></li>
-    <li class="mono"><a href="#pulsar.Client.subscribe_topics">subscribe_topics</a></li>
   </ul>
 
         </li>
@@ -1279,6 +1277,9 @@ from pulsar.functions.function import Function
 from pulsar.functions.context import Context
 from pulsar.functions.serde import SerDe, IdentitySerDe, PickleSerDe
 
+import re
+_retype = type(re.compile('x'))
+
 class MessageId:
     """
     Represents a message id
@@ -1587,114 +1588,19 @@ class Client:
                   unacked_messages_timeout_ms=None,
                   broker_consumer_stats_cache_time_ms=30000,
                   is_read_compacted=False,
-                  properties=None
+                  properties=None,
+                  pattern_auto_discovery_period=60
                   ):
         """
         Subscribe to the given topic and subscription combination.
 
         **Args**
 
-        * `topic`: The name of the topic.
-        * `subscription`: The name of the subscription.
-
-        **Options**
-
-        * `consumer_type`:
-          Select the subscription type to be used when subscribing to the topic.
-        * `message_listener`:
-          Sets a message listener for the consumer. When the listener is set,
-          the application will receive messages through it. Calls to
-          `consumer.receive()` will not be allowed. The listener function needs
-          to accept (consumer, message), for example:
-
-                #!python
-                def my_listener(consumer, message):
-                    # process message
-                    consumer.acknowledge(message)
-
-        * `receiver_queue_size`:
-          Sets the size of the consumer receive queue. The consumer receive
-          queue controls how many messages can be accumulated by the consumer
-          before the application calls `receive()`. Using a higher value could
-          potentially increase the consumer throughput at the expense of higher
-          memory utilization. Setting the consumer queue size to zero decreases
-          the throughput of the consumer by disabling pre-fetching of messages.
-          This approach improves the message distribution on shared subscription
-          by pushing messages only to those consumers that are ready to process
-          them. Neither receive with timeout nor partitioned topics can be used
-          if the consumer queue size is zero. The `receive()` function call
-          should not be interrupted when the consumer queue size is zero. The
-          default value is 1000 messages and should work well for most use
-          cases.
-        * `max_total_receiver_queue_size_across_partitions`
-          Set the max total receiver queue size across partitions.
-          This setting will be used to reduce the receiver queue size for individual partitions
-        * `consumer_name`:
-          Sets the consumer name.
-        * `unacked_messages_timeout_ms`:
-          Sets the timeout in milliseconds for unacknowledged messages. The
-          timeout needs to be greater than 10 seconds. An exception is thrown if
-          the given value is less than 10 seconds. If a successful
-          acknowledgement is not sent within the timeout, all the unacknowledged
-          messages are redelivered.
-        * `broker_consumer_stats_cache_time_ms`:
-          Sets the time duration for which the broker-side consumer stats will
-          be cached in the client.
-        * `properties`:
-          Sets the properties for the consumer. The properties associated with a consumer
-          can be used for identify a consumer at broker side.
-        """
-        _check_type(str, topic, 'topic')
-        _check_type(str, subscription_name, 'subscription_name')
-        _check_type(ConsumerType, consumer_type, 'consumer_type')
-        _check_type(int, receiver_queue_size, 'receiver_queue_size')
-        _check_type(int, max_total_receiver_queue_size_across_partitions,
-                    'max_total_receiver_queue_size_across_partitions')
-        _check_type_or_none(str, consumer_name, 'consumer_name')
-        _check_type_or_none(int, unacked_messages_timeout_ms, 'unacked_messages_timeout_ms')
-        _check_type(int, broker_consumer_stats_cache_time_ms, 'broker_consumer_stats_cache_time_ms')
-        _check_type(bool, is_read_compacted, 'is_read_compacted')
-        _check_type_or_none(dict, properties, 'properties')
-
-        conf = _pulsar.ConsumerConfiguration()
-        conf.consumer_type(consumer_type)
-        conf.read_compacted(is_read_compacted)
-        if message_listener:
-            conf.message_listener(message_listener)
-        conf.receiver_queue_size(receiver_queue_size)
-        conf.max_total_receiver_queue_size_across_partitions(max_total_receiver_queue_size_across_partitions)
-        if consumer_name:
-            conf.consumer_name(consumer_name)
-        if unacked_messages_timeout_ms:
-            conf.unacked_messages_timeout_ms(unacked_messages_timeout_ms)
-        conf.broker_consumer_stats_cache_time_ms(broker_consumer_stats_cache_time_ms)
-        if properties:
-            for k, v in properties.items():
-                conf.property(k, v)
-
-        c = Consumer()
-        c._consumer = self._client.subscribe(topic, subscription_name, conf)
-        c._client = self
-        self._consumers.append(c)
-        return c
-
-    def subscribe_topics(self, topics, subscription_name,
-                         consumer_type=ConsumerType.Exclusive,
-                         message_listener=None,
-                         receiver_queue_size=1000,
-                         max_total_receiver_queue_size_across_partitions=50000,
-                         consumer_name=None,
-                         unacked_messages_timeout_ms=None,
-                         broker_consumer_stats_cache_time_ms=30000,
-                         is_read_compacted=False,
-                         properties=None
-                         ):
-        """
-        Subscribe to the given topics and subscription combination.
-
-        **Args**
-
-        * `topics`: The list name of the topics.
+        * `topic`: The name of the topic, list of topics or regex pattern.
+                  This method will accept these forms:
+                    - `topic='my-topic'`
+                    - `topic=['topic-1', 'topic-2', 'topic-3']`
+                    - `topic=re.compile('topic-.*')`
         * `subscription`: The name of the subscription.
 
         **Options**
@@ -1743,111 +1649,9 @@ class Client:
         * `properties`:
           Sets the properties for the consumer. The properties associated with a consumer
           can be used for identify a consumer at broker side.
-        """
-        _check_type(list, topics, 'topics')
-        _check_type(str, subscription_name, 'subscription_name')
-        _check_type(ConsumerType, consumer_type, 'consumer_type')
-        _check_type(int, receiver_queue_size, 'receiver_queue_size')
-        _check_type(int, max_total_receiver_queue_size_across_partitions,
-                    'max_total_receiver_queue_size_across_partitions')
-        _check_type_or_none(str, consumer_name, 'consumer_name')
-        _check_type_or_none(int, unacked_messages_timeout_ms, 'unacked_messages_timeout_ms')
-        _check_type(int, broker_consumer_stats_cache_time_ms, 'broker_consumer_stats_cache_time_ms')
-        _check_type(bool, is_read_compacted, 'is_read_compacted')
-        _check_type_or_none(dict, properties, 'properties')
-
-        conf = _pulsar.ConsumerConfiguration()
-        conf.consumer_type(consumer_type)
-        conf.read_compacted(is_read_compacted)
-        if message_listener:
-            conf.message_listener(message_listener)
-        conf.receiver_queue_size(receiver_queue_size)
-        conf.max_total_receiver_queue_size_across_partitions(max_total_receiver_queue_size_across_partitions)
-        if consumer_name:
-            conf.consumer_name(consumer_name)
-        if unacked_messages_timeout_ms:
-            conf.unacked_messages_timeout_ms(unacked_messages_timeout_ms)
-        conf.broker_consumer_stats_cache_time_ms(broker_consumer_stats_cache_time_ms)
-        if properties:
-            for k, v in properties.items():
-                conf.property(k, v)
-
-        c = Consumer()
-        c._consumer = self._client.subscribe_topics(topics, subscription_name, conf)
-        c._client = self
-        self._consumers.append(c)
-        return c
-
-    def subscribe_pattern(self, topics_pattern, subscription_name,
-                          consumer_type=ConsumerType.Exclusive,
-                          message_listener=None,
-                          receiver_queue_size=1000,
-                          max_total_receiver_queue_size_across_partitions=50000,
-                          consumer_name=None,
-                          unacked_messages_timeout_ms=None,
-                          broker_consumer_stats_cache_time_ms=30000,
-                          is_read_compacted=False,
-                          pattern_auto_discovery_period=60,
-                          properties=None
-                          ):
-        """
-        Subscribe to multiple topics, which match given regexPattern, under the same namespace.
-
-        **Args**
-
-        * `topics_pattern`: The regex pattern to match topics.
-        * `subscription`: The name of the subscription.
-
-        **Options**
-
-        * `consumer_type`:
-          Select the subscription type to be used when subscribing to the topic.
-        * `message_listener`:
-          Sets a message listener for the consumer. When the listener is set,
-          the application will receive messages through it. Calls to
-          `consumer.receive()` will not be allowed. The listener function needs
-          to accept (consumer, message), for example:
-
-                #!python
-                def my_listener(consumer, message):
-                    # process message
-                    consumer.acknowledge(message)
-
-        * `receiver_queue_size`:
-          Sets the size of the consumer receive queue. The consumer receive
-          queue controls how many messages can be accumulated by the consumer
-          before the application calls `receive()`. Using a higher value could
-          potentially increase the consumer throughput at the expense of higher
-          memory utilization. Setting the consumer queue size to zero decreases
-          the throughput of the consumer by disabling pre-fetching of messages.
-          This approach improves the message distribution on shared subscription
-          by pushing messages only to those consumers that are ready to process
-          them. Neither receive with timeout nor partitioned topics can be used
-          if the consumer queue size is zero. The `receive()` function call
-          should not be interrupted when the consumer queue size is zero. The
-          default value is 1000 messages and should work well for most use
-          cases.
-        * `max_total_receiver_queue_size_across_partitions`
-          Set the max total receiver queue size across partitions.
-          This setting will be used to reduce the receiver queue size for individual partitions
-        * `consumer_name`:
-          Sets the consumer name.
-        * `unacked_messages_timeout_ms`:
-          Sets the timeout in milliseconds for unacknowledged messages. The
-          timeout needs to be greater than 10 seconds. An exception is thrown if
-          the given value is less than 10 seconds. If a successful
-          acknowledgement is not sent within the timeout, all the unacknowledged
-          messages are redelivered.
-        * `broker_consumer_stats_cache_time_ms`:
-          Sets the time duration for which the broker-side consumer stats will
-          be cached in the client.
         * `pattern_auto_discovery_period`:
           Periods of seconds for consumer to auto discover match topics.
-        * `properties`:
-          Sets the properties for the consumer. The properties associated with a consumer
-          can be used for identify a consumer at broker side.
         """
-        _check_type(str, topics_pattern, 'topics_pattern')
         _check_type(str, subscription_name, 'subscription_name')
         _check_type(ConsumerType, consumer_type, 'consumer_type')
         _check_type(int, receiver_queue_size, 'receiver_queue_size')
@@ -1857,7 +1661,6 @@ class Client:
         _check_type_or_none(int, unacked_messages_timeout_ms, 'unacked_messages_timeout_ms')
         _check_type(int, broker_consumer_stats_cache_time_ms, 'broker_consumer_stats_cache_time_ms')
         _check_type(bool, is_read_compacted, 'is_read_compacted')
-        _check_type(int, pattern_auto_discovery_period, 'pattern_auto_discovery_period')
         _check_type_or_none(dict, properties, 'properties')
 
         conf = _pulsar.ConsumerConfiguration()
@@ -1872,13 +1675,23 @@ class Client:
         if unacked_messages_timeout_ms:
             conf.unacked_messages_timeout_ms(unacked_messages_timeout_ms)
         conf.broker_consumer_stats_cache_time_ms(broker_consumer_stats_cache_time_ms)
-        conf.pattern_auto_discovery_period(pattern_auto_discovery_period)
         if properties:
             for k, v in properties.items():
                 conf.property(k, v)
 
         c = Consumer()
-        c._consumer = self._client.subscribe_pattern(topics_pattern, subscription_name, conf)
+        if isinstance(topic, str):
+            # Single topic
+            c._consumer = self._client.subscribe(topic, subscription_name, conf)
+        elif isinstance(topic, list):
+            # List of topics
+            c._consumer = self._client.subscribe_topics(topic, subscription_name, conf)
+        elif isinstance(topic, _retype):
+            # Regex pattern
+            c._consumer = self._client.subscribe_pattern(topic.pattern, subscription_name, conf)
+        else:
+            raise ValueError("Argument 'topic' is expected to be of a type between (str, list, re.pattern)")
+
         c._client = self
         self._consumers.append(c)
         return c
@@ -2767,14 +2580,19 @@ producers and consumers.</p></div>
                   unacked_messages_timeout_ms=None,
                   broker_consumer_stats_cache_time_ms=30000,
                   is_read_compacted=False,
-                  properties=None
+                  properties=None,
+                  pattern_auto_discovery_period=60
                   ):
         """
         Subscribe to the given topic and subscription combination.
 
         **Args**
 
-        * `topic`: The name of the topic.
+        * `topic`: The name of the topic, list of topics or regex pattern.
+                  This method will accept these forms:
+                    - `topic='my-topic'`
+                    - `topic=['topic-1', 'topic-2', 'topic-3']`
+                    - `topic=re.compile('topic-.*')`
         * `subscription`: The name of the subscription.
 
         **Options**
@@ -2823,8 +2641,9 @@ producers and consumers.</p></div>
         * `properties`:
           Sets the properties for the consumer. The properties associated with a consumer
           can be used for identify a consumer at broker side.
+        * `pattern_auto_discovery_period`:
+          Periods of seconds for consumer to auto discover match topics.
         """
-        _check_type(str, topic, 'topic')
         _check_type(str, subscription_name, 'subscription_name')
         _check_type(ConsumerType, consumer_type, 'consumer_type')
         _check_type(int, receiver_queue_size, 'receiver_queue_size')
@@ -2853,255 +2672,61 @@ producers and consumers.</p></div>
                 conf.property(k, v)
 
         c = Consumer()
-        c._consumer = self._client.subscribe(topic, subscription_name, conf)
+        if isinstance(topic, str):
+            # Single topic
+            c._consumer = self._client.subscribe(topic, subscription_name, conf)
+        elif isinstance(topic, list):
+            # List of topics
+            c._consumer = self._client.subscribe_topics(topic, subscription_name, conf)
+        elif isinstance(topic, _retype):
+            # Regex pattern
+            c._consumer = self._client.subscribe_pattern(topic.pattern, subscription_name, conf)
+        else:
+            raise ValueError("Argument 'topic' is expected to be of a type between (str, list, re.pattern)")
+
         c._client = self
         self._consumers.append(c)
         return c
 
-    def subscribe_topics(self, topics, subscription_name,
-                         consumer_type=ConsumerType.Exclusive,
-                         message_listener=None,
-                         receiver_queue_size=1000,
-                         max_total_receiver_queue_size_across_partitions=50000,
-                         consumer_name=None,
-                         unacked_messages_timeout_ms=None,
-                         broker_consumer_stats_cache_time_ms=30000,
-                         is_read_compacted=False,
-                         properties=None
-                         ):
+    def create_reader(self, topic, start_message_id,
+                      reader_listener=None,
+                      receiver_queue_size=1000,
+                      reader_name=None,
+                      subscription_role_prefix=None
+                      ):
         """
-        Subscribe to the given topics and subscription combination.
+        Create a reader on a particular topic
 
         **Args**
 
-        * `topics`: The list name of the topics.
-        * `subscription`: The name of the subscription.
+        * `topic`: The name of the topic.
+        * `start_message_id`: The initial reader positioning is done by specifying a message id.
+           The options are:
+            * `MessageId.earliest`: Start reading from the earliest message available in the topic
+            * `MessageId.latest`: Start reading from the end topic, only getting messages published
+               after the reader was created
+            * `MessageId`: When passing a particular message id, the reader will position itself on
+               that specific position. The first message to be read will be the message next to the
+               specified messageId. Message id can be serialized into a string and deserialized
+               back into a `MessageId` object:
+
+                   # Serialize to string
+                   s = msg.message_id().serialize()
+
+                   # Deserialize from string
+                   msg_id = MessageId.deserialize(s)
 
         **Options**
 
-        * `consumer_type`:
-          Select the subscription type to be used when subscribing to the topic.
-        * `message_listener`:
-          Sets a message listener for the consumer. When the listener is set,
+        * `reader_listener`:
+          Sets a message listener for the reader. When the listener is set,
           the application will receive messages through it. Calls to
-          `consumer.receive()` will not be allowed. The listener function needs
-          to accept (consumer, message), for example:
+          `reader.read_next()` will not be allowed. The listener function needs
+          to accept (reader, message), for example:
 
-                #!python
-                def my_listener(consumer, message):
+                def my_listener(reader, message):
                     # process message
-                    consumer.acknowledge(message)
-
-        * `receiver_queue_size`:
-          Sets the size of the consumer receive queue. The consumer receive
-          queue controls how many messages can be accumulated by the consumer
-          before the application calls `receive()`. Using a higher value could
-          potentially increase the consumer throughput at the expense of higher
-          memory utilization. Setting the consumer queue size to zero decreases
-          the throughput of the consumer by disabling pre-fetching of messages.
-          This approach improves the message distribution on shared subscription
-          by pushing messages only to those consumers that are ready to process
-          them. Neither receive with timeout nor partitioned topics can be used
-          if the consumer queue size is zero. The `receive()` function call
-          should not be interrupted when the consumer queue size is zero. The
-          default value is 1000 messages and should work well for most use
-          cases.
-        * `max_total_receiver_queue_size_across_partitions`
-          Set the max total receiver queue size across partitions.
-          This setting will be used to reduce the receiver queue size for individual partitions
-        * `consumer_name`:
-          Sets the consumer name.
-        * `unacked_messages_timeout_ms`:
-          Sets the timeout in milliseconds for unacknowledged messages. The
-          timeout needs to be greater than 10 seconds. An exception is thrown if
-          the given value is less than 10 seconds. If a successful
-          acknowledgement is not sent within the timeout, all the unacknowledged
-          messages are redelivered.
-        * `broker_consumer_stats_cache_time_ms`:
-          Sets the time duration for which the broker-side consumer stats will
-          be cached in the client.
-        * `properties`:
-          Sets the properties for the consumer. The properties associated with a consumer
-          can be used for identify a consumer at broker side.
-        """
-        _check_type(list, topics, 'topics')
-        _check_type(str, subscription_name, 'subscription_name')
-        _check_type(ConsumerType, consumer_type, 'consumer_type')
-        _check_type(int, receiver_queue_size, 'receiver_queue_size')
-        _check_type(int, max_total_receiver_queue_size_across_partitions,
-                    'max_total_receiver_queue_size_across_partitions')
-        _check_type_or_none(str, consumer_name, 'consumer_name')
-        _check_type_or_none(int, unacked_messages_timeout_ms, 'unacked_messages_timeout_ms')
-        _check_type(int, broker_consumer_stats_cache_time_ms, 'broker_consumer_stats_cache_time_ms')
-        _check_type(bool, is_read_compacted, 'is_read_compacted')
-        _check_type_or_none(dict, properties, 'properties')
-
-        conf = _pulsar.ConsumerConfiguration()
-        conf.consumer_type(consumer_type)
-        conf.read_compacted(is_read_compacted)
-        if message_listener:
-            conf.message_listener(message_listener)
-        conf.receiver_queue_size(receiver_queue_size)
-        conf.max_total_receiver_queue_size_across_partitions(max_total_receiver_queue_size_across_partitions)
-        if consumer_name:
-            conf.consumer_name(consumer_name)
-        if unacked_messages_timeout_ms:
-            conf.unacked_messages_timeout_ms(unacked_messages_timeout_ms)
-        conf.broker_consumer_stats_cache_time_ms(broker_consumer_stats_cache_time_ms)
-        if properties:
-            for k, v in properties.items():
-                conf.property(k, v)
-
-        c = Consumer()
-        c._consumer = self._client.subscribe_topics(topics, subscription_name, conf)
-        c._client = self
-        self._consumers.append(c)
-        return c
-
-    def subscribe_pattern(self, topics_pattern, subscription_name,
-                          consumer_type=ConsumerType.Exclusive,
-                          message_listener=None,
-                          receiver_queue_size=1000,
-                          max_total_receiver_queue_size_across_partitions=50000,
-                          consumer_name=None,
-                          unacked_messages_timeout_ms=None,
-                          broker_consumer_stats_cache_time_ms=30000,
-                          is_read_compacted=False,
-                          pattern_auto_discovery_period=60,
-                          properties=None
-                          ):
-        """
-        Subscribe to multiple topics, which match given regexPattern, under the same namespace.
-
-        **Args**
-
-        * `topics_pattern`: The regex pattern to match topics.
-        * `subscription`: The name of the subscription.
-
-        **Options**
-
-        * `consumer_type`:
-          Select the subscription type to be used when subscribing to the topic.
-        * `message_listener`:
-          Sets a message listener for the consumer. When the listener is set,
-          the application will receive messages through it. Calls to
-          `consumer.receive()` will not be allowed. The listener function needs
-          to accept (consumer, message), for example:
-
-                #!python
-                def my_listener(consumer, message):
-                    # process message
-                    consumer.acknowledge(message)
-
-        * `receiver_queue_size`:
-          Sets the size of the consumer receive queue. The consumer receive
-          queue controls how many messages can be accumulated by the consumer
-          before the application calls `receive()`. Using a higher value could
-          potentially increase the consumer throughput at the expense of higher
-          memory utilization. Setting the consumer queue size to zero decreases
-          the throughput of the consumer by disabling pre-fetching of messages.
-          This approach improves the message distribution on shared subscription
-          by pushing messages only to those consumers that are ready to process
-          them. Neither receive with timeout nor partitioned topics can be used
-          if the consumer queue size is zero. The `receive()` function call
-          should not be interrupted when the consumer queue size is zero. The
-          default value is 1000 messages and should work well for most use
-          cases.
-        * `max_total_receiver_queue_size_across_partitions`
-          Set the max total receiver queue size across partitions.
-          This setting will be used to reduce the receiver queue size for individual partitions
-        * `consumer_name`:
-          Sets the consumer name.
-        * `unacked_messages_timeout_ms`:
-          Sets the timeout in milliseconds for unacknowledged messages. The
-          timeout needs to be greater than 10 seconds. An exception is thrown if
-          the given value is less than 10 seconds. If a successful
-          acknowledgement is not sent within the timeout, all the unacknowledged
-          messages are redelivered.
-        * `broker_consumer_stats_cache_time_ms`:
-          Sets the time duration for which the broker-side consumer stats will
-          be cached in the client.
-        * `pattern_auto_discovery_period`:
-          Periods of seconds for consumer to auto discover match topics.
-        * `properties`:
-          Sets the properties for the consumer. The properties associated with a consumer
-          can be used for identify a consumer at broker side.
-        """
-        _check_type(str, topics_pattern, 'topics_pattern')
-        _check_type(str, subscription_name, 'subscription_name')
-        _check_type(ConsumerType, consumer_type, 'consumer_type')
-        _check_type(int, receiver_queue_size, 'receiver_queue_size')
-        _check_type(int, max_total_receiver_queue_size_across_partitions,
-                    'max_total_receiver_queue_size_across_partitions')
-        _check_type_or_none(str, consumer_name, 'consumer_name')
-        _check_type_or_none(int, unacked_messages_timeout_ms, 'unacked_messages_timeout_ms')
-        _check_type(int, broker_consumer_stats_cache_time_ms, 'broker_consumer_stats_cache_time_ms')
-        _check_type(bool, is_read_compacted, 'is_read_compacted')
-        _check_type(int, pattern_auto_discovery_period, 'pattern_auto_discovery_period')
-        _check_type_or_none(dict, properties, 'properties')
-
-        conf = _pulsar.ConsumerConfiguration()
-        conf.consumer_type(consumer_type)
-        conf.read_compacted(is_read_compacted)
-        if message_listener:
-            conf.message_listener(message_listener)
-        conf.receiver_queue_size(receiver_queue_size)
-        conf.max_total_receiver_queue_size_across_partitions(max_total_receiver_queue_size_across_partitions)
-        if consumer_name:
-            conf.consumer_name(consumer_name)
-        if unacked_messages_timeout_ms:
-            conf.unacked_messages_timeout_ms(unacked_messages_timeout_ms)
-        conf.broker_consumer_stats_cache_time_ms(broker_consumer_stats_cache_time_ms)
-        conf.pattern_auto_discovery_period(pattern_auto_discovery_period)
-        if properties:
-            for k, v in properties.items():
-                conf.property(k, v)
-
-        c = Consumer()
-        c._consumer = self._client.subscribe_pattern(topics_pattern, subscription_name, conf)
-        c._client = self
-        self._consumers.append(c)
-        return c
-
-    def create_reader(self, topic, start_message_id,
-                      reader_listener=None,
-                      receiver_queue_size=1000,
-                      reader_name=None,
-                      subscription_role_prefix=None
-                      ):
-        """
-        Create a reader on a particular topic
-
-        **Args**
-
-        * `topic`: The name of the topic.
-        * `start_message_id`: The initial reader positioning is done by specifying a message id.
-           The options are:
-            * `MessageId.earliest`: Start reading from the earliest message available in the topic
-            * `MessageId.latest`: Start reading from the end topic, only getting messages published
-               after the reader was created
-            * `MessageId`: When passing a particular message id, the reader will position itself on
-               that specific position. The first message to be read will be the message next to the
-               specified messageId. Message id can be serialized into a string and deserialized
-               back into a `MessageId` object:
-
-                   # Serialize to string
-                   s = msg.message_id().serialize()
-
-                   # Deserialize from string
-                   msg_id = MessageId.deserialize(s)
-
-        **Options**
-
-        * `reader_listener`:
-          Sets a message listener for the reader. When the listener is set,
-          the application will receive messages through it. Calls to
-          `reader.read_next()` will not be allowed. The listener function needs
-          to accept (reader, message), for example:
-
-                def my_listener(reader, message):
-                    # process message
-                    pass
+                    pass
 
         * `receiver_queue_size`:
           Sets the size of the reader receive queue. The reader receive
@@ -3571,7 +3196,7 @@ producers and consumers.</p></div>
             
   <div class="item">
     <div class="name def" id="pulsar.Client.subscribe">
-    <p>def <span class="ident">subscribe</span>(</p><p>self, topic, subscription_name, consumer_type=_pulsar.ConsumerType.Exclusive, message_listener=None, receiver_queue_size=1000, max_total_receiver_queue_size_across_partitions=50000, consumer_name=None, unacked_messages_timeout_ms=None, broker_consumer_stats_cache_time_ms=30000, is_read_compacted=False, properties=None)</p>
+    <p>def <span class="ident">subscribe</span>(</p><p>self, topic, subscription_name, consumer_type=_pulsar.ConsumerType.Exclusive, message_listener=None, receiver_queue_size=1000, max_total_receiver_queue_size_across_partitions=50000, consumer_name=None, unacked_messages_timeout_ms=None, broker_consumer_stats_cache_time_ms=30000, is_read_compacted=False, properties=None, pattern_auto_discovery_period=60)</p>
     </div>
     
 
@@ -3580,7 +3205,11 @@ producers and consumers.</p></div>
     <div class="desc"><p>Subscribe to the given topic and subscription combination.</p>
 <p><strong>Args</strong></p>
 <ul>
-<li><code>topic</code>: The name of the topic.</li>
+<li><code>topic</code>: The name of the topic, list of topics or regex pattern.
+          This method will accept these forms:
+            - <code>topic='my-topic'</code>
+            - <code>topic=['topic-1', 'topic-2', 'topic-3']</code>
+            - <code>topic=re.compile('topic-.*')</code></li>
 <li><code>subscription</code>: The name of the subscription.</li>
 </ul>
 <p><strong>Options</strong></p>
@@ -3632,6 +3261,8 @@ def my_listener(consumer, message):
 <li><code>properties</code>:
   Sets the properties for the consumer. The properties associated with a consumer
   can be used for identify a consumer at broker side.</li>
+<li><code>pattern_auto_discovery_period</code>:
+  Periods of seconds for consumer to auto discover match topics.</li>
 </ul></div>
   <div class="source_cont">
   <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-pulsar.Client.subscribe', this);">Show source &equiv;</a></p>
@@ -3645,12 +3276,17 @@ def my_listener(consumer, message):
               unacked_messages_timeout_ms=None,
               broker_consumer_stats_cache_time_ms=30000,
               is_read_compacted=False,
-              properties=None
+              properties=None,
+              pattern_auto_discovery_period=60
               ):
     """
     Subscribe to the given topic and subscription combination.
     **Args**
-    * `topic`: The name of the topic.
+    * `topic`: The name of the topic, list of topics or regex pattern.
+              This method will accept these forms:
+                - `topic='my-topic'`
+                - `topic=['topic-1', 'topic-2', 'topic-3']`
+                - `topic=re.compile('topic-.*')`
     * `subscription`: The name of the subscription.
     **Options**
     * `consumer_type`:
@@ -3695,178 +3331,9 @@ def my_listener(consumer, message):
     * `properties`:
       Sets the properties for the consumer. The properties associated with a consumer
       can be used for identify a consumer at broker side.
-    """
-    _check_type(str, topic, 'topic')
-    _check_type(str, subscription_name, 'subscription_name')
-    _check_type(ConsumerType, consumer_type, 'consumer_type')
-    _check_type(int, receiver_queue_size, 'receiver_queue_size')
-    _check_type(int, max_total_receiver_queue_size_across_partitions,
-                'max_total_receiver_queue_size_across_partitions')
-    _check_type_or_none(str, consumer_name, 'consumer_name')
-    _check_type_or_none(int, unacked_messages_timeout_ms, 'unacked_messages_timeout_ms')
-    _check_type(int, broker_consumer_stats_cache_time_ms, 'broker_consumer_stats_cache_time_ms')
-    _check_type(bool, is_read_compacted, 'is_read_compacted')
-    _check_type_or_none(dict, properties, 'properties')
-    conf = _pulsar.ConsumerConfiguration()
-    conf.consumer_type(consumer_type)
-    conf.read_compacted(is_read_compacted)
-    if message_listener:
-        conf.message_listener(message_listener)
-    conf.receiver_queue_size(receiver_queue_size)
-    conf.max_total_receiver_queue_size_across_partitions(max_total_receiver_queue_size_across_partitions)
-    if consumer_name:
-        conf.consumer_name(consumer_name)
-    if unacked_messages_timeout_ms:
-        conf.unacked_messages_timeout_ms(unacked_messages_timeout_ms)
-    conf.broker_consumer_stats_cache_time_ms(broker_consumer_stats_cache_time_ms)
-    if properties:
-        for k, v in properties.items():
-            conf.property(k, v)
-    c = Consumer()
-    c._consumer = self._client.subscribe(topic, subscription_name, conf)
-    c._client = self
-    self._consumers.append(c)
-    return c
-</code></pre>
-  </div>
-</div>
-
-  </div>
-  
-            
-  <div class="item">
-    <div class="name def" id="pulsar.Client.subscribe_pattern">
-    <p>def <span class="ident">subscribe_pattern</span>(</p><p>self, topics_pattern, subscription_name, consumer_type=_pulsar.ConsumerType.Exclusive, message_listener=None, receiver_queue_size=1000, max_total_receiver_queue_size_across_partitions=50000, consumer_name=None, unacked_messages_timeout_ms=None, broker_consumer_stats_cache_time_ms=30000, is_read_compacted=False, pattern_auto_discovery_period=60, properties=None)</p>
-    </div>
-    
-
-    
-  
-    <div class="desc"><p>Subscribe to multiple topics, which match given regexPattern, under the same namespace.</p>
-<p><strong>Args</strong></p>
-<ul>
-<li><code>topics_pattern</code>: The regex pattern to match topics.</li>
-<li><code>subscription</code>: The name of the subscription.</li>
-</ul>
-<p><strong>Options</strong></p>
-<ul>
-<li><code>consumer_type</code>:
-  Select the subscription type to be used when subscribing to the topic.</li>
-<li>
-<p><code>message_listener</code>:
-  Sets a message listener for the consumer. When the listener is set,
-  the application will receive messages through it. Calls to
-  <code>consumer.receive()</code> will not be allowed. The listener function needs
-  to accept (consumer, message), for example:</p>
-<pre><code>#!python
-def my_listener(consumer, message):
-    # process message
-    consumer.acknowledge(message)
-</code></pre>
-</li>
-<li>
-<p><code>receiver_queue_size</code>:
-  Sets the size of the consumer receive queue. The consumer receive
-  queue controls how many messages can be accumulated by the consumer
-  before the application calls <code>receive()</code>. Using a higher value could
-  potentially increase the consumer throughput at the expense of higher
-  memory utilization. Setting the consumer queue size to zero decreases
-  the throughput of the consumer by disabling pre-fetching of messages.
-  This approach improves the message distribution on shared subscription
-  by pushing messages only to those consumers that are ready to process
-  them. Neither receive with timeout nor partitioned topics can be used
-  if the consumer queue size is zero. The <code>receive()</code> function call
-  should not be interrupted when the consumer queue size is zero. The
-  default value is 1000 messages and should work well for most use
-  cases.</p>
-</li>
-<li><code>max_total_receiver_queue_size_across_partitions</code>
-  Set the max total receiver queue size across partitions.
-  This setting will be used to reduce the receiver queue size for individual partitions</li>
-<li><code>consumer_name</code>:
-  Sets the consumer name.</li>
-<li><code>unacked_messages_timeout_ms</code>:
-  Sets the timeout in milliseconds for unacknowledged messages. The
-  timeout needs to be greater than 10 seconds. An exception is thrown if
-  the given value is less than 10 seconds. If a successful
-  acknowledgement is not sent within the timeout, all the unacknowledged
-  messages are redelivered.</li>
-<li><code>broker_consumer_stats_cache_time_ms</code>:
-  Sets the time duration for which the broker-side consumer stats will
-  be cached in the client.</li>
-<li><code>pattern_auto_discovery_period</code>:
-  Periods of seconds for consumer to auto discover match topics.</li>
-<li><code>properties</code>:
-  Sets the properties for the consumer. The properties associated with a consumer
-  can be used for identify a consumer at broker side.</li>
-</ul></div>
-  <div class="source_cont">
-  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-pulsar.Client.subscribe_pattern', this);">Show source &equiv;</a></p>
-  <div id="source-pulsar.Client.subscribe_pattern" class="source">
-    <pre><code>def subscribe_pattern(self, topics_pattern, subscription_name,
-                      consumer_type=ConsumerType.Exclusive,
-                      message_listener=None,
-                      receiver_queue_size=1000,
-                      max_total_receiver_queue_size_across_partitions=50000,
-                      consumer_name=None,
-                      unacked_messages_timeout_ms=None,
-                      broker_consumer_stats_cache_time_ms=30000,
-                      is_read_compacted=False,
-                      pattern_auto_discovery_period=60,
-                      properties=None
-                      ):
-    """
-    Subscribe to multiple topics, which match given regexPattern, under the same namespace.
-    **Args**
-    * `topics_pattern`: The regex pattern to match topics.
-    * `subscription`: The name of the subscription.
-    **Options**
-    * `consumer_type`:
-      Select the subscription type to be used when subscribing to the topic.
-    * `message_listener`:
-      Sets a message listener for the consumer. When the listener is set,
-      the application will receive messages through it. Calls to
-      `consumer.receive()` will not be allowed. The listener function needs
-      to accept (consumer, message), for example:
-            #!python
-            def my_listener(consumer, message):
-                # process message
-                consumer.acknowledge(message)
-    * `receiver_queue_size`:
-      Sets the size of the consumer receive queue. The consumer receive
-      queue controls how many messages can be accumulated by the consumer
-      before the application calls `receive()`. Using a higher value could
-      potentially increase the consumer throughput at the expense of higher
-      memory utilization. Setting the consumer queue size to zero decreases
-      the throughput of the consumer by disabling pre-fetching of messages.
-      This approach improves the message distribution on shared subscription
-      by pushing messages only to those consumers that are ready to process
-      them. Neither receive with timeout nor partitioned topics can be used
-      if the consumer queue size is zero. The `receive()` function call
-      should not be interrupted when the consumer queue size is zero. The
-      default value is 1000 messages and should work well for most use
-      cases.
-    * `max_total_receiver_queue_size_across_partitions`
-      Set the max total receiver queue size across partitions.
-      This setting will be used to reduce the receiver queue size for individual partitions
-    * `consumer_name`:
-      Sets the consumer name.
-    * `unacked_messages_timeout_ms`:
-      Sets the timeout in milliseconds for unacknowledged messages. The
-      timeout needs to be greater than 10 seconds. An exception is thrown if
-      the given value is less than 10 seconds. If a successful
-      acknowledgement is not sent within the timeout, all the unacknowledged
-      messages are redelivered.
-    * `broker_consumer_stats_cache_time_ms`:
-      Sets the time duration for which the broker-side consumer stats will
-      be cached in the client.
     * `pattern_auto_discovery_period`:
       Periods of seconds for consumer to auto discover match topics.
-    * `properties`:
-      Sets the properties for the consumer. The properties associated with a consumer
-      can be used for identify a consumer at broker side.
     """
-    _check_type(str, topics_pattern, 'topics_pattern')
     _check_type(str, subscription_name, 'subscription_name')
     _check_type(ConsumerType, consumer_type, 'consumer_type')
     _check_type(int, receiver_queue_size, 'receiver_queue_size')
@@ -3876,7 +3343,6 @@ def my_listener(consumer, message):
     _check_type_or_none(int, unacked_messages_timeout_ms, 'unacked_messages_timeout_ms')
     _check_type(int, broker_consumer_stats_cache_time_ms, 'broker_consumer_stats_cache_time_ms')
     _check_type(bool, is_read_compacted, 'is_read_compacted')
-    _check_type(int, pattern_auto_discovery_period, 'pattern_auto_discovery_period')
     _check_type_or_none(dict, properties, 'properties')
     conf = _pulsar.ConsumerConfiguration()
     conf.consumer_type(consumer_type)
@@ -3890,177 +3356,21 @@ def my_listener(consumer, message):
     if unacked_messages_timeout_ms:
         conf.unacked_messages_timeout_ms(unacked_messages_timeout_ms)
     conf.broker_consumer_stats_cache_time_ms(broker_consumer_stats_cache_time_ms)
-    conf.pattern_auto_discovery_period(pattern_auto_discovery_period)
     if properties:
         for k, v in properties.items():
             conf.property(k, v)
     c = Consumer()
-    c._consumer = self._client.subscribe_pattern(topics_pattern, subscription_name, conf)
-    c._client = self
-    self._consumers.append(c)
-    return c
-</code></pre>
-  </div>
-</div>
-
-  </div>
-  
-            
-  <div class="item">
-    <div class="name def" id="pulsar.Client.subscribe_topics">
-    <p>def <span class="ident">subscribe_topics</span>(</p><p>self, topics, subscription_name, consumer_type=_pulsar.ConsumerType.Exclusive, message_listener=None, receiver_queue_size=1000, max_total_receiver_queue_size_across_partitions=50000, consumer_name=None, unacked_messages_timeout_ms=None, broker_consumer_stats_cache_time_ms=30000, is_read_compacted=False, properties=None)</p>
-    </div>
-    
-
-    
-  
-    <div class="desc"><p>Subscribe to the given topics and subscription combination.</p>
-<p><strong>Args</strong></p>
-<ul>
-<li><code>topics</code>: The list name of the topics.</li>
-<li><code>subscription</code>: The name of the subscription.</li>
-</ul>
-<p><strong>Options</strong></p>
-<ul>
-<li><code>consumer_type</code>:
-  Select the subscription type to be used when subscribing to the topic.</li>
-<li>
-<p><code>message_listener</code>:
-  Sets a message listener for the consumer. When the listener is set,
-  the application will receive messages through it. Calls to
-  <code>consumer.receive()</code> will not be allowed. The listener function needs
-  to accept (consumer, message), for example:</p>
-<pre><code>#!python
-def my_listener(consumer, message):
-    # process message
-    consumer.acknowledge(message)
-</code></pre>
-</li>
-<li>
-<p><code>receiver_queue_size</code>:
-  Sets the size of the consumer receive queue. The consumer receive
-  queue controls how many messages can be accumulated by the consumer
-  before the application calls <code>receive()</code>. Using a higher value could
-  potentially increase the consumer throughput at the expense of higher
-  memory utilization. Setting the consumer queue size to zero decreases
-  the throughput of the consumer by disabling pre-fetching of messages.
-  This approach improves the message distribution on shared subscription
-  by pushing messages only to those consumers that are ready to process
-  them. Neither receive with timeout nor partitioned topics can be used
-  if the consumer queue size is zero. The <code>receive()</code> function call
-  should not be interrupted when the consumer queue size is zero. The
-  default value is 1000 messages and should work well for most use
-  cases.</p>
-</li>
-<li><code>max_total_receiver_queue_size_across_partitions</code>
-  Set the max total receiver queue size across partitions.
-  This setting will be used to reduce the receiver queue size for individual partitions</li>
-<li><code>consumer_name</code>:
-  Sets the consumer name.</li>
-<li><code>unacked_messages_timeout_ms</code>:
-  Sets the timeout in milliseconds for unacknowledged messages. The
-  timeout needs to be greater than 10 seconds. An exception is thrown if
-  the given value is less than 10 seconds. If a successful
-  acknowledgement is not sent within the timeout, all the unacknowledged
-  messages are redelivered.</li>
-<li><code>broker_consumer_stats_cache_time_ms</code>:
-  Sets the time duration for which the broker-side consumer stats will
-  be cached in the client.</li>
-<li><code>properties</code>:
-  Sets the properties for the consumer. The properties associated with a consumer
-  can be used for identify a consumer at broker side.</li>
-</ul></div>
-  <div class="source_cont">
-  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-pulsar.Client.subscribe_topics', this);">Show source &equiv;</a></p>
-  <div id="source-pulsar.Client.subscribe_topics" class="source">
-    <pre><code>def subscribe_topics(self, topics, subscription_name,
-                     consumer_type=ConsumerType.Exclusive,
-                     message_listener=None,
-                     receiver_queue_size=1000,
-                     max_total_receiver_queue_size_across_partitions=50000,
-                     consumer_name=None,
-                     unacked_messages_timeout_ms=None,
-                     broker_consumer_stats_cache_time_ms=30000,
-                     is_read_compacted=False,
-                     properties=None
-                     ):
-    """
-    Subscribe to the given topics and subscription combination.
-    **Args**
-    * `topics`: The list name of the topics.
-    * `subscription`: The name of the subscription.
-    **Options**
-    * `consumer_type`:
-      Select the subscription type to be used when subscribing to the topic.
-    * `message_listener`:
-      Sets a message listener for the consumer. When the listener is set,
-      the application will receive messages through it. Calls to
-      `consumer.receive()` will not be allowed. The listener function needs
-      to accept (consumer, message), for example:
-            #!python
-            def my_listener(consumer, message):
-                # process message
-                consumer.acknowledge(message)
-    * `receiver_queue_size`:
-      Sets the size of the consumer receive queue. The consumer receive
-      queue controls how many messages can be accumulated by the consumer
-      before the application calls `receive()`. Using a higher value could
-      potentially increase the consumer throughput at the expense of higher
-      memory utilization. Setting the consumer queue size to zero decreases
-      the throughput of the consumer by disabling pre-fetching of messages.
-      This approach improves the message distribution on shared subscription
-      by pushing messages only to those consumers that are ready to process
-      them. Neither receive with timeout nor partitioned topics can be used
-      if the consumer queue size is zero. The `receive()` function call
-      should not be interrupted when the consumer queue size is zero. The
-      default value is 1000 messages and should work well for most use
-      cases.
-    * `max_total_receiver_queue_size_across_partitions`
-      Set the max total receiver queue size across partitions.
-      This setting will be used to reduce the receiver queue size for individual partitions
-    * `consumer_name`:
-      Sets the consumer name.
-    * `unacked_messages_timeout_ms`:
-      Sets the timeout in milliseconds for unacknowledged messages. The
-      timeout needs to be greater than 10 seconds. An exception is thrown if
-      the given value is less than 10 seconds. If a successful
-      acknowledgement is not sent within the timeout, all the unacknowledged
-      messages are redelivered.
-    * `broker_consumer_stats_cache_time_ms`:
-      Sets the time duration for which the broker-side consumer stats will
-      be cached in the client.
-    * `properties`:
-      Sets the properties for the consumer. The properties associated with a consumer
-      can be used for identify a consumer at broker side.
-    """
-    _check_type(list, topics, 'topics')
-    _check_type(str, subscription_name, 'subscription_name')
-    _check_type(ConsumerType, consumer_type, 'consumer_type')
-    _check_type(int, receiver_queue_size, 'receiver_queue_size')
-    _check_type(int, max_total_receiver_queue_size_across_partitions,
-                'max_total_receiver_queue_size_across_partitions')
-    _check_type_or_none(str, consumer_name, 'consumer_name')
-    _check_type_or_none(int, unacked_messages_timeout_ms, 'unacked_messages_timeout_ms')
-    _check_type(int, broker_consumer_stats_cache_time_ms, 'broker_consumer_stats_cache_time_ms')
-    _check_type(bool, is_read_compacted, 'is_read_compacted')
-    _check_type_or_none(dict, properties, 'properties')
-    conf = _pulsar.ConsumerConfiguration()
-    conf.consumer_type(consumer_type)
-    conf.read_compacted(is_read_compacted)
-    if message_listener:
-        conf.message_listener(message_listener)
-    conf.receiver_queue_size(receiver_queue_size)
-    conf.max_total_receiver_queue_size_across_partitions(max_total_receiver_queue_size_across_partitions)
-    if consumer_name:
-        conf.consumer_name(consumer_name)
-    if unacked_messages_timeout_ms:
-        conf.unacked_messages_timeout_ms(unacked_messages_timeout_ms)
-    conf.broker_consumer_stats_cache_time_ms(broker_consumer_stats_cache_time_ms)
-    if properties:
-        for k, v in properties.items():
-            conf.property(k, v)
-    c = Consumer()
-    c._consumer = self._client.subscribe_topics(topics, subscription_name, conf)
+    if isinstance(topic, str):
+        # Single topic
+        c._consumer = self._client.subscribe(topic, subscription_name, conf)
+    elif isinstance(topic, list):
+        # List of topics
+        c._consumer = self._client.subscribe_topics(topic, subscription_name, conf)
+    elif isinstance(topic, _retype):
+        # Regex pattern
+        c._consumer = self._client.subscribe_pattern(topic.pattern, subscription_name, conf)
+    else:
+        raise ValueError("Argument 'topic' is expected to be of a type between (str, list, re.pattern)")
     c._client = self
     self._consumers.append(c)
     return c
diff --git a/content/docs/en/sql-getting-started.html b/content/docs/en/sql-getting-started.html
index 3f9d0ff..3e086d7 100644
--- a/content/docs/en/sql-getting-started.html
+++ b/content/docs/en/sql-getting-started.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Overview · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar.  "/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Pulsa [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Getting Started · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar.  "/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="en"/><meta property="og:title" content [...]
               (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
               (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
               m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/sql-getting- [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/sql-getting- [...]
 <h2><a class="anchor" aria-hidden="true" id="requirements"></a><a href="#requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <ol>
 <li><strong>Pulsar distribution</strong>
diff --git a/content/docs/en/sql-getting-started/index.html b/content/docs/en/sql-getting-started/index.html
index 3f9d0ff..3e086d7 100644
--- a/content/docs/en/sql-getting-started/index.html
+++ b/content/docs/en/sql-getting-started/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Overview · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar.  "/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Pulsa [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Getting Started · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar.  "/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="en"/><meta property="og:title" content [...]
               (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
               (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
               m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/sql-getting- [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/sql-getting- [...]
 <h2><a class="anchor" aria-hidden="true" id="requirements"></a><a href="#requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <ol>
 <li><strong>Pulsar distribution</strong>
diff --git a/content/docs/fr/sql-getting-started.html b/content/docs/fr/sql-getting-started.html
index 1446d60..f0058c5 100644
--- a/content/docs/fr/sql-getting-started.html
+++ b/content/docs/fr/sql-getting-started.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="fr"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Overview · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar."/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="fr"/><meta property="og:title" content="Pulsar  [...]
+<!DOCTYPE html><html lang="fr"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Getting Started · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar."/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="fr"/><meta property="og:title" content=" [...]
               (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
               (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
               m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/fr" target="_blank" rel="noreferrer  [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/fr" target="_blank" rel="noreferrer  [...]
 <h2><a class="anchor" aria-hidden="true" id="requirements"></a><a href="#requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <ol>
 <li><strong>Pulsar distribution</strong>
diff --git a/content/docs/fr/sql-getting-started/index.html b/content/docs/fr/sql-getting-started/index.html
index 1446d60..f0058c5 100644
--- a/content/docs/fr/sql-getting-started/index.html
+++ b/content/docs/fr/sql-getting-started/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="fr"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Overview · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar."/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="fr"/><meta property="og:title" content="Pulsar  [...]
+<!DOCTYPE html><html lang="fr"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Getting Started · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar."/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="fr"/><meta property="og:title" content=" [...]
               (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
               (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
               m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/fr" target="_blank" rel="noreferrer  [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/fr" target="_blank" rel="noreferrer  [...]
 <h2><a class="anchor" aria-hidden="true" id="requirements"></a><a href="#requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <ol>
 <li><strong>Pulsar distribution</strong>
diff --git a/content/docs/ja/sql-getting-started.html b/content/docs/ja/sql-getting-started.html
index 97a442a..0363f7e 100644
--- a/content/docs/ja/sql-getting-started.html
+++ b/content/docs/ja/sql-getting-started.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Overview · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar."/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="ja"/><meta property="og:title" content="Pulsar  [...]
+<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Getting Started · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar."/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="ja"/><meta property="og:title" content=" [...]
               (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
               (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
               m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/ja" target="_blank" rel="noreferrer  [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/ja" target="_blank" rel="noreferrer  [...]
 <h2><a class="anchor" aria-hidden="true" id="requirements"></a><a href="#requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <ol>
 <li><strong>Pulsar distribution</strong>
diff --git a/content/docs/ja/sql-getting-started/index.html b/content/docs/ja/sql-getting-started/index.html
index 97a442a..0363f7e 100644
--- a/content/docs/ja/sql-getting-started/index.html
+++ b/content/docs/ja/sql-getting-started/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Overview · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar."/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="ja"/><meta property="og:title" content="Pulsar  [...]
+<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Getting Started · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="It is super easy to start query data in Pulsar."/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="ja"/><meta property="og:title" content=" [...]
               (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
               (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
               m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/ja" target="_blank" rel="noreferrer  [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/ja" target="_blank" rel="noreferrer  [...]
 <h2><a class="anchor" aria-hidden="true" id="requirements"></a><a href="#requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <ol>
 <li><strong>Pulsar distribution</strong>
diff --git a/content/docs/latest/adaptors/PulsarSpark/index.html b/content/docs/latest/adaptors/PulsarSpark/index.html
index c00dd49..a30d928 100644
--- a/content/docs/latest/adaptors/PulsarSpark/index.html
+++ b/content/docs/latest/adaptors/PulsarSpark/index.html
@@ -1673,9 +1673,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/adaptors/PulsarStorm/index.html b/content/docs/latest/adaptors/PulsarStorm/index.html
index a100055..3059cf5 100644
--- a/content/docs/latest/adaptors/PulsarStorm/index.html
+++ b/content/docs/latest/adaptors/PulsarStorm/index.html
@@ -1427,9 +1427,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/admin-api/overview/index.html b/content/docs/latest/admin-api/overview/index.html
index 994ad01..80a6f28 100644
--- a/content/docs/latest/admin-api/overview/index.html
+++ b/content/docs/latest/admin-api/overview/index.html
@@ -1189,9 +1189,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
@@ -1439,9 +1439,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
@@ -1685,9 +1685,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
@@ -1941,9 +1941,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/clients/Java/index.html b/content/docs/latest/clients/Java/index.html
index 8ce7177..b938e5f 100644
--- a/content/docs/latest/clients/Java/index.html
+++ b/content/docs/latest/clients/Java/index.html
@@ -1437,9 +1437,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/cookbooks/PartitionedTopics/index.html b/content/docs/latest/cookbooks/PartitionedTopics/index.html
index 25ce2c6..c5c0499 100644
--- a/content/docs/latest/cookbooks/PartitionedTopics/index.html
+++ b/content/docs/latest/cookbooks/PartitionedTopics/index.html
@@ -1681,9 +1681,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/cookbooks/RetentionExpiry/index.html b/content/docs/latest/cookbooks/RetentionExpiry/index.html
index 0a51438..763a81c 100644
--- a/content/docs/latest/cookbooks/RetentionExpiry/index.html
+++ b/content/docs/latest/cookbooks/RetentionExpiry/index.html
@@ -1189,9 +1189,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/cookbooks/compaction/index.html b/content/docs/latest/cookbooks/compaction/index.html
index fd7475c..e0c2266 100644
--- a/content/docs/latest/cookbooks/compaction/index.html
+++ b/content/docs/latest/cookbooks/compaction/index.html
@@ -1189,9 +1189,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/cookbooks/message-deduplication/index.html b/content/docs/latest/cookbooks/message-deduplication/index.html
index 03df0bf..7767ce8 100644
--- a/content/docs/latest/cookbooks/message-deduplication/index.html
+++ b/content/docs/latest/cookbooks/message-deduplication/index.html
@@ -1189,9 +1189,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/cookbooks/message-queue/index.html b/content/docs/latest/cookbooks/message-queue/index.html
index 3655ec9..32e4e8f 100644
--- a/content/docs/latest/cookbooks/message-queue/index.html
+++ b/content/docs/latest/cookbooks/message-queue/index.html
@@ -1437,9 +1437,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/cookbooks/tiered-storage/index.html b/content/docs/latest/cookbooks/tiered-storage/index.html
index 92718d6..d2419ee 100644
--- a/content/docs/latest/cookbooks/tiered-storage/index.html
+++ b/content/docs/latest/cookbooks/tiered-storage/index.html
@@ -1189,9 +1189,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/deployment/aws-cluster/index.html b/content/docs/latest/deployment/aws-cluster/index.html
index 31cfc51..47a5a53 100644
--- a/content/docs/latest/deployment/aws-cluster/index.html
+++ b/content/docs/latest/deployment/aws-cluster/index.html
@@ -1189,9 +1189,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/deployment/cluster/index.html b/content/docs/latest/deployment/cluster/index.html
index 0a12601..3113ea1 100644
--- a/content/docs/latest/deployment/cluster/index.html
+++ b/content/docs/latest/deployment/cluster/index.html
@@ -1189,9 +1189,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/deployment/instance/index.html b/content/docs/latest/deployment/instance/index.html
index e4d8219..9a49d19 100644
--- a/content/docs/latest/deployment/instance/index.html
+++ b/content/docs/latest/deployment/instance/index.html
@@ -1189,9 +1189,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/reference/CliTools/index.html b/content/docs/latest/reference/CliTools/index.html
index cc20bbd..1f6ea9f 100644
--- a/content/docs/latest/reference/CliTools/index.html
+++ b/content/docs/latest/reference/CliTools/index.html
@@ -1189,9 +1189,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
@@ -1439,9 +1439,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/latest/security/authorization/index.html b/content/docs/latest/security/authorization/index.html
index 755417d..538bda7 100644
--- a/content/docs/latest/security/authorization/index.html
+++ b/content/docs/latest/security/authorization/index.html
@@ -1189,9 +1189,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
@@ -2435,9 +2435,9 @@
           
           
           
-          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
+          <li><a href="/docs/latest/admin-api/overview/">The Pulsar admin interface</a></li>
           
           
           
diff --git a/content/docs/zh-CN/sql-getting-started.html b/content/docs/zh-CN/sql-getting-started.html
index 060e352..5b9fcbb 100644
--- a/content/docs/zh-CN/sql-getting-started.html
+++ b/content/docs/zh-CN/sql-getting-started.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar概述 · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="在Pulsar中查询数据非常容易。"/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="zh-CN"/><meta property="og:title" content="Pulsar概述 · Apache Pulsar"/><meta property= [...]
+<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Getting Started · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="在Pulsar中查询数据非常容易。"/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="zh-CN"/><meta property="og:title" content="Pulsar SQL Getting Start [...]
               (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
               (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
               m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/zh-CN" target="_blank" rel="noreferr [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/zh-CN" target="_blank" rel="noreferr [...]
 <h2><a class="anchor" aria-hidden="true" id="requirements"></a><a href="#requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <ol>
 <li><strong>Pulsar distribution</strong>
diff --git a/content/docs/zh-CN/sql-getting-started/index.html b/content/docs/zh-CN/sql-getting-started/index.html
index 060e352..5b9fcbb 100644
--- a/content/docs/zh-CN/sql-getting-started/index.html
+++ b/content/docs/zh-CN/sql-getting-started/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar概述 · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="在Pulsar中查询数据非常容易。"/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="zh-CN"/><meta property="og:title" content="Pulsar概述 · Apache Pulsar"/><meta property= [...]
+<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar SQL Getting Started · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="在Pulsar中查询数据非常容易。"/><meta name="docsearch:version" content="2.1.1-incubating"/><meta name="docsearch:language" content="zh-CN"/><meta property="og:title" content="Pulsar SQL Getting Start [...]
               (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
               (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
               m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/zh-CN" target="_blank" rel="noreferr [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docMainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/zh-CN" target="_blank" rel="noreferr [...]
 <h2><a class="anchor" aria-hidden="true" id="requirements"></a><a href="#requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <ol>
 <li><strong>Pulsar distribution</strong>
diff --git a/content/swagger/swagger.json b/content/swagger/swagger.json
index b540d16..11c4f75 100644
--- a/content/swagger/swagger.json
+++ b/content/swagger/swagger.json
@@ -6367,10 +6367,10 @@
             "type" : "string"
           }
         },
-        "connectedSince" : {
+        "clientVersion" : {
           "type" : "string"
         },
-        "clientVersion" : {
+        "connectedSince" : {
           "type" : "string"
         },
         "address" : {
@@ -6690,11 +6690,7 @@
           "type" : "number",
           "format" : "double"
         },
-        "lastUpdate" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "bandwidthIn" : {
+        "memory" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
         "msgThroughputIn" : {
@@ -6705,13 +6701,20 @@
           "type" : "number",
           "format" : "double"
         },
-        "directMemory" : {
+        "bandwidthOut" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
-        "bandwidthOut" : {
+        "lastUpdate" : {
+          "type" : "integer",
+          "format" : "int64"
+        },
+        "cpu" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
-        "memory" : {
+        "directMemory" : {
+          "$ref" : "#/definitions/ResourceUsage"
+        },
+        "bandwidthIn" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
         "underLoaded" : {
@@ -6722,9 +6725,6 @@
         },
         "loadReportType" : {
           "type" : "string"
-        },
-        "cpu" : {
-          "$ref" : "#/definitions/ResourceUsage"
         }
       }
     },
@@ -6884,13 +6884,13 @@
           "type" : "number",
           "format" : "double"
         },
-        "connectedSince" : {
+        "clientVersion" : {
           "type" : "string"
         },
         "producerName" : {
           "type" : "string"
         },
-        "clientVersion" : {
+        "connectedSince" : {
           "type" : "string"
         },
         "address" : {
@@ -7588,13 +7588,13 @@
             "type" : "string"
           }
         },
-        "connectedSince" : {
+        "clientVersion" : {
           "type" : "string"
         },
         "producerName" : {
           "type" : "string"
         },
-        "clientVersion" : {
+        "connectedSince" : {
           "type" : "string"
         },
         "address" : {