pulsar-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mme...@apache.org
Subject [pulsar] branch asf-site updated: Updated site at revision ae23906
Date Tue, 12 Feb 2019 08:51:15 GMT
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/pulsar.git


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

commit 0b00aeef6fb93527dcf8bc9ecc0e0ddb4af8698e
Author: jenkins <builds@apache.org>
AuthorDate: Tue Feb 12 08:51:07 2019 +0000

    Updated site at revision ae23906
---
 content/docs/en/next/client-libraries-python.html  | 129 ++++++++++++++++++++-
 .../en/next/client-libraries-python/index.html     | 129 ++++++++++++++++++++-
 content/docs/en/next/reference-configuration.html  |   3 +-
 .../en/next/reference-configuration/index.html     |   3 +-
 content/docs/fr/next/client-libraries-python.html  | 113 +++++++++++++++++-
 .../fr/next/client-libraries-python/index.html     | 113 +++++++++++++++++-
 content/docs/fr/next/reference-configuration.html  |   3 +-
 .../fr/next/reference-configuration/index.html     |   3 +-
 content/docs/ja/next/client-libraries-python.html  | 113 +++++++++++++++++-
 .../ja/next/client-libraries-python/index.html     | 113 +++++++++++++++++-
 content/docs/ja/next/reference-configuration.html  |   3 +-
 .../ja/next/reference-configuration/index.html     |   3 +-
 .../docs/zh-CN/next/client-libraries-python.html   | 113 +++++++++++++++++-
 .../zh-CN/next/client-libraries-python/index.html  | 113 +++++++++++++++++-
 .../docs/zh-CN/next/reference-configuration.html   |   3 +-
 .../zh-CN/next/reference-configuration/index.html  |   3 +-
 content/swagger/swagger.json                       |  44 +++----
 17 files changed, 950 insertions(+), 54 deletions(-)

diff --git a/content/docs/en/next/client-libraries-python.html b/content/docs/en/next/client-libraries-python.html
index a9d1ab3..aef4725 100644
--- a/content/docs/en/next/client-libraries-python.html
+++ b/content/docs/en/next/client-libraries-python.html
@@ -83,8 +83,8 @@
 <tr><th style="text-align:left">Platform</th><th style="text-align:left">Supported Python versions</th></tr>
 </thead>
 <tbody>
-<tr><td style="text-align:left">MacOS <br /> 10.11 (El Capitan) — 10.12 (Sierra) — 10.13 (High Sierra)</td><td style="text-align:left">2.7, 3.7</td></tr>
-<tr><td style="text-align:left">Linux</td><td style="text-align:left">2.7, 3.3, 3.4, 3.5, 3.6, 3.7</td></tr>
+<tr><td style="text-align:left">MacOS <br /> 10.11 (El Capitan) — 10.12 (Sierra) — <br /> 10.13 (High Sierra) — 10.14 (Mojave)</td><td style="text-align:left">2.7, 3.7</td></tr>
+<tr><td style="text-align:left">Linux</td><td style="text-align:left">2.7, 3.4, 3.5, 3.6, 3.7</td></tr>
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="installing-from-source"></a><a href="#installing-from-source" 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 [...]
@@ -134,7 +134,130 @@ reader = client.create_reader(<span class="hljs-string">'my-topic'</span>, msg_i
     print(<span class="hljs-string">"Received message '{}' id='{}'"</span>.format(msg.data(), msg.message_id()))
     <span class="hljs-comment"># No acknowledgment</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/en/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#installation">Installation</a><ul class="toc-headings"><li><a href="#installation-using-pip">Installation usin [...]
+<h2><a class="anchor" aria-hidden="true" id="schema"></a><a href="#schema" 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.42-1.64 1-2. [...]
+<h3><a class="anchor" aria-hidden="true" id="declaring-and-validating-schema"></a><a href="#declaring-and-validating-schema" 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 [...]
+<p>A schema can be declared by passing a class that inherits
+from <code>pulsar.schema.Record</code> and defines the fields as
+class variables. For example:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> pulsar.schema <span class="hljs-keyword">import</span> *
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Boolean()
+</code></pre>
+<p>With this simple schema definition we can then create producers,
+consumers and readers instances that will be referring to that.</p>
+<pre><code class="hljs css language-python">producer = client.create_producer(
+                    topic=<span class="hljs-string">'my-topic'</span>,
+                    schema=AvroSchema(Example) )
+
+producer.send(Example(a=<span class="hljs-string">'Hello'</span>, b=<span class="hljs-number">1</span>))
+</code></pre>
+<p>When the producer is created, the Pulsar broker will validate that
+the existing topic schema is indeed of &quot;Avro&quot; type and that the
+format is compatible with the schema definition of the <code>Example</code>
+class.</p>
+<p>If there is a mismatch, the producer creation will raise an
+exception.</p>
+<p>Once a producer is created with a certain schema definition,
+it will only accept objects that are instances of the declared
+schema class.</p>
+<p>Similarly, for a consumer/reader, the consumer will return an
+object, instance of the schema record class, rather than the raw
+bytes:</p>
+<pre><code class="hljs css language-python">consumer = client.subscribe(
+                  topic=<span class="hljs-string">'my-topic'</span>,
+                  subscription_name=<span class="hljs-string">'my-subscription'</span>,
+                  schema=AvroSchema(Example) )
+
+<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
+    msg = consumer.receive()
+    ex = msg.value()
+    print(<span class="hljs-string">"Received message a={} b={} c={}"</span>.format(ex.a, ex.b, ex.c))
+    consumer.acknowledge(msg)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="supported-schema-types"></a><a href="#supported-schema-types" 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 [...]
+<p>There are different builtin schema types that can be used in Pulsar.
+All the definitions are in the <code>pulsar.schema</code> package.</p>
+<table>
+<thead>
+<tr><th>Schema</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BytesSchema</code></td><td>Get the raw payload as a <code>bytes</code> object. No serialization/deserialization are performed. This is the default schema mode</td></tr>
+<tr><td><code>StringSchema</code></td><td>Encode/decode payload as a UTF-8 string. Uses <code>str</code> objects</td></tr>
+<tr><td><code>JsonSchema</code></td><td>Require record definition. Serializes the record into standard JSON payload</td></tr>
+<tr><td><code>AvroSchema</code></td><td>Require record definition. Serializes in AVRO format</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="schema-definition-reference"></a><a href="#schema-definition-reference" 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 1 [...]
+<p>The schema definition is done through a class that inherits from
+<code>pulsar.schema.Record</code>.</p>
+<p>This class can have a number of fields which can be of either
+<code>pulsar.schema.Field</code> type or even another nested <code>Record</code>. All the
+fields are also specified in the <code>pulsar.schema</code> package. The fields
+are matching the AVRO fields types.</p>
+<table>
+<thead>
+<tr><th>Field Type</th><th>Python Type</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>Boolean</code></td><td><code>bool</code></td><td></td></tr>
+<tr><td><code>Integer</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Long</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Float</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Double</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Bytes</code></td><td><code>bytes</code></td><td></td></tr>
+<tr><td><code>String</code></td><td><code>str</code></td><td></td></tr>
+<tr><td><code>Array</code></td><td><code>list</code></td><td>Need to specify record type for items</td></tr>
+<tr><td><code>Map</code></td><td><code>dict</code></td><td>Key is always <code>String</code>. Need to specify value type</td></tr>
+</tbody>
+</table>
+<p>Additionally, any Python <code>Enum</code> type can be used as a valid field
+type</p>
+<h4><a class="anchor" aria-hidden="true" id="fields-parameters"></a><a href="#fields-parameters" 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- [...]
+<p>When adding a field these parameters can be used in the constructor:</p>
+<table>
+<thead>
+<tr><th>Argument</th><th>Default</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>default</code></td><td><code>None</code></td><td>Set a default value for the field. Eg: <code>a = Integer(default=5)</code></td></tr>
+<tr><td><code>required</code></td><td><code>False</code></td><td>Mark the field as &quot;required&quot;. This will set it in the schema accordingly.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="schema-definition-examples"></a><a href="#schema-definition-examples" 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 12H [...]
+<h5><a class="anchor" aria-hidden="true" id="simple-definition"></a><a href="#simple-definition" 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- [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Array(String())
+    i = Map(String())
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="using-enums"></a><a href="#using-enums" 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.42 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Color</span><span class="hljs-params">(Enum)</span>:</span>
+    red = <span class="hljs-number">1</span>
+    green = <span class="hljs-number">2</span>
+    blue = <span class="hljs-number">3</span>
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    name = String()
+    color = Color
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="complex-types"></a><a href="#complex-types" 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-.8 [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MySubRecord</span><span class="hljs-params">(Record)</span>:</span>
+    x = Integer()
+    y = Long()
+    z = String()
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    sub = MySubRecord()
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/en/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#installation">Installation</a><ul class="toc-headings"><li><a href="#installation-using-pip">Installation usin [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/next/client-libraries-python/index.html b/content/docs/en/next/client-libraries-python/index.html
index a9d1ab3..aef4725 100644
--- a/content/docs/en/next/client-libraries-python/index.html
+++ b/content/docs/en/next/client-libraries-python/index.html
@@ -83,8 +83,8 @@
 <tr><th style="text-align:left">Platform</th><th style="text-align:left">Supported Python versions</th></tr>
 </thead>
 <tbody>
-<tr><td style="text-align:left">MacOS <br /> 10.11 (El Capitan) — 10.12 (Sierra) — 10.13 (High Sierra)</td><td style="text-align:left">2.7, 3.7</td></tr>
-<tr><td style="text-align:left">Linux</td><td style="text-align:left">2.7, 3.3, 3.4, 3.5, 3.6, 3.7</td></tr>
+<tr><td style="text-align:left">MacOS <br /> 10.11 (El Capitan) — 10.12 (Sierra) — <br /> 10.13 (High Sierra) — 10.14 (Mojave)</td><td style="text-align:left">2.7, 3.7</td></tr>
+<tr><td style="text-align:left">Linux</td><td style="text-align:left">2.7, 3.4, 3.5, 3.6, 3.7</td></tr>
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="installing-from-source"></a><a href="#installing-from-source" 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 [...]
@@ -134,7 +134,130 @@ reader = client.create_reader(<span class="hljs-string">'my-topic'</span>, msg_i
     print(<span class="hljs-string">"Received message '{}' id='{}'"</span>.format(msg.data(), msg.message_id()))
     <span class="hljs-comment"># No acknowledgment</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/en/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#installation">Installation</a><ul class="toc-headings"><li><a href="#installation-using-pip">Installation usin [...]
+<h2><a class="anchor" aria-hidden="true" id="schema"></a><a href="#schema" 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.42-1.64 1-2. [...]
+<h3><a class="anchor" aria-hidden="true" id="declaring-and-validating-schema"></a><a href="#declaring-and-validating-schema" 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 [...]
+<p>A schema can be declared by passing a class that inherits
+from <code>pulsar.schema.Record</code> and defines the fields as
+class variables. For example:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> pulsar.schema <span class="hljs-keyword">import</span> *
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Boolean()
+</code></pre>
+<p>With this simple schema definition we can then create producers,
+consumers and readers instances that will be referring to that.</p>
+<pre><code class="hljs css language-python">producer = client.create_producer(
+                    topic=<span class="hljs-string">'my-topic'</span>,
+                    schema=AvroSchema(Example) )
+
+producer.send(Example(a=<span class="hljs-string">'Hello'</span>, b=<span class="hljs-number">1</span>))
+</code></pre>
+<p>When the producer is created, the Pulsar broker will validate that
+the existing topic schema is indeed of &quot;Avro&quot; type and that the
+format is compatible with the schema definition of the <code>Example</code>
+class.</p>
+<p>If there is a mismatch, the producer creation will raise an
+exception.</p>
+<p>Once a producer is created with a certain schema definition,
+it will only accept objects that are instances of the declared
+schema class.</p>
+<p>Similarly, for a consumer/reader, the consumer will return an
+object, instance of the schema record class, rather than the raw
+bytes:</p>
+<pre><code class="hljs css language-python">consumer = client.subscribe(
+                  topic=<span class="hljs-string">'my-topic'</span>,
+                  subscription_name=<span class="hljs-string">'my-subscription'</span>,
+                  schema=AvroSchema(Example) )
+
+<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
+    msg = consumer.receive()
+    ex = msg.value()
+    print(<span class="hljs-string">"Received message a={} b={} c={}"</span>.format(ex.a, ex.b, ex.c))
+    consumer.acknowledge(msg)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="supported-schema-types"></a><a href="#supported-schema-types" 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 [...]
+<p>There are different builtin schema types that can be used in Pulsar.
+All the definitions are in the <code>pulsar.schema</code> package.</p>
+<table>
+<thead>
+<tr><th>Schema</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BytesSchema</code></td><td>Get the raw payload as a <code>bytes</code> object. No serialization/deserialization are performed. This is the default schema mode</td></tr>
+<tr><td><code>StringSchema</code></td><td>Encode/decode payload as a UTF-8 string. Uses <code>str</code> objects</td></tr>
+<tr><td><code>JsonSchema</code></td><td>Require record definition. Serializes the record into standard JSON payload</td></tr>
+<tr><td><code>AvroSchema</code></td><td>Require record definition. Serializes in AVRO format</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="schema-definition-reference"></a><a href="#schema-definition-reference" 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 1 [...]
+<p>The schema definition is done through a class that inherits from
+<code>pulsar.schema.Record</code>.</p>
+<p>This class can have a number of fields which can be of either
+<code>pulsar.schema.Field</code> type or even another nested <code>Record</code>. All the
+fields are also specified in the <code>pulsar.schema</code> package. The fields
+are matching the AVRO fields types.</p>
+<table>
+<thead>
+<tr><th>Field Type</th><th>Python Type</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>Boolean</code></td><td><code>bool</code></td><td></td></tr>
+<tr><td><code>Integer</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Long</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Float</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Double</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Bytes</code></td><td><code>bytes</code></td><td></td></tr>
+<tr><td><code>String</code></td><td><code>str</code></td><td></td></tr>
+<tr><td><code>Array</code></td><td><code>list</code></td><td>Need to specify record type for items</td></tr>
+<tr><td><code>Map</code></td><td><code>dict</code></td><td>Key is always <code>String</code>. Need to specify value type</td></tr>
+</tbody>
+</table>
+<p>Additionally, any Python <code>Enum</code> type can be used as a valid field
+type</p>
+<h4><a class="anchor" aria-hidden="true" id="fields-parameters"></a><a href="#fields-parameters" 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- [...]
+<p>When adding a field these parameters can be used in the constructor:</p>
+<table>
+<thead>
+<tr><th>Argument</th><th>Default</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>default</code></td><td><code>None</code></td><td>Set a default value for the field. Eg: <code>a = Integer(default=5)</code></td></tr>
+<tr><td><code>required</code></td><td><code>False</code></td><td>Mark the field as &quot;required&quot;. This will set it in the schema accordingly.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="schema-definition-examples"></a><a href="#schema-definition-examples" 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 12H [...]
+<h5><a class="anchor" aria-hidden="true" id="simple-definition"></a><a href="#simple-definition" 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- [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Array(String())
+    i = Map(String())
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="using-enums"></a><a href="#using-enums" 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.42 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Color</span><span class="hljs-params">(Enum)</span>:</span>
+    red = <span class="hljs-number">1</span>
+    green = <span class="hljs-number">2</span>
+    blue = <span class="hljs-number">3</span>
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    name = String()
+    color = Color
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="complex-types"></a><a href="#complex-types" 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-.8 [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MySubRecord</span><span class="hljs-params">(Record)</span>:</span>
+    x = Integer()
+    y = Long()
+    z = String()
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    sub = MySubRecord()
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/en/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#installation">Installation</a><ul class="toc-headings"><li><a href="#installation-using-pip">Installation usin [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/next/reference-configuration.html b/content/docs/en/next/reference-configuration.html
index 67014d0..eba3f19 100644
--- a/content/docs/en/next/reference-configuration.html
+++ b/content/docs/en/next/reference-configuration.html
@@ -230,10 +230,11 @@
 <tr><td>bookkeeperClientRegionawarePolicyEnabled</td><td>Enable region-aware bookie selection policy. BK will chose bookies from different regions and racks when forming a new bookie ensemble. If enabled, the value of bookkeeperClientRackawarePolicyEnabled is ignored</td><td>false</td></tr>
 <tr><td>bookkeeperClientReorderReadSequenceEnabled</td><td>Enable/disable reordering read sequence on reading entries.</td><td>false</td></tr>
 <tr><td>bookkeeperClientIsolationGroups</td><td>Enable bookie isolation by specifying a list of bookie groups to choose from. Any bookie outside the specified groups will not be used by the broker</td><td></td></tr>
+<tr><td>bookkeeperEnableStickyReads</td><td>Enable/disable having read operations for a ledger to be sticky to a single bookie. If this flag is enabled, the client will use one single bookie (by preference) to read  all entries for a ledger.</td><td>true</td></tr>
 <tr><td>managedLedgerDefaultEnsembleSize</td><td>Number of bookies to use when creating a ledger</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultWriteQuorum</td><td>Number of copies to store for each message</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultAckQuorum</td><td>Number of guaranteed copies (acks to wait before write is complete)</td><td>2</td></tr>
-<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker</td><td>1024</td></tr>
+<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker. By default, uses 1/5th of available direct memory</td><td></td></tr>
 <tr><td>managedLedgerCacheEvictionWatermark</td><td>Threshold to which bring down the cache level when eviction is triggered</td><td>0.9</td></tr>
 <tr><td>managedLedgerDefaultMarkDeleteRateLimit</td><td>Rate limit the amount of writes per second generated by consumer acking the messages</td><td>1.0</td></tr>
 <tr><td>managedLedgerMaxEntriesPerLedger</td><td>Max number of entries to append to a ledger before triggering a rollover. A ledger rollover is triggered on these conditions: <ul><li>Either the max rollover time has been reached</li><li>or max entries have been written to the ledged and at least min-time has passed</li></ul></td><td>50000</td></tr>
diff --git a/content/docs/en/next/reference-configuration/index.html b/content/docs/en/next/reference-configuration/index.html
index 67014d0..eba3f19 100644
--- a/content/docs/en/next/reference-configuration/index.html
+++ b/content/docs/en/next/reference-configuration/index.html
@@ -230,10 +230,11 @@
 <tr><td>bookkeeperClientRegionawarePolicyEnabled</td><td>Enable region-aware bookie selection policy. BK will chose bookies from different regions and racks when forming a new bookie ensemble. If enabled, the value of bookkeeperClientRackawarePolicyEnabled is ignored</td><td>false</td></tr>
 <tr><td>bookkeeperClientReorderReadSequenceEnabled</td><td>Enable/disable reordering read sequence on reading entries.</td><td>false</td></tr>
 <tr><td>bookkeeperClientIsolationGroups</td><td>Enable bookie isolation by specifying a list of bookie groups to choose from. Any bookie outside the specified groups will not be used by the broker</td><td></td></tr>
+<tr><td>bookkeeperEnableStickyReads</td><td>Enable/disable having read operations for a ledger to be sticky to a single bookie. If this flag is enabled, the client will use one single bookie (by preference) to read  all entries for a ledger.</td><td>true</td></tr>
 <tr><td>managedLedgerDefaultEnsembleSize</td><td>Number of bookies to use when creating a ledger</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultWriteQuorum</td><td>Number of copies to store for each message</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultAckQuorum</td><td>Number of guaranteed copies (acks to wait before write is complete)</td><td>2</td></tr>
-<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker</td><td>1024</td></tr>
+<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker. By default, uses 1/5th of available direct memory</td><td></td></tr>
 <tr><td>managedLedgerCacheEvictionWatermark</td><td>Threshold to which bring down the cache level when eviction is triggered</td><td>0.9</td></tr>
 <tr><td>managedLedgerDefaultMarkDeleteRateLimit</td><td>Rate limit the amount of writes per second generated by consumer acking the messages</td><td>1.0</td></tr>
 <tr><td>managedLedgerMaxEntriesPerLedger</td><td>Max number of entries to append to a ledger before triggering a rollover. A ledger rollover is triggered on these conditions: <ul><li>Either the max rollover time has been reached</li><li>or max entries have been written to the ledged and at least min-time has passed</li></ul></td><td>50000</td></tr>
diff --git a/content/docs/fr/next/client-libraries-python.html b/content/docs/fr/next/client-libraries-python.html
index 2b445a1..d3a5778 100644
--- a/content/docs/fr/next/client-libraries-python.html
+++ b/content/docs/fr/next/client-libraries-python.html
@@ -84,10 +84,11 @@
 </thead>
 <tbody>
 <tr><td style="text-align:left">MacOS</td></tr>
-<tr><td style="text-align:left">10.11 (El Capitan) — 10.12 (Sierra) — 10.13 (High Sierra)</td><td style="text-align:left">2.7, 3.7</td></tr>
-<tr><td style="text-align:left">Linux</td><td style="text-align:left">2.7, 3.3, 3.4, 3.5, 3.6, 3.7</td></tr>
 </tbody>
 </table>
+<p>10.11 (El Capitan) — 10.12 (Sierra) —<br>
+10.13 (High Sierra) — 10.14 (Mojave) | 2.7, 3.7                               |
+| Linux                                                                                                    | 2.7, 3.4, 3.5, 3.6, 3.7                |</p>
 <h3><a class="anchor" aria-hidden="true" id="installation-a-partir-du-code-source"></a><a href="#installation-a-partir-du-code-source" 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 [...]
 <p>To install the <code>pulsar-client</code> library by building from source, follow <a href="/docs/fr/next/client-libraries-cpp#compilation">these instructions</a> and compile the Pulsar C++ client library. That will also build the Python binding for the library.</p>
 <p>To install the built Python bindings:</p>
@@ -135,7 +136,113 @@ reader = client.create_reader(<span class="hljs-string">'my-topic'</span>, msg_i
     print(<span class="hljs-string">"Received message '{}' id='{}'"</span>.format(msg.data(), msg.message_id()))
     <span class="hljs-comment"># No acknowledgment</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/fr/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/fr/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#installation">Installation</a><ul class="toc-headings"><li><a href="#installation-a-l-aide-de-pip">Installatio [...]
+<h2><a class="anchor" aria-hidden="true" id="schema"></a><a href="#schema" 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.42-1.64 1-2. [...]
+<h3><a class="anchor" aria-hidden="true" id="declaring-and-validating-schema"></a><a href="#declaring-and-validating-schema" 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 [...]
+<p>A schema can be declared by passing a class that inherits from <code>pulsar.schema.Record</code> and defines the fields as class variables. For example:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> pulsar.schema <span class="hljs-keyword">import</span> *
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Boolean()
+</code></pre>
+<p>With this simple schema definition we can then create producers, consumers and readers instances that will be referring to that.</p>
+<pre><code class="hljs css language-python">producer = client.create_producer(
+                    topic=<span class="hljs-string">'my-topic'</span>,
+                    schema=AvroSchema(Example) )
+
+producer.send(Example(a=<span class="hljs-string">'Hello'</span>, b=<span class="hljs-number">1</span>))
+</code></pre>
+<p>When the producer is created, the Pulsar broker will validate that the existing topic schema is indeed of &quot;Avro&quot; type and that the format is compatible with the schema definition of the <code>Example</code> class.</p>
+<p>If there is a mismatch, the producer creation will raise an exception.</p>
+<p>Once a producer is created with a certain schema definition, it will only accept objects that are instances of the declared schema class.</p>
+<p>Similarly, for a consumer/reader, the consumer will return an object, instance of the schema record class, rather than the raw bytes:</p>
+<pre><code class="hljs css language-python">consumer = client.subscribe(
+                  topic=<span class="hljs-string">'my-topic'</span>,
+                  subscription_name=<span class="hljs-string">'my-subscription'</span>,
+                  schema=AvroSchema(Example) )
+
+<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
+    msg = consumer.receive()
+    ex = msg.value()
+    print(<span class="hljs-string">"Received message a={} b={} c={}"</span>.format(ex.a, ex.b, ex.c))
+    consumer.acknowledge(msg)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="supported-schema-types"></a><a href="#supported-schema-types" 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 [...]
+<p>There are different builtin schema types that can be used in Pulsar. All the definitions are in the <code>pulsar.schema</code> package.</p>
+<table>
+<thead>
+<tr><th>Schema</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BytesSchema</code></td><td>Get the raw payload as a <code>bytes</code> object. No serialization/deserialization are performed. This is the default schema mode</td></tr>
+<tr><td><code>StringSchema</code></td><td>Encode/decode payload as a UTF-8 string. Uses <code>str</code> objects</td></tr>
+<tr><td><code>JsonSchema</code></td><td>Require record definition. Serializes the record into standard JSON payload</td></tr>
+<tr><td><code>AvroSchema</code></td><td>Require record definition. Serializes in AVRO format</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="schema-definition-reference"></a><a href="#schema-definition-reference" 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 1 [...]
+<p>The schema definition is done through a class that inherits from <code>pulsar.schema.Record</code>.</p>
+<p>This class can have a number of fields which can be of either <code>pulsar.schema.Field</code> type or even another nested <code>Record</code>. All the fields are also specified in the <code>pulsar.schema</code> package. The fields are matching the AVRO fields types.</p>
+<table>
+<thead>
+<tr><th>Field Type</th><th>Python Type</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>Boolean</code></td><td><code>bool</code></td><td></td></tr>
+<tr><td><code>Integer</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Long</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Float</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Double</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Bytes</code></td><td><code>bytes</code></td><td></td></tr>
+<tr><td><code>String</code></td><td><code>str</code></td><td></td></tr>
+<tr><td><code>Array</code></td><td><code>list</code></td><td>Need to specify record type for items</td></tr>
+<tr><td><code>Map</code></td><td><code>dict</code></td><td>Key is always <code>String</code>. Need to specify value type</td></tr>
+</tbody>
+</table>
+<p>Additionally, any Python <code>Enum</code> type can be used as a valid field type</p>
+<h4><a class="anchor" aria-hidden="true" id="fields-parameters"></a><a href="#fields-parameters" 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- [...]
+<p>When adding a field these parameters can be used in the constructor:</p>
+<table>
+<thead>
+<tr><th>Argument</th><th>Default</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>default</code></td><td><code>None</code></td><td>Set a default value for the field. Eg: <code>a = Integer(default=5)</code></td></tr>
+<tr><td><code>required</code></td><td><code>False</code></td><td>Mark the field as &quot;required&quot;. This will set it in the schema accordingly.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="schema-definition-examples"></a><a href="#schema-definition-examples" 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 12H [...]
+<h5><a class="anchor" aria-hidden="true" id="simple-definition"></a><a href="#simple-definition" 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- [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Array(String())
+    i = Map(String())
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="using-enums"></a><a href="#using-enums" 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.42 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Color</span><span class="hljs-params">(Enum)</span>:</span>
+    red = <span class="hljs-number">1</span>
+    green = <span class="hljs-number">2</span>
+    blue = <span class="hljs-number">3</span>
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    name = String()
+    color = Color
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="complex-types"></a><a href="#complex-types" 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-.8 [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MySubRecord</span><span class="hljs-params">(Record)</span>:</span>
+    x = Integer()
+    y = Long()
+    z = String()
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    sub = MySubRecord()
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/fr/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/fr/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#installation">Installation</a><ul class="toc-headings"><li><a href="#installation-a-l-aide-de-pip">Installatio [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/fr/next/client-libraries-python/index.html b/content/docs/fr/next/client-libraries-python/index.html
index 2b445a1..d3a5778 100644
--- a/content/docs/fr/next/client-libraries-python/index.html
+++ b/content/docs/fr/next/client-libraries-python/index.html
@@ -84,10 +84,11 @@
 </thead>
 <tbody>
 <tr><td style="text-align:left">MacOS</td></tr>
-<tr><td style="text-align:left">10.11 (El Capitan) — 10.12 (Sierra) — 10.13 (High Sierra)</td><td style="text-align:left">2.7, 3.7</td></tr>
-<tr><td style="text-align:left">Linux</td><td style="text-align:left">2.7, 3.3, 3.4, 3.5, 3.6, 3.7</td></tr>
 </tbody>
 </table>
+<p>10.11 (El Capitan) — 10.12 (Sierra) —<br>
+10.13 (High Sierra) — 10.14 (Mojave) | 2.7, 3.7                               |
+| Linux                                                                                                    | 2.7, 3.4, 3.5, 3.6, 3.7                |</p>
 <h3><a class="anchor" aria-hidden="true" id="installation-a-partir-du-code-source"></a><a href="#installation-a-partir-du-code-source" 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 [...]
 <p>To install the <code>pulsar-client</code> library by building from source, follow <a href="/docs/fr/next/client-libraries-cpp#compilation">these instructions</a> and compile the Pulsar C++ client library. That will also build the Python binding for the library.</p>
 <p>To install the built Python bindings:</p>
@@ -135,7 +136,113 @@ reader = client.create_reader(<span class="hljs-string">'my-topic'</span>, msg_i
     print(<span class="hljs-string">"Received message '{}' id='{}'"</span>.format(msg.data(), msg.message_id()))
     <span class="hljs-comment"># No acknowledgment</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/fr/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/fr/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#installation">Installation</a><ul class="toc-headings"><li><a href="#installation-a-l-aide-de-pip">Installatio [...]
+<h2><a class="anchor" aria-hidden="true" id="schema"></a><a href="#schema" 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.42-1.64 1-2. [...]
+<h3><a class="anchor" aria-hidden="true" id="declaring-and-validating-schema"></a><a href="#declaring-and-validating-schema" 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 [...]
+<p>A schema can be declared by passing a class that inherits from <code>pulsar.schema.Record</code> and defines the fields as class variables. For example:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> pulsar.schema <span class="hljs-keyword">import</span> *
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Boolean()
+</code></pre>
+<p>With this simple schema definition we can then create producers, consumers and readers instances that will be referring to that.</p>
+<pre><code class="hljs css language-python">producer = client.create_producer(
+                    topic=<span class="hljs-string">'my-topic'</span>,
+                    schema=AvroSchema(Example) )
+
+producer.send(Example(a=<span class="hljs-string">'Hello'</span>, b=<span class="hljs-number">1</span>))
+</code></pre>
+<p>When the producer is created, the Pulsar broker will validate that the existing topic schema is indeed of &quot;Avro&quot; type and that the format is compatible with the schema definition of the <code>Example</code> class.</p>
+<p>If there is a mismatch, the producer creation will raise an exception.</p>
+<p>Once a producer is created with a certain schema definition, it will only accept objects that are instances of the declared schema class.</p>
+<p>Similarly, for a consumer/reader, the consumer will return an object, instance of the schema record class, rather than the raw bytes:</p>
+<pre><code class="hljs css language-python">consumer = client.subscribe(
+                  topic=<span class="hljs-string">'my-topic'</span>,
+                  subscription_name=<span class="hljs-string">'my-subscription'</span>,
+                  schema=AvroSchema(Example) )
+
+<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
+    msg = consumer.receive()
+    ex = msg.value()
+    print(<span class="hljs-string">"Received message a={} b={} c={}"</span>.format(ex.a, ex.b, ex.c))
+    consumer.acknowledge(msg)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="supported-schema-types"></a><a href="#supported-schema-types" 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 [...]
+<p>There are different builtin schema types that can be used in Pulsar. All the definitions are in the <code>pulsar.schema</code> package.</p>
+<table>
+<thead>
+<tr><th>Schema</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BytesSchema</code></td><td>Get the raw payload as a <code>bytes</code> object. No serialization/deserialization are performed. This is the default schema mode</td></tr>
+<tr><td><code>StringSchema</code></td><td>Encode/decode payload as a UTF-8 string. Uses <code>str</code> objects</td></tr>
+<tr><td><code>JsonSchema</code></td><td>Require record definition. Serializes the record into standard JSON payload</td></tr>
+<tr><td><code>AvroSchema</code></td><td>Require record definition. Serializes in AVRO format</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="schema-definition-reference"></a><a href="#schema-definition-reference" 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 1 [...]
+<p>The schema definition is done through a class that inherits from <code>pulsar.schema.Record</code>.</p>
+<p>This class can have a number of fields which can be of either <code>pulsar.schema.Field</code> type or even another nested <code>Record</code>. All the fields are also specified in the <code>pulsar.schema</code> package. The fields are matching the AVRO fields types.</p>
+<table>
+<thead>
+<tr><th>Field Type</th><th>Python Type</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>Boolean</code></td><td><code>bool</code></td><td></td></tr>
+<tr><td><code>Integer</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Long</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Float</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Double</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Bytes</code></td><td><code>bytes</code></td><td></td></tr>
+<tr><td><code>String</code></td><td><code>str</code></td><td></td></tr>
+<tr><td><code>Array</code></td><td><code>list</code></td><td>Need to specify record type for items</td></tr>
+<tr><td><code>Map</code></td><td><code>dict</code></td><td>Key is always <code>String</code>. Need to specify value type</td></tr>
+</tbody>
+</table>
+<p>Additionally, any Python <code>Enum</code> type can be used as a valid field type</p>
+<h4><a class="anchor" aria-hidden="true" id="fields-parameters"></a><a href="#fields-parameters" 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- [...]
+<p>When adding a field these parameters can be used in the constructor:</p>
+<table>
+<thead>
+<tr><th>Argument</th><th>Default</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>default</code></td><td><code>None</code></td><td>Set a default value for the field. Eg: <code>a = Integer(default=5)</code></td></tr>
+<tr><td><code>required</code></td><td><code>False</code></td><td>Mark the field as &quot;required&quot;. This will set it in the schema accordingly.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="schema-definition-examples"></a><a href="#schema-definition-examples" 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 12H [...]
+<h5><a class="anchor" aria-hidden="true" id="simple-definition"></a><a href="#simple-definition" 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- [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Array(String())
+    i = Map(String())
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="using-enums"></a><a href="#using-enums" 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.42 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Color</span><span class="hljs-params">(Enum)</span>:</span>
+    red = <span class="hljs-number">1</span>
+    green = <span class="hljs-number">2</span>
+    blue = <span class="hljs-number">3</span>
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    name = String()
+    color = Color
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="complex-types"></a><a href="#complex-types" 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-.8 [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MySubRecord</span><span class="hljs-params">(Record)</span>:</span>
+    x = Integer()
+    y = Long()
+    z = String()
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    sub = MySubRecord()
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/fr/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/fr/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#installation">Installation</a><ul class="toc-headings"><li><a href="#installation-a-l-aide-de-pip">Installatio [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/fr/next/reference-configuration.html b/content/docs/fr/next/reference-configuration.html
index 1508fea..0dae9fb 100644
--- a/content/docs/fr/next/reference-configuration.html
+++ b/content/docs/fr/next/reference-configuration.html
@@ -230,10 +230,11 @@
 <tr><td>bookkeeperClientRegionawarePolicyEnabled</td><td>Enable region-aware bookie selection policy. BK will chose bookies from different regions and racks when forming a new bookie ensemble. If enabled, the value of bookkeeperClientRackawarePolicyEnabled is ignored</td><td>false</td></tr>
 <tr><td>bookkeeperClientReorderReadSequenceEnabled</td><td>Enable/disable reordering read sequence on reading entries.</td><td>false</td></tr>
 <tr><td>bookkeeperClientIsolationGroups</td><td>Enable bookie isolation by specifying a list of bookie groups to choose from. Any bookie outside the specified groups will not be used by the broker</td><td></td></tr>
+<tr><td>bookkeeperEnableStickyReads</td><td>Enable/disable having read operations for a ledger to be sticky to a single bookie. If this flag is enabled, the client will use one single bookie (by preference) to read all entries for a ledger.</td><td>true</td></tr>
 <tr><td>managedLedgerDefaultEnsembleSize</td><td>Number of bookies to use when creating a ledger</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultWriteQuorum</td><td>Number of copies to store for each message</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultAckQuorum</td><td>Number of guaranteed copies (acks to wait before write is complete)</td><td>2</td></tr>
-<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker</td><td>1024</td></tr>
+<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker. By default, uses 1/5th of available direct memory</td><td></td></tr>
 <tr><td>managedLedgerCacheEvictionWatermark</td><td>Threshold to which bring down the cache level when eviction is triggered</td><td>0.9</td></tr>
 <tr><td>managedLedgerDefaultMarkDeleteRateLimit</td><td>Rate limit the amount of writes per second generated by consumer acking the messages</td><td>1.0</td></tr>
 <tr><td>managedLedgerMaxEntriesPerLedger</td><td>Max number of entries to append to a ledger before triggering a rollover. A ledger rollover is triggered on these conditions:</td></tr>
diff --git a/content/docs/fr/next/reference-configuration/index.html b/content/docs/fr/next/reference-configuration/index.html
index 1508fea..0dae9fb 100644
--- a/content/docs/fr/next/reference-configuration/index.html
+++ b/content/docs/fr/next/reference-configuration/index.html
@@ -230,10 +230,11 @@
 <tr><td>bookkeeperClientRegionawarePolicyEnabled</td><td>Enable region-aware bookie selection policy. BK will chose bookies from different regions and racks when forming a new bookie ensemble. If enabled, the value of bookkeeperClientRackawarePolicyEnabled is ignored</td><td>false</td></tr>
 <tr><td>bookkeeperClientReorderReadSequenceEnabled</td><td>Enable/disable reordering read sequence on reading entries.</td><td>false</td></tr>
 <tr><td>bookkeeperClientIsolationGroups</td><td>Enable bookie isolation by specifying a list of bookie groups to choose from. Any bookie outside the specified groups will not be used by the broker</td><td></td></tr>
+<tr><td>bookkeeperEnableStickyReads</td><td>Enable/disable having read operations for a ledger to be sticky to a single bookie. If this flag is enabled, the client will use one single bookie (by preference) to read all entries for a ledger.</td><td>true</td></tr>
 <tr><td>managedLedgerDefaultEnsembleSize</td><td>Number of bookies to use when creating a ledger</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultWriteQuorum</td><td>Number of copies to store for each message</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultAckQuorum</td><td>Number of guaranteed copies (acks to wait before write is complete)</td><td>2</td></tr>
-<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker</td><td>1024</td></tr>
+<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker. By default, uses 1/5th of available direct memory</td><td></td></tr>
 <tr><td>managedLedgerCacheEvictionWatermark</td><td>Threshold to which bring down the cache level when eviction is triggered</td><td>0.9</td></tr>
 <tr><td>managedLedgerDefaultMarkDeleteRateLimit</td><td>Rate limit the amount of writes per second generated by consumer acking the messages</td><td>1.0</td></tr>
 <tr><td>managedLedgerMaxEntriesPerLedger</td><td>Max number of entries to append to a ledger before triggering a rollover. A ledger rollover is triggered on these conditions:</td></tr>
diff --git a/content/docs/ja/next/client-libraries-python.html b/content/docs/ja/next/client-libraries-python.html
index f285588..372a207 100644
--- a/content/docs/ja/next/client-libraries-python.html
+++ b/content/docs/ja/next/client-libraries-python.html
@@ -84,10 +84,11 @@
 </thead>
 <tbody>
 <tr><td style="text-align:left">MacOS</td></tr>
-<tr><td style="text-align:left">10.11 (El Capitan) — 10.12 (Sierra) — 10.13 (High Sierra)</td><td style="text-align:left">2.7, 3.7</td></tr>
-<tr><td style="text-align:left">Linux</td><td style="text-align:left">2.7, 3.3, 3.4, 3.5, 3.6, 3.7</td></tr>
 </tbody>
 </table>
+<p>10.11 (El Capitan) — 10.12 (Sierra) —<br>
+10.13 (High Sierra) — 10.14 (Mojave) | 2.7, 3.7                |
+| Linux                                                                                                    | 2.7, 3.4, 3.5, 3.6, 3.7 |</p>
 <h3><a class="anchor" aria-hidden="true" id="ソースからインストールする方法"></a><a href="#ソースからインストールする方法" 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  [...]
 <p>To install the <code>pulsar-client</code> library by building from source, follow <a href="/docs/ja/next/client-libraries-cpp#compilation">these instructions</a> and compile the Pulsar C++ client library. That will also build the Python binding for the library.</p>
 <p>To install the built Python bindings:</p>
@@ -135,7 +136,113 @@ reader = client.create_reader(<span class="hljs-string">'my-topic'</span>, msg_i
     print(<span class="hljs-string">"Received message '{}' id='{}'"</span>.format(msg.data(), msg.message_id()))
     <span class="hljs-comment"># No acknowledgment</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/ja/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/ja/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#インストール">インストール</a><ul class="toc-headings"><li><a href="#pip-を使用してインストールする方法">pip を使用してインストールする方法</a></li><li> [...]
+<h2><a class="anchor" aria-hidden="true" id="schema"></a><a href="#schema" 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.42-1.64 1-2. [...]
+<h3><a class="anchor" aria-hidden="true" id="declaring-and-validating-schema"></a><a href="#declaring-and-validating-schema" 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 [...]
+<p>A schema can be declared by passing a class that inherits from <code>pulsar.schema.Record</code> and defines the fields as class variables. For example:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> pulsar.schema <span class="hljs-keyword">import</span> *
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Boolean()
+</code></pre>
+<p>With this simple schema definition we can then create producers, consumers and readers instances that will be referring to that.</p>
+<pre><code class="hljs css language-python">producer = client.create_producer(
+                    topic=<span class="hljs-string">'my-topic'</span>,
+                    schema=AvroSchema(Example) )
+
+producer.send(Example(a=<span class="hljs-string">'Hello'</span>, b=<span class="hljs-number">1</span>))
+</code></pre>
+<p>When the producer is created, the Pulsar broker will validate that the existing topic schema is indeed of &quot;Avro&quot; type and that the format is compatible with the schema definition of the <code>Example</code> class.</p>
+<p>If there is a mismatch, the producer creation will raise an exception.</p>
+<p>Once a producer is created with a certain schema definition, it will only accept objects that are instances of the declared schema class.</p>
+<p>Similarly, for a consumer/reader, the consumer will return an object, instance of the schema record class, rather than the raw bytes:</p>
+<pre><code class="hljs css language-python">consumer = client.subscribe(
+                  topic=<span class="hljs-string">'my-topic'</span>,
+                  subscription_name=<span class="hljs-string">'my-subscription'</span>,
+                  schema=AvroSchema(Example) )
+
+<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
+    msg = consumer.receive()
+    ex = msg.value()
+    print(<span class="hljs-string">"Received message a={} b={} c={}"</span>.format(ex.a, ex.b, ex.c))
+    consumer.acknowledge(msg)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="supported-schema-types"></a><a href="#supported-schema-types" 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 [...]
+<p>There are different builtin schema types that can be used in Pulsar. All the definitions are in the <code>pulsar.schema</code> package.</p>
+<table>
+<thead>
+<tr><th>Schema</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BytesSchema</code></td><td>Get the raw payload as a <code>bytes</code> object. No serialization/deserialization are performed. This is the default schema mode</td></tr>
+<tr><td><code>StringSchema</code></td><td>Encode/decode payload as a UTF-8 string. Uses <code>str</code> objects</td></tr>
+<tr><td><code>JsonSchema</code></td><td>Require record definition. Serializes the record into standard JSON payload</td></tr>
+<tr><td><code>AvroSchema</code></td><td>Require record definition. Serializes in AVRO format</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="schema-definition-reference"></a><a href="#schema-definition-reference" 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 1 [...]
+<p>The schema definition is done through a class that inherits from <code>pulsar.schema.Record</code>.</p>
+<p>This class can have a number of fields which can be of either <code>pulsar.schema.Field</code> type or even another nested <code>Record</code>. All the fields are also specified in the <code>pulsar.schema</code> package. The fields are matching the AVRO fields types.</p>
+<table>
+<thead>
+<tr><th>Field Type</th><th>Python Type</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>Boolean</code></td><td><code>bool</code></td><td></td></tr>
+<tr><td><code>Integer</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Long</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Float</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Double</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Bytes</code></td><td><code>bytes</code></td><td></td></tr>
+<tr><td><code>String</code></td><td><code>str</code></td><td></td></tr>
+<tr><td><code>Array</code></td><td><code>list</code></td><td>Need to specify record type for items</td></tr>
+<tr><td><code>Map</code></td><td><code>dict</code></td><td>Key is always <code>String</code>. Need to specify value type</td></tr>
+</tbody>
+</table>
+<p>Additionally, any Python <code>Enum</code> type can be used as a valid field type</p>
+<h4><a class="anchor" aria-hidden="true" id="fields-parameters"></a><a href="#fields-parameters" 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- [...]
+<p>When adding a field these parameters can be used in the constructor:</p>
+<table>
+<thead>
+<tr><th>Argument</th><th>Default</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>default</code></td><td><code>None</code></td><td>Set a default value for the field. Eg: <code>a = Integer(default=5)</code></td></tr>
+<tr><td><code>required</code></td><td><code>False</code></td><td>Mark the field as &quot;required&quot;. This will set it in the schema accordingly.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="schema-definition-examples"></a><a href="#schema-definition-examples" 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 12H [...]
+<h5><a class="anchor" aria-hidden="true" id="simple-definition"></a><a href="#simple-definition" 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- [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Array(String())
+    i = Map(String())
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="using-enums"></a><a href="#using-enums" 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.42 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Color</span><span class="hljs-params">(Enum)</span>:</span>
+    red = <span class="hljs-number">1</span>
+    green = <span class="hljs-number">2</span>
+    blue = <span class="hljs-number">3</span>
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    name = String()
+    color = Color
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="complex-types"></a><a href="#complex-types" 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-.8 [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MySubRecord</span><span class="hljs-params">(Record)</span>:</span>
+    x = Integer()
+    y = Long()
+    z = String()
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    sub = MySubRecord()
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/ja/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/ja/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#インストール">インストール</a><ul class="toc-headings"><li><a href="#pip-を使用してインストールする方法">pip を使用してインストールする方法</a></li><li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/ja/next/client-libraries-python/index.html b/content/docs/ja/next/client-libraries-python/index.html
index f285588..372a207 100644
--- a/content/docs/ja/next/client-libraries-python/index.html
+++ b/content/docs/ja/next/client-libraries-python/index.html
@@ -84,10 +84,11 @@
 </thead>
 <tbody>
 <tr><td style="text-align:left">MacOS</td></tr>
-<tr><td style="text-align:left">10.11 (El Capitan) — 10.12 (Sierra) — 10.13 (High Sierra)</td><td style="text-align:left">2.7, 3.7</td></tr>
-<tr><td style="text-align:left">Linux</td><td style="text-align:left">2.7, 3.3, 3.4, 3.5, 3.6, 3.7</td></tr>
 </tbody>
 </table>
+<p>10.11 (El Capitan) — 10.12 (Sierra) —<br>
+10.13 (High Sierra) — 10.14 (Mojave) | 2.7, 3.7                |
+| Linux                                                                                                    | 2.7, 3.4, 3.5, 3.6, 3.7 |</p>
 <h3><a class="anchor" aria-hidden="true" id="ソースからインストールする方法"></a><a href="#ソースからインストールする方法" 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  [...]
 <p>To install the <code>pulsar-client</code> library by building from source, follow <a href="/docs/ja/next/client-libraries-cpp#compilation">these instructions</a> and compile the Pulsar C++ client library. That will also build the Python binding for the library.</p>
 <p>To install the built Python bindings:</p>
@@ -135,7 +136,113 @@ reader = client.create_reader(<span class="hljs-string">'my-topic'</span>, msg_i
     print(<span class="hljs-string">"Received message '{}' id='{}'"</span>.format(msg.data(), msg.message_id()))
     <span class="hljs-comment"># No acknowledgment</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/ja/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/ja/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#インストール">インストール</a><ul class="toc-headings"><li><a href="#pip-を使用してインストールする方法">pip を使用してインストールする方法</a></li><li> [...]
+<h2><a class="anchor" aria-hidden="true" id="schema"></a><a href="#schema" 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.42-1.64 1-2. [...]
+<h3><a class="anchor" aria-hidden="true" id="declaring-and-validating-schema"></a><a href="#declaring-and-validating-schema" 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 [...]
+<p>A schema can be declared by passing a class that inherits from <code>pulsar.schema.Record</code> and defines the fields as class variables. For example:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> pulsar.schema <span class="hljs-keyword">import</span> *
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Boolean()
+</code></pre>
+<p>With this simple schema definition we can then create producers, consumers and readers instances that will be referring to that.</p>
+<pre><code class="hljs css language-python">producer = client.create_producer(
+                    topic=<span class="hljs-string">'my-topic'</span>,
+                    schema=AvroSchema(Example) )
+
+producer.send(Example(a=<span class="hljs-string">'Hello'</span>, b=<span class="hljs-number">1</span>))
+</code></pre>
+<p>When the producer is created, the Pulsar broker will validate that the existing topic schema is indeed of &quot;Avro&quot; type and that the format is compatible with the schema definition of the <code>Example</code> class.</p>
+<p>If there is a mismatch, the producer creation will raise an exception.</p>
+<p>Once a producer is created with a certain schema definition, it will only accept objects that are instances of the declared schema class.</p>
+<p>Similarly, for a consumer/reader, the consumer will return an object, instance of the schema record class, rather than the raw bytes:</p>
+<pre><code class="hljs css language-python">consumer = client.subscribe(
+                  topic=<span class="hljs-string">'my-topic'</span>,
+                  subscription_name=<span class="hljs-string">'my-subscription'</span>,
+                  schema=AvroSchema(Example) )
+
+<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
+    msg = consumer.receive()
+    ex = msg.value()
+    print(<span class="hljs-string">"Received message a={} b={} c={}"</span>.format(ex.a, ex.b, ex.c))
+    consumer.acknowledge(msg)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="supported-schema-types"></a><a href="#supported-schema-types" 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 [...]
+<p>There are different builtin schema types that can be used in Pulsar. All the definitions are in the <code>pulsar.schema</code> package.</p>
+<table>
+<thead>
+<tr><th>Schema</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BytesSchema</code></td><td>Get the raw payload as a <code>bytes</code> object. No serialization/deserialization are performed. This is the default schema mode</td></tr>
+<tr><td><code>StringSchema</code></td><td>Encode/decode payload as a UTF-8 string. Uses <code>str</code> objects</td></tr>
+<tr><td><code>JsonSchema</code></td><td>Require record definition. Serializes the record into standard JSON payload</td></tr>
+<tr><td><code>AvroSchema</code></td><td>Require record definition. Serializes in AVRO format</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="schema-definition-reference"></a><a href="#schema-definition-reference" 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 1 [...]
+<p>The schema definition is done through a class that inherits from <code>pulsar.schema.Record</code>.</p>
+<p>This class can have a number of fields which can be of either <code>pulsar.schema.Field</code> type or even another nested <code>Record</code>. All the fields are also specified in the <code>pulsar.schema</code> package. The fields are matching the AVRO fields types.</p>
+<table>
+<thead>
+<tr><th>Field Type</th><th>Python Type</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>Boolean</code></td><td><code>bool</code></td><td></td></tr>
+<tr><td><code>Integer</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Long</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Float</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Double</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Bytes</code></td><td><code>bytes</code></td><td></td></tr>
+<tr><td><code>String</code></td><td><code>str</code></td><td></td></tr>
+<tr><td><code>Array</code></td><td><code>list</code></td><td>Need to specify record type for items</td></tr>
+<tr><td><code>Map</code></td><td><code>dict</code></td><td>Key is always <code>String</code>. Need to specify value type</td></tr>
+</tbody>
+</table>
+<p>Additionally, any Python <code>Enum</code> type can be used as a valid field type</p>
+<h4><a class="anchor" aria-hidden="true" id="fields-parameters"></a><a href="#fields-parameters" 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- [...]
+<p>When adding a field these parameters can be used in the constructor:</p>
+<table>
+<thead>
+<tr><th>Argument</th><th>Default</th><th>Notes</th></tr>
+</thead>
+<tbody>
+<tr><td><code>default</code></td><td><code>None</code></td><td>Set a default value for the field. Eg: <code>a = Integer(default=5)</code></td></tr>
+<tr><td><code>required</code></td><td><code>False</code></td><td>Mark the field as &quot;required&quot;. This will set it in the schema accordingly.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="schema-definition-examples"></a><a href="#schema-definition-examples" 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 12H [...]
+<h5><a class="anchor" aria-hidden="true" id="simple-definition"></a><a href="#simple-definition" 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- [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Array(String())
+    i = Map(String())
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="using-enums"></a><a href="#using-enums" 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.42 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Color</span><span class="hljs-params">(Enum)</span>:</span>
+    red = <span class="hljs-number">1</span>
+    green = <span class="hljs-number">2</span>
+    blue = <span class="hljs-number">3</span>
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    name = String()
+    color = Color
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="complex-types"></a><a href="#complex-types" 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-.8 [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MySubRecord</span><span class="hljs-params">(Record)</span>:</span>
+    x = Integer()
+    y = Long()
+    z = String()
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    sub = MySubRecord()
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/ja/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/ja/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#インストール">インストール</a><ul class="toc-headings"><li><a href="#pip-を使用してインストールする方法">pip を使用してインストールする方法</a></li><li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/ja/next/reference-configuration.html b/content/docs/ja/next/reference-configuration.html
index 93bdcba..44929db 100644
--- a/content/docs/ja/next/reference-configuration.html
+++ b/content/docs/ja/next/reference-configuration.html
@@ -230,10 +230,11 @@
 <tr><td>bookkeeperClientRegionawarePolicyEnabled</td><td>Enable region-aware bookie selection policy. BK will chose bookies from different regions and racks when forming a new bookie ensemble. If enabled, the value of bookkeeperClientRackawarePolicyEnabled is ignored</td><td>false</td></tr>
 <tr><td>bookkeeperClientReorderReadSequenceEnabled</td><td>Enable/disable reordering read sequence on reading entries.</td><td>false</td></tr>
 <tr><td>bookkeeperClientIsolationGroups</td><td>Enable bookie isolation by specifying a list of bookie groups to choose from. Any bookie outside the specified groups will not be used by the broker</td><td></td></tr>
+<tr><td>bookkeeperEnableStickyReads</td><td>Enable/disable having read operations for a ledger to be sticky to a single bookie. If this flag is enabled, the client will use one single bookie (by preference) to read all entries for a ledger.</td><td>true</td></tr>
 <tr><td>managedLedgerDefaultEnsembleSize</td><td>Number of bookies to use when creating a ledger</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultWriteQuorum</td><td>Number of copies to store for each message</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultAckQuorum</td><td>Number of guaranteed copies (acks to wait before write is complete)</td><td>2</td></tr>
-<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker</td><td>1024</td></tr>
+<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker. By default, uses 1/5th of available direct memory</td><td></td></tr>
 <tr><td>managedLedgerCacheEvictionWatermark</td><td>Threshold to which bring down the cache level when eviction is triggered</td><td>0.9</td></tr>
 <tr><td>managedLedgerDefaultMarkDeleteRateLimit</td><td>Rate limit the amount of writes per second generated by consumer acking the messages</td><td>1.0</td></tr>
 <tr><td>managedLedgerMaxEntriesPerLedger</td><td>Max number of entries to append to a ledger before triggering a rollover. A ledger rollover is triggered on these conditions:</td></tr>
diff --git a/content/docs/ja/next/reference-configuration/index.html b/content/docs/ja/next/reference-configuration/index.html
index 93bdcba..44929db 100644
--- a/content/docs/ja/next/reference-configuration/index.html
+++ b/content/docs/ja/next/reference-configuration/index.html
@@ -230,10 +230,11 @@
 <tr><td>bookkeeperClientRegionawarePolicyEnabled</td><td>Enable region-aware bookie selection policy. BK will chose bookies from different regions and racks when forming a new bookie ensemble. If enabled, the value of bookkeeperClientRackawarePolicyEnabled is ignored</td><td>false</td></tr>
 <tr><td>bookkeeperClientReorderReadSequenceEnabled</td><td>Enable/disable reordering read sequence on reading entries.</td><td>false</td></tr>
 <tr><td>bookkeeperClientIsolationGroups</td><td>Enable bookie isolation by specifying a list of bookie groups to choose from. Any bookie outside the specified groups will not be used by the broker</td><td></td></tr>
+<tr><td>bookkeeperEnableStickyReads</td><td>Enable/disable having read operations for a ledger to be sticky to a single bookie. If this flag is enabled, the client will use one single bookie (by preference) to read all entries for a ledger.</td><td>true</td></tr>
 <tr><td>managedLedgerDefaultEnsembleSize</td><td>Number of bookies to use when creating a ledger</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultWriteQuorum</td><td>Number of copies to store for each message</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultAckQuorum</td><td>Number of guaranteed copies (acks to wait before write is complete)</td><td>2</td></tr>
-<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker</td><td>1024</td></tr>
+<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker. By default, uses 1/5th of available direct memory</td><td></td></tr>
 <tr><td>managedLedgerCacheEvictionWatermark</td><td>Threshold to which bring down the cache level when eviction is triggered</td><td>0.9</td></tr>
 <tr><td>managedLedgerDefaultMarkDeleteRateLimit</td><td>Rate limit the amount of writes per second generated by consumer acking the messages</td><td>1.0</td></tr>
 <tr><td>managedLedgerMaxEntriesPerLedger</td><td>Max number of entries to append to a ledger before triggering a rollover. A ledger rollover is triggered on these conditions:</td></tr>
diff --git a/content/docs/zh-CN/next/client-libraries-python.html b/content/docs/zh-CN/next/client-libraries-python.html
index d9b310b..6859db5 100644
--- a/content/docs/zh-CN/next/client-libraries-python.html
+++ b/content/docs/zh-CN/next/client-libraries-python.html
@@ -84,10 +84,11 @@
 </thead>
 <tbody>
 <tr><td style="text-align:left">MacOS</td></tr>
-<tr><td style="text-align:left">10.11 (El Capitan) — 10.12 (Sierra) — 10.13 (High Sierra)</td><td style="text-align:left">2.7, 3.7</td></tr>
-<tr><td style="text-align:left">Linux</td><td style="text-align:left">2.7, 3.3, 3.4, 3.5, 3.6, 3.7</td></tr>
 </tbody>
 </table>
+<p>10.11 (El Capitan) — 10.12 (Sierra) —<br>
+10.13 (High Sierra) — 10.14 (Mojave) | 2.7, 3.7                  |
+| Linux                                                                                                    | 2.7, 3.4, 3.5, 3.6, 3.7   |</p>
 <h3><a class="anchor" aria-hidden="true" id="installing-from-source"></a><a href="#installing-from-source" 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 [...]
 <p>To install the <code>pulsar-client</code> library by building from source, follow <a href="/docs/zh-CN/next/client-libraries-cpp#compilation">these instructions</a> and compile the Pulsar C++ client library. That will also build the Python binding for the library.</p>
 <p>To install the built Python bindings:</p>
@@ -135,7 +136,113 @@ reader = client.create_reader(<span class="hljs-string">'my-topic'</span>, msg_i
     print(<span class="hljs-string">"Received message '{}' id='{}'"</span>.format(msg.data(), msg.message_id()))
     <span class="hljs-comment"># No acknowledgment</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/zh-CN/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/zh-CN/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#安装">安装</a><ul class="toc-headings"><li><a href="#installation-using-pip">Installation using pip</a></li> [...]
+<h2><a class="anchor" aria-hidden="true" id="schema"></a><a href="#schema" 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.42-1.64 1-2. [...]
+<h3><a class="anchor" aria-hidden="true" id="declaring-and-validating-schema"></a><a href="#declaring-and-validating-schema" 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 [...]
+<p>A schema can be declared by passing a class that inherits from <code>pulsar.schema.Record</code> and defines the fields as class variables. For example:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> pulsar.schema <span class="hljs-keyword">import</span> *
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Boolean()
+</code></pre>
+<p>With this simple schema definition we can then create producers, consumers and readers instances that will be referring to that.</p>
+<pre><code class="hljs css language-python">producer = client.create_producer(
+                    topic=<span class="hljs-string">'my-topic'</span>,
+                    schema=AvroSchema(Example) )
+
+producer.send(Example(a=<span class="hljs-string">'Hello'</span>, b=<span class="hljs-number">1</span>))
+</code></pre>
+<p>When the producer is created, the Pulsar broker will validate that the existing topic schema is indeed of &quot;Avro&quot; type and that the format is compatible with the schema definition of the <code>Example</code> class.</p>
+<p>If there is a mismatch, the producer creation will raise an exception.</p>
+<p>Once a producer is created with a certain schema definition, it will only accept objects that are instances of the declared schema class.</p>
+<p>Similarly, for a consumer/reader, the consumer will return an object, instance of the schema record class, rather than the raw bytes:</p>
+<pre><code class="hljs css language-python">consumer = client.subscribe(
+                  topic=<span class="hljs-string">'my-topic'</span>,
+                  subscription_name=<span class="hljs-string">'my-subscription'</span>,
+                  schema=AvroSchema(Example) )
+
+<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
+    msg = consumer.receive()
+    ex = msg.value()
+    print(<span class="hljs-string">"Received message a={} b={} c={}"</span>.format(ex.a, ex.b, ex.c))
+    consumer.acknowledge(msg)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="supported-schema-types"></a><a href="#supported-schema-types" 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 [...]
+<p>There are different builtin schema types that can be used in Pulsar. All the definitions are in the <code>pulsar.schema</code> package.</p>
+<table>
+<thead>
+<tr><th>Schema</th><th>备注</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BytesSchema</code></td><td>Get the raw payload as a <code>bytes</code> object. No serialization/deserialization are performed. This is the default schema mode</td></tr>
+<tr><td><code>StringSchema</code></td><td>Encode/decode payload as a UTF-8 string. Uses <code>str</code> objects</td></tr>
+<tr><td><code>JsonSchema</code></td><td>Require record definition. Serializes the record into standard JSON payload</td></tr>
+<tr><td><code>AvroSchema</code></td><td>Require record definition. Serializes in AVRO format</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="schema-definition-reference"></a><a href="#schema-definition-reference" 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 1 [...]
+<p>The schema definition is done through a class that inherits from <code>pulsar.schema.Record</code>.</p>
+<p>This class can have a number of fields which can be of either <code>pulsar.schema.Field</code> type or even another nested <code>Record</code>. All the fields are also specified in the <code>pulsar.schema</code> package. The fields are matching the AVRO fields types.</p>
+<table>
+<thead>
+<tr><th>Field Type</th><th>Python Type</th><th>备注</th></tr>
+</thead>
+<tbody>
+<tr><td><code>Boolean</code></td><td><code>bool</code></td><td></td></tr>
+<tr><td><code>Integer</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Long</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Float</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Double</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Bytes</code></td><td><code>bytes</code></td><td></td></tr>
+<tr><td><code>String</code></td><td><code>str</code></td><td></td></tr>
+<tr><td><code>Array</code></td><td><code>list</code></td><td>Need to specify record type for items</td></tr>
+<tr><td><code>Map</code></td><td><code>dict</code></td><td>Key is always <code>String</code>. Need to specify value type</td></tr>
+</tbody>
+</table>
+<p>Additionally, any Python <code>Enum</code> type can be used as a valid field type</p>
+<h4><a class="anchor" aria-hidden="true" id="fields-parameters"></a><a href="#fields-parameters" 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- [...]
+<p>When adding a field these parameters can be used in the constructor:</p>
+<table>
+<thead>
+<tr><th>Argument</th><th>默认值</th><th>备注</th></tr>
+</thead>
+<tbody>
+<tr><td><code>default</code></td><td><code>无</code></td><td>Set a default value for the field. Eg: <code>a = Integer(default=5)</code></td></tr>
+<tr><td><code>required</code></td><td><code>False</code></td><td>Mark the field as &quot;required&quot;. This will set it in the schema accordingly.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="schema-definition-examples"></a><a href="#schema-definition-examples" 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 12H [...]
+<h5><a class="anchor" aria-hidden="true" id="simple-definition"></a><a href="#simple-definition" 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- [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Array(String())
+    i = Map(String())
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="using-enums"></a><a href="#using-enums" 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.42 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Color</span><span class="hljs-params">(Enum)</span>:</span>
+    red = <span class="hljs-number">1</span>
+    green = <span class="hljs-number">2</span>
+    blue = <span class="hljs-number">3</span>
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    name = String()
+    color = Color
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="complex-types"></a><a href="#complex-types" 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-.8 [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MySubRecord</span><span class="hljs-params">(Record)</span>:</span>
+    x = Integer()
+    y = Long()
+    z = String()
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    sub = MySubRecord()
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/zh-CN/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/zh-CN/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#安装">安装</a><ul class="toc-headings"><li><a href="#installation-using-pip">Installation using pip</a></li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/zh-CN/next/client-libraries-python/index.html b/content/docs/zh-CN/next/client-libraries-python/index.html
index d9b310b..6859db5 100644
--- a/content/docs/zh-CN/next/client-libraries-python/index.html
+++ b/content/docs/zh-CN/next/client-libraries-python/index.html
@@ -84,10 +84,11 @@
 </thead>
 <tbody>
 <tr><td style="text-align:left">MacOS</td></tr>
-<tr><td style="text-align:left">10.11 (El Capitan) — 10.12 (Sierra) — 10.13 (High Sierra)</td><td style="text-align:left">2.7, 3.7</td></tr>
-<tr><td style="text-align:left">Linux</td><td style="text-align:left">2.7, 3.3, 3.4, 3.5, 3.6, 3.7</td></tr>
 </tbody>
 </table>
+<p>10.11 (El Capitan) — 10.12 (Sierra) —<br>
+10.13 (High Sierra) — 10.14 (Mojave) | 2.7, 3.7                  |
+| Linux                                                                                                    | 2.7, 3.4, 3.5, 3.6, 3.7   |</p>
 <h3><a class="anchor" aria-hidden="true" id="installing-from-source"></a><a href="#installing-from-source" 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 [...]
 <p>To install the <code>pulsar-client</code> library by building from source, follow <a href="/docs/zh-CN/next/client-libraries-cpp#compilation">these instructions</a> and compile the Pulsar C++ client library. That will also build the Python binding for the library.</p>
 <p>To install the built Python bindings:</p>
@@ -135,7 +136,113 @@ reader = client.create_reader(<span class="hljs-string">'my-topic'</span>, msg_i
     print(<span class="hljs-string">"Received message '{}' id='{}'"</span>.format(msg.data(), msg.message_id()))
     <span class="hljs-comment"># No acknowledgment</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/zh-CN/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/zh-CN/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#安装">安装</a><ul class="toc-headings"><li><a href="#installation-using-pip">Installation using pip</a></li> [...]
+<h2><a class="anchor" aria-hidden="true" id="schema"></a><a href="#schema" 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.42-1.64 1-2. [...]
+<h3><a class="anchor" aria-hidden="true" id="declaring-and-validating-schema"></a><a href="#declaring-and-validating-schema" 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 [...]
+<p>A schema can be declared by passing a class that inherits from <code>pulsar.schema.Record</code> and defines the fields as class variables. For example:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> pulsar.schema <span class="hljs-keyword">import</span> *
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Boolean()
+</code></pre>
+<p>With this simple schema definition we can then create producers, consumers and readers instances that will be referring to that.</p>
+<pre><code class="hljs css language-python">producer = client.create_producer(
+                    topic=<span class="hljs-string">'my-topic'</span>,
+                    schema=AvroSchema(Example) )
+
+producer.send(Example(a=<span class="hljs-string">'Hello'</span>, b=<span class="hljs-number">1</span>))
+</code></pre>
+<p>When the producer is created, the Pulsar broker will validate that the existing topic schema is indeed of &quot;Avro&quot; type and that the format is compatible with the schema definition of the <code>Example</code> class.</p>
+<p>If there is a mismatch, the producer creation will raise an exception.</p>
+<p>Once a producer is created with a certain schema definition, it will only accept objects that are instances of the declared schema class.</p>
+<p>Similarly, for a consumer/reader, the consumer will return an object, instance of the schema record class, rather than the raw bytes:</p>
+<pre><code class="hljs css language-python">consumer = client.subscribe(
+                  topic=<span class="hljs-string">'my-topic'</span>,
+                  subscription_name=<span class="hljs-string">'my-subscription'</span>,
+                  schema=AvroSchema(Example) )
+
+<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
+    msg = consumer.receive()
+    ex = msg.value()
+    print(<span class="hljs-string">"Received message a={} b={} c={}"</span>.format(ex.a, ex.b, ex.c))
+    consumer.acknowledge(msg)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="supported-schema-types"></a><a href="#supported-schema-types" 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 [...]
+<p>There are different builtin schema types that can be used in Pulsar. All the definitions are in the <code>pulsar.schema</code> package.</p>
+<table>
+<thead>
+<tr><th>Schema</th><th>备注</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BytesSchema</code></td><td>Get the raw payload as a <code>bytes</code> object. No serialization/deserialization are performed. This is the default schema mode</td></tr>
+<tr><td><code>StringSchema</code></td><td>Encode/decode payload as a UTF-8 string. Uses <code>str</code> objects</td></tr>
+<tr><td><code>JsonSchema</code></td><td>Require record definition. Serializes the record into standard JSON payload</td></tr>
+<tr><td><code>AvroSchema</code></td><td>Require record definition. Serializes in AVRO format</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="schema-definition-reference"></a><a href="#schema-definition-reference" 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 1 [...]
+<p>The schema definition is done through a class that inherits from <code>pulsar.schema.Record</code>.</p>
+<p>This class can have a number of fields which can be of either <code>pulsar.schema.Field</code> type or even another nested <code>Record</code>. All the fields are also specified in the <code>pulsar.schema</code> package. The fields are matching the AVRO fields types.</p>
+<table>
+<thead>
+<tr><th>Field Type</th><th>Python Type</th><th>备注</th></tr>
+</thead>
+<tbody>
+<tr><td><code>Boolean</code></td><td><code>bool</code></td><td></td></tr>
+<tr><td><code>Integer</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Long</code></td><td><code>int</code></td><td></td></tr>
+<tr><td><code>Float</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Double</code></td><td><code>float</code></td><td></td></tr>
+<tr><td><code>Bytes</code></td><td><code>bytes</code></td><td></td></tr>
+<tr><td><code>String</code></td><td><code>str</code></td><td></td></tr>
+<tr><td><code>Array</code></td><td><code>list</code></td><td>Need to specify record type for items</td></tr>
+<tr><td><code>Map</code></td><td><code>dict</code></td><td>Key is always <code>String</code>. Need to specify value type</td></tr>
+</tbody>
+</table>
+<p>Additionally, any Python <code>Enum</code> type can be used as a valid field type</p>
+<h4><a class="anchor" aria-hidden="true" id="fields-parameters"></a><a href="#fields-parameters" 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- [...]
+<p>When adding a field these parameters can be used in the constructor:</p>
+<table>
+<thead>
+<tr><th>Argument</th><th>默认值</th><th>备注</th></tr>
+</thead>
+<tbody>
+<tr><td><code>default</code></td><td><code>无</code></td><td>Set a default value for the field. Eg: <code>a = Integer(default=5)</code></td></tr>
+<tr><td><code>required</code></td><td><code>False</code></td><td>Mark the field as &quot;required&quot;. This will set it in the schema accordingly.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="schema-definition-examples"></a><a href="#schema-definition-examples" 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 12H [...]
+<h5><a class="anchor" aria-hidden="true" id="simple-definition"></a><a href="#simple-definition" 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- [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    b = Integer()
+    c = Array(String())
+    i = Map(String())
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="using-enums"></a><a href="#using-enums" 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.42 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Color</span><span class="hljs-params">(Enum)</span>:</span>
+    red = <span class="hljs-number">1</span>
+    green = <span class="hljs-number">2</span>
+    blue = <span class="hljs-number">3</span>
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    name = String()
+    color = Color
+</code></pre>
+<h5><a class="anchor" aria-hidden="true" id="complex-types"></a><a href="#complex-types" 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-.8 [...]
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MySubRecord</span><span class="hljs-params">(Record)</span>:</span>
+    x = Integer()
+    y = Long()
+    z = String()
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span><span class="hljs-params">(Record)</span>:</span>
+    a = String()
+    sub = MySubRecord()
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/zh-CN/next/client-libraries-go"><span class="arrow-prev">← </span><span>Go</span></a><a class="docs-next button" href="/docs/zh-CN/next/client-libraries-cpp"><span>C++</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#安装">安装</a><ul class="toc-headings"><li><a href="#installation-using-pip">Installation using pip</a></li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/zh-CN/next/reference-configuration.html b/content/docs/zh-CN/next/reference-configuration.html
index bbcaf59..b3032d0 100644
--- a/content/docs/zh-CN/next/reference-configuration.html
+++ b/content/docs/zh-CN/next/reference-configuration.html
@@ -230,10 +230,11 @@
 <tr><td>bookkeeperClientRegionawarePolicyEnabled</td><td>Enable region-aware bookie selection policy. BK will chose bookies from different regions and racks when forming a new bookie ensemble. If enabled, the value of bookkeeperClientRackawarePolicyEnabled is ignored</td><td>false</td></tr>
 <tr><td>bookkeeperClientReorderReadSequenceEnabled</td><td>Enable/disable reordering read sequence on reading entries.</td><td>false</td></tr>
 <tr><td>bookkeeperClientIsolationGroups</td><td>Enable bookie isolation by specifying a list of bookie groups to choose from. Any bookie outside the specified groups will not be used by the broker</td><td></td></tr>
+<tr><td>bookkeeperEnableStickyReads</td><td>Enable/disable having read operations for a ledger to be sticky to a single bookie. If this flag is enabled, the client will use one single bookie (by preference) to read all entries for a ledger.</td><td>true</td></tr>
 <tr><td>managedLedgerDefaultEnsembleSize</td><td>Number of bookies to use when creating a ledger</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultWriteQuorum</td><td>Number of copies to store for each message</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultAckQuorum</td><td>Number of guaranteed copies (acks to wait before write is complete)</td><td>2</td></tr>
-<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker</td><td>1024</td></tr>
+<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker. By default, uses 1/5th of available direct memory</td><td></td></tr>
 <tr><td>managedLedgerCacheEvictionWatermark</td><td>Threshold to which bring down the cache level when eviction is triggered</td><td>0.9</td></tr>
 <tr><td>managedLedgerDefaultMarkDeleteRateLimit</td><td>Rate limit the amount of writes per second generated by consumer acking the messages</td><td>1.0</td></tr>
 <tr><td>managedLedgerMaxEntriesPerLedger</td><td>Max number of entries to append to a ledger before triggering a rollover. A ledger rollover is triggered on these conditions:</td></tr>
diff --git a/content/docs/zh-CN/next/reference-configuration/index.html b/content/docs/zh-CN/next/reference-configuration/index.html
index bbcaf59..b3032d0 100644
--- a/content/docs/zh-CN/next/reference-configuration/index.html
+++ b/content/docs/zh-CN/next/reference-configuration/index.html
@@ -230,10 +230,11 @@
 <tr><td>bookkeeperClientRegionawarePolicyEnabled</td><td>Enable region-aware bookie selection policy. BK will chose bookies from different regions and racks when forming a new bookie ensemble. If enabled, the value of bookkeeperClientRackawarePolicyEnabled is ignored</td><td>false</td></tr>
 <tr><td>bookkeeperClientReorderReadSequenceEnabled</td><td>Enable/disable reordering read sequence on reading entries.</td><td>false</td></tr>
 <tr><td>bookkeeperClientIsolationGroups</td><td>Enable bookie isolation by specifying a list of bookie groups to choose from. Any bookie outside the specified groups will not be used by the broker</td><td></td></tr>
+<tr><td>bookkeeperEnableStickyReads</td><td>Enable/disable having read operations for a ledger to be sticky to a single bookie. If this flag is enabled, the client will use one single bookie (by preference) to read all entries for a ledger.</td><td>true</td></tr>
 <tr><td>managedLedgerDefaultEnsembleSize</td><td>Number of bookies to use when creating a ledger</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultWriteQuorum</td><td>Number of copies to store for each message</td><td>2</td></tr>
 <tr><td>managedLedgerDefaultAckQuorum</td><td>Number of guaranteed copies (acks to wait before write is complete)</td><td>2</td></tr>
-<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker</td><td>1024</td></tr>
+<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker. By default, uses 1/5th of available direct memory</td><td></td></tr>
 <tr><td>managedLedgerCacheEvictionWatermark</td><td>Threshold to which bring down the cache level when eviction is triggered</td><td>0.9</td></tr>
 <tr><td>managedLedgerDefaultMarkDeleteRateLimit</td><td>Rate limit the amount of writes per second generated by consumer acking the messages</td><td>1.0</td></tr>
 <tr><td>managedLedgerMaxEntriesPerLedger</td><td>Max number of entries to append to a ledger before triggering a rollover. A ledger rollover is triggered on these conditions:</td></tr>
diff --git a/content/swagger/swagger.json b/content/swagger/swagger.json
index f63237c..3bc7610 100644
--- a/content/swagger/swagger.json
+++ b/content/swagger/swagger.json
@@ -6987,14 +6987,9 @@
           "type" : "number",
           "format" : "double"
         },
-        "cpu" : {
-          "$ref" : "#/definitions/ResourceUsage"
-        },
-        "memory" : {
-          "$ref" : "#/definitions/ResourceUsage"
-        },
-        "directMemory" : {
-          "$ref" : "#/definitions/ResourceUsage"
+        "lastUpdate" : {
+          "type" : "integer",
+          "format" : "int64"
         },
         "bandwidthIn" : {
           "$ref" : "#/definitions/ResourceUsage"
@@ -7002,26 +6997,31 @@
         "bandwidthOut" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
-        "lastUpdate" : {
-          "type" : "integer",
-          "format" : "int64"
+        "memory" : {
+          "$ref" : "#/definitions/ResourceUsage"
         },
-        "msgThroughputIn" : {
-          "type" : "number",
-          "format" : "double"
+        "cpu" : {
+          "$ref" : "#/definitions/ResourceUsage"
         },
         "msgThroughputOut" : {
           "type" : "number",
           "format" : "double"
         },
-        "underLoaded" : {
+        "overLoaded" : {
           "type" : "boolean"
         },
-        "overLoaded" : {
+        "underLoaded" : {
           "type" : "boolean"
         },
         "loadReportType" : {
           "type" : "string"
+        },
+        "directMemory" : {
+          "$ref" : "#/definitions/ResourceUsage"
+        },
+        "msgThroughputIn" : {
+          "type" : "number",
+          "format" : "double"
         }
       }
     },
@@ -7181,13 +7181,13 @@
           "type" : "number",
           "format" : "double"
         },
-        "connectedSince" : {
+        "producerName" : {
           "type" : "string"
         },
-        "clientVersion" : {
+        "connectedSince" : {
           "type" : "string"
         },
-        "producerName" : {
+        "clientVersion" : {
           "type" : "string"
         },
         "address" : {
@@ -7895,13 +7895,13 @@
             "type" : "string"
           }
         },
-        "connectedSince" : {
+        "producerName" : {
           "type" : "string"
         },
-        "clientVersion" : {
+        "connectedSince" : {
           "type" : "string"
         },
-        "producerName" : {
+        "clientVersion" : {
           "type" : "string"
         },
         "address" : {


Mime
View raw message