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

[pulsar] branch asf-site updated: Updated site at revision c7b2cb3

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 1bbdb61  Updated site at revision c7b2cb3
1bbdb61 is described below

commit 1bbdb61cafc373e52be7e92727cc07b5f393e3ea
Author: jenkins <bu...@apache.org>
AuthorDate: Mon Aug 5 09:40:46 2019 +0000

    Updated site at revision c7b2cb3
---
 content/docs/assets/schema-consumer.png            | Bin 0 -> 56594 bytes
 content/docs/assets/schema-producer.png            | Bin 0 -> 56467 bytes
 content/docs/en/next/schema-understand.html        | 473 ++++++++++++++++++++
 content/docs/en/next/schema-understand/index.html  | 473 ++++++++++++++++++++
 content/docs/fr/next/schema-understand.html        | 474 +++++++++++++++++++++
 content/docs/fr/next/schema-understand/index.html  | 474 +++++++++++++++++++++
 content/docs/ja/next/schema-understand.html        | 474 +++++++++++++++++++++
 content/docs/ja/next/schema-understand/index.html  | 474 +++++++++++++++++++++
 content/docs/next/schema-understand.html           |  13 +
 content/docs/next/schema-understand/index.html     |  13 +
 content/docs/zh-CN/next/schema-understand.html     | 474 +++++++++++++++++++++
 .../docs/zh-CN/next/schema-understand/index.html   | 474 +++++++++++++++++++++
 content/en/resources.html                          |   2 +-
 content/en/resources/index.html                    |   2 +-
 content/fr/resources.html                          |   2 +-
 content/fr/resources/index.html                    |   2 +-
 content/ja/resources.html                          |   2 +-
 content/ja/resources/index.html                    |   2 +-
 content/resources.html                             |   2 +-
 content/resources/index.html                       |   2 +-
 content/sitemap.xml                                |   2 +-
 content/swagger/2.5.0-SNAPSHOT/swagger.json        |  66 +--
 .../swagger/2.5.0-SNAPSHOT/swaggerfunctions.json   |  26 +-
 content/swagger/swagger.json                       |  66 +--
 content/swagger/swaggerfunctions.json              |  26 +-
 content/zh-CN/resources.html                       |   2 +-
 content/zh-CN/resources/index.html                 |   2 +-
 27 files changed, 3919 insertions(+), 103 deletions(-)

diff --git a/content/docs/assets/schema-consumer.png b/content/docs/assets/schema-consumer.png
new file mode 100644
index 0000000..39ff9e2
Binary files /dev/null and b/content/docs/assets/schema-consumer.png differ
diff --git a/content/docs/assets/schema-producer.png b/content/docs/assets/schema-producer.png
new file mode 100644
index 0000000..b42a204
Binary files /dev/null and b/content/docs/assets/schema-producer.png differ
diff --git a/content/docs/en/next/schema-understand.html b/content/docs/en/next/schema-understand.html
new file mode 100644
index 0000000..e7d48db
--- /dev/null
+++ b/content/docs/en/next/schema-understand.html
@@ -0,0 +1,473 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Understand schema · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="## SchemaInfo"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Understand schema · Apache Pulsar"/><meta property="og: [...]
+              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+              })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+              ga('create', 'UA-102219959-1', 'auto');
+              ga('send', 'pageview');
+            </script><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sid [...]
+        const languagesMenuItem = document.getElementById("languages-menu");
+        const languagesDropDown = document.getElementById("languages-dropdown");
+        languagesMenuItem.addEventListener("click", function(event) {
+          event.preventDefault();
+
+          if (languagesDropDown.className == "hide") {
+            languagesDropDown.className = "visible";
+          } else {
+            languagesDropDown.className = "hide";
+          }
+        });
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/schema-understand.md" target= [...]
+<p>Pulsar schema is defined in a data structure called <code>SchemaInfo</code>.</p>
+<p>The <code>SchemaInfo</code> is stored and enforced on a per-topic basis and cannot be stored at the namespace or tenant level.</p>
+<p>A <code>SchemaInfo</code> consists of the following fields:</p>
+<table style="table">
+<tr>
+<th>
+<p>Field</p>
+</th>
+<th>
+<p>Description</p>
+</th>
+</tr>
+<tr>
+<td> 
+<p><code>name</code></p>
+</td> 
+<td> 
+<p>Schema name (a string).</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>type</code></p>
+</td> 
+<td> 
+<p>Schema type, which determines how to interpret the schema data.</p>
+<ul>
+<li><p>Predefined schema: see <a href="schema-undstand.md#schema-type">here</a>.</p></li>
+<li><p>Customized schema: it is left as an empty string.</p></li>
+</ul>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>schema</code>(<code>payload</code>)</p>
+</td> 
+<td> 
+<p>Schema data, which is a sequence of 8-bit unsigned bytes and schema-type specific.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>properties</code></p>
+</td> 
+<td> 
+<p>It is a user defined properties as a string/string map.</p>
+<p>Applications can use this bag for carrying any application specific logics.</p>
+<p>Possible properties might be the Git hash associated with the schema, an environment string like <code>dev</code> or <code>prod</code>.</p>
+</td>
+</tr>
+</table>
+<p><strong>Example</strong></p>
+<p>This is the <code>SchemaInfo</code> of a string.</p>
+<pre><code class="hljs css language-text">{
+    “name”: “test-string-schema”,
+    “type”: “STRING”,
+    “schema”: “”,
+    “properties”: {}
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-type"></a><a href="#schema-type" 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 [...]
+<p>Pulsar supports various schema types, which are mainly divided into two categories:</p>
+<ul>
+<li><p>Primitive type</p></li>
+<li><p>Complex type</p></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="primitive-type"></a><a href="#primitive-type" 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- [...]
+<p>Currently, Pulsar supports the following primitive types:</p>
+<table>
+<thead>
+<tr><th>Primitive Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BOOLEAN</code></td><td>A binary value</td></tr>
+<tr><td><code>INT8</code></td><td>A 8-bit signed integer</td></tr>
+<tr><td><code>INT16</code></td><td>A 16-bit signed integer</td></tr>
+<tr><td><code>INT32</code></td><td>A 32-bit signed integer</td></tr>
+<tr><td><code>INT64</code></td><td>A 64-bit signed integer</td></tr>
+<tr><td><code>FLOAT</code></td><td>A single precision (32-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>DOUBLE</code></td><td>A double-precision (64-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>BYTES</code></td><td>A sequence of 8-bit unsigned bytes</td></tr>
+<tr><td><code>STRING</code></td><td>A Unicode character sequence</td></tr>
+<tr><td><code>TIMESTAMP</code> (<code>DATE</code>, <code>TIME</code>)</td><td>A logic type represents a specific instant in time with millisecond precision. <br>It stores the number of milliseconds since <code>January 1, 1970, 00:00:00 GMT</code> as an <code>INT64</code> value</td></tr>
+</tbody>
+</table>
+<p>For primitive types, Pulsar does not store any schema data in <code>SchemaInfo</code>. The <code>type</code> in <code>SchemaInfo</code> is used to determine how to serialize and deserialize the data.</p>
+<p>Some of the primitive schema implementations can use <code>properties</code> to store implementation-specific tunable settings. For example, a <code>string</code> schema can use <code>properties</code> to store the encoding charset to serialize and deserialize strings.</p>
+<p>The conversions between <strong>Pulsar schema types</strong> and <strong>language-specific primitive types</strong> are as below.</p>
+<table>
+<thead>
+<tr><th>Schema Type</th><th>Java Type</th><th>Python Type</th><th>Go Type</th></tr>
+</thead>
+<tbody>
+<tr><td>BOOLEAN</td><td>boolean</td><td>bool</td><td>bool</td></tr>
+<tr><td>INT8</td><td>byte</td><td></td><td>int8</td></tr>
+<tr><td>INT16</td><td>short</td><td></td><td>int16</td></tr>
+<tr><td>INT32</td><td>int</td><td></td><td>int32</td></tr>
+<tr><td>INT64</td><td>long</td><td></td><td>int64</td></tr>
+<tr><td>FLOAT</td><td>float</td><td>float</td><td>float32</td></tr>
+<tr><td>DOUBLE</td><td>double</td><td>float</td><td>float64</td></tr>
+<tr><td>BYTES</td><td>byte[], ByteBuffer, ByteBuf</td><td>bytes</td><td>[]byte</td></tr>
+<tr><td>STRING</td><td>string</td><td>str</td><td>string</td></tr>
+<tr><td>TIMESTAMP</td><td>java.sql.Timestamp</td><td></td></tr>
+<tr><td>TIME</td><td>java.sql.Time</td><td></td></tr>
+<tr><td>DATE</td><td>java.util.Date</td><td></td></tr>
+</tbody>
+</table>
+<p><strong>Example</strong></p>
+<p>This example demonstrates how to use a string schema.</p>
+<ol>
+<li><p>Create a producer with a string schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<String> producer = client.newProducer(Schema.STRING).create();
+producer.newMessage().value("Hello Pulsar!").send();
+</code></pre></li>
+<li><p>Create a consumer with a string schema and receive messages.</p>
+<pre><code class="hljs css language-text">Consumer<String> consumer = client.newConsumer(Schema.STRING).create();
+consumer.receive();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="complex-type"></a><a href="#complex-type" 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. [...]
+<p>Currently, Pulsar supports the following complex types:</p>
+<table>
+<thead>
+<tr><th>Complex Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>keyvalue</code></td><td>Represents a complex type of a key/value pair.</td></tr>
+<tr><td><code>struct</code></td><td>Supports <strong>AVRO</strong>, <strong>JSON</strong>, and <strong>Protobuf</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="keyvalue"></a><a href="#keyvalue" 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  [...]
+<p><code>Keyvalue</code> schema helps applications define schemas for both key and value.</p>
+<p>For <code>SchemaInfo</code> of <code>keyvalue</code> schema, Pulsar stores the <code>SchemaInfo</code> of key schema and the <code>SchemaInfo</code> of value schema together.</p>
+<p>Pulsar provides two methods to encode a key/value pair in messages:</p>
+<ul>
+<li><p><code>INLINE</code></p></li>
+<li><p><code>SEPARATED</code></p></li>
+</ul>
+<p>Users can choose the encoding type when constructing the key/value schema.</p>
+<h5><a class="anchor" aria-hidden="true" id="inline"></a><a href="#inline" 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. [...]
+<p>Key/value pairs will be encoded together in the message payload.</p>
+<h5><a class="anchor" aria-hidden="true" id="separated"></a><a href="#separated" 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.6 [...]
+<p>Key will be encoded in the message key and the value will be encoded in the message payload.</p>
+<p><strong>Example</strong></p>
+<p>This example shows how to construct a key/value schema and then use it to produce and consume messages.</p>
+<ol>
+<li><p>Construct a key/value schema with <code>INLINE</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.INLINE
+);
+</code></pre></li>
+<li><p>Optionally, construct a key/value schema with <code>SEPARATED</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+</code></pre></li>
+<li><p>Produce messages using a key/value schema.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+
+Producer<KeyValue<Integer, String>> producer = client.newProducer(kvSchema)
+    .topic(TOPIC)
+    .create();
+
+final int key = 100;
+final String value = "value-100”;
+
+// send the key/value message
+producer.newMessage()
+.value(new KeyValue<>(key, value))
+.send();
+</code></pre></li>
+<li><p>Consume messages using a key/value schema.</p>
+<pre><code class="hljs">Schema&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.<span class="hljs-built_in">STRING</span>,
+KeyValueEncodingType.SEPARATED
+);
+
+Consumer&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; consumer = client.newConsumer(kvSchema)
+    <span class="hljs-params">...</span>
+    .topic(TOPIC)
+    .subscriptionName(SubscriptionName).subscribe();
+
+<span class="hljs-comment">// receive key/value pair</span>
+Message&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; msg = consumer.receive();
+KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt; kv = msg.getValue();
+</code></pre></li>
+</ol>
+<h4><a class="anchor" aria-hidden="true" id="struct"></a><a href="#struct" 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. [...]
+<p>Pulsar uses <a href="http://avro.apache.org/docs/current/spec.html">Avro Specification</a> to declare the schema definition for <code>struct</code> schema.</p>
+<p>This allows Pulsar:</p>
+<ul>
+<li><p>to use same tools to manage schema definitions</p></li>
+<li><p>to use different serialization/deserialization methods to handle data</p></li>
+</ul>
+<p>There are two methods to use <code>struct</code> schema:</p>
+<ul>
+<li><p><code>static</code></p></li>
+<li><p><code>generic</code></p></li>
+</ul>
+<h5><a class="anchor" aria-hidden="true" id="static"></a><a href="#static" 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. [...]
+<p>You can predefine the <code>struct</code> schema, and it can be a POJO in Java, a <code>struct</code> in Go, or classes generated by Avro or Protobuf tools.</p>
+<p><strong>Example</strong></p>
+<p>Pulsar gets the schema definition from the predefined <code>struct</code> using an Avro library. The schema definition is the schema data stored as a part of the <code>SchemaInfo</code>.</p>
+<ol>
+<li><p>Create the <em>User</em> class to define the messages sent to Pulsar topics.</p>
+<pre><code class="hljs css language-text">public class User {
+    String name;
+    int age;
+}
+</code></pre></li>
+<li><p>Create a producer with a <code>struct</code> schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<User> producer = client.newProducer(Schema.AVRO(User.class)).create();
+producer.newMessage().value(User.builder().userName("pulsar-user").userId(1L).build()).send();
+</code></pre></li>
+<li><p>Create a consumer with a <code>struct</code> schema and receive messages</p>
+<pre><code class="hljs css language-text">Consumer<User> consumer = client.newConsumer(Schema.AVRO(User.class)).create();
+User user = consumer.receive();
+</code></pre></li>
+</ol>
+<h5><a class="anchor" aria-hidden="true" id="generic"></a><a href="#generic" 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- [...]
+<p>Sometimes applications do not have pre-defined structs, and you can use this method to define schema and access data.</p>
+<p>You can define the <code>struct</code> schema using the <code>GenericSchemaBuilder</code>, generate a generic struct using <code>GenericRecordBuilder</code> and consume messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<ol>
+<li><p>Use <code>RecordSchemaBuilder</code> to build a schema.</p>
+<pre><code class="hljs css language-text">RecordSchemaBuilder recordSchemaBuilder = SchemaBuilder.record("schemaName");
+recordSchemaBuilder.field("intField").type(SchemaType.INT32);
+SchemaInfo schemaInfo = recordSchemaBuilder.build(SchemaType.AVRO);
+
+Producer<GenericRecord> producer = client.newProducer(Schema.generic(schemaInfo)).create();
+</code></pre></li>
+<li><p>Use <code>RecordBuilder</code> to build the struct records.</p>
+<pre><code class="hljs css language-text">producer.newMessage().value(schema.newRecordBuilder()
+            .set("intField", 32)
+            .build()).send();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="auto-schema"></a><a href="#auto-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 [...]
+<p>If you don't know the schema type of a Pulsar topic in advance, you can use AUTO schema to produce or consume generic records to or from brokers.</p>
+<table>
+<thead>
+<tr><th>Auto Schema Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>AUTO_PRODUCE</code></td><td>This is useful for transferring data <strong>from a producer to a Pulsar topic that has a schema</strong>.</td></tr>
+<tr><td><code>AUTO_CONSUME</code></td><td>This is useful for transferring data <strong>from a Pulsar topic that has a schema to a consumer</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="auto_produce"></a><a href="#auto_produce" 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. [...]
+<p><code>AUTO_PRODUCE</code> schema helps a producer validate whether the bytes sent by the producer is compatible with the schema of a topic.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a producer processing messages from a Kafka topic <em>K</em>.</p></li>
+<li><p>You have a Pulsar topic <em>P</em>, and you do not know its schema type.</p></li>
+<li><p>Your application reads the messages from <em>K</em> and writes the messages to <em>P</em>.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_PRODUCE</code> to verify whether the bytes produced by <em>K</em> can be sent to <em>P</em> or not.</p>
+<pre><code class="hljs css language-text">Produce<byte[]> pulsarProducer = client.newProducer(Schema.AUTO_PRODUCE())
+    …
+    .create();
+
+byte[] kafkaMessageBytes = … ; 
+
+pulsarProducer.produce(kafkaMessageBytes);
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="auto_consume"></a><a href="#auto_consume" 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. [...]
+<p><code>AUTO_CONSUME</code> schema helps a Pulsar topic validate whether the bytes sent by a Pulsar topic is compatible with a consumer, that is, the Pulsar topic deserializes messages into language-specific objects using the <code>SchemaInfo</code> retrieved from broker-side.</p>
+<p>Currently, <code>AUTO_CONSUME</code> only supports <strong>AVRO</strong> and <strong>JSON</strong> schemas. It deserializes messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a Pulsar topic <em>P</em>.</p></li>
+<li><p>You have a consumer (for example, MySQL) receiving messages from the topic <em>P</em>.</p></li>
+<li><p>You application reads the messages from <em>P</em> and writes the messages to MySQL.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_CONSUME</code> to verify whether the bytes produced by <em>P</em> can be sent to MySQL or not.</p>
+<pre><code class="hljs css language-text">Consumer<GenericRecord> pulsarConsumer = client.newConsumer(Schema.AUTO_CONSUME())
+    …
+    .subscribe();
+
+Message<GenericRecord> msg = consumer.receive() ; 
+GenericRecord record = msg.getValue();
+…
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-version"></a><a href="#schema-version" 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- [...]
+<p>Each <code>SchemaInfo</code> stored with a topic has a version. Schema version manages schema changes happening within a topic.</p>
+<p>Messages produced with a given <code>SchemaInfo</code> is tagged with a schema version, so when a message is consumed by a Pulsar client, the Pulsar client can use the schema version to retrieve the corresponding <code>SchemaInfo</code> and then use the <code>SchemaInfo</code> to deserialize data.</p>
+<p>Schemas are versioned in succession. Schema storage happens in a broker that handles the associated topics so that version assignments can be made.</p>
+<p>Once a version is assigned/fetched to/for a schema, all subsequent messages produced by that producer are tagged with the appropriate version.</p>
+<p><strong>Example</strong></p>
+<p>The following example illustrates how the schema version works.</p>
+<p>Suppose that a Pulsar <a href="/docs/en/next/client-libraries-java">Java client</a> created using the code below attempts to connect to Pulsar and begins to send messages:</p>
+<pre><code class="hljs css language-text">PulsarClient client = PulsarClient.builder()
+        .serviceUrl("pulsar://localhost:6650")
+        .build();
+
+Producer<SensorReading> producer = client.newProducer(JSONSchema.of(SensorReading.class))
+        .topic("sensor-data")
+        .sendTimeout(3, TimeUnit.SECONDS)
+        .create();
+</code></pre>
+<p>The table below lists the possible scenarios when this connection attempt occurs and what happens in each scenario:</p>
+<table class="table">
+<tr>
+<th>Scenario</th>
+<th>What happens</th>
+</tr>
+<tr>
+<td> 
+<ul>
+<li>No schema exists for the topic.</li>
+</ul>
+</td>
+<td> 
+<p>(1) The producer is created using the given schema.</p>
+<p>(2) Since no existing schema is compatible with the <code>SensorReading</code> schema, the schema is transmitted to the broker and stored.</p>
+<p>(3) Any consumer created using the same schema or topic can consume messages from the <code>sensor-data</code> topic.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using the same schema that is already stored.</p></li>
+</ul>
+</td>
+<td> 
+<p>(1) The schema is transmitted to the broker.</p>
+<p>(2) The broker determines that the schema is compatible.</p>
+<p>(3) The broker attempts to store the schema in <a href="/docs/en/next/concepts-architecture-overview#persistent-storage">BookKeeper</a> but then determines that it's already stored, so it is used to tag produced messages.</p>
+</td>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using a new schema that is compatible.</p></li>
+</ul>
+</td>
+<td> 
+<p>(1) The schema is transmitted to the broker.</p>
+<p>(2) The broker determines that the schema is compatible and stores the new schema as the current version (with a new version number).</p>
+</td>
+</tr>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="how-does-schema-work"></a><a href="#how-does-schema-work" 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 [...]
+<p>Pulsar schemas are applied and enforced at the <strong>topic</strong> level (schemas cannot be applied at the namespace or tenant level).</p>
+<p>Producers and consumers upload schemas to brokers, so Pulsar schemas work on the producer side and the consumer side.</p>
+<h3><a class="anchor" aria-hidden="true" id="producer-side"></a><a href="#producer-side" 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 [...]
+<p>This diagram illustrates how does schema work on the Producer side.</p>
+<p><img src="/docs/assets/schema-producer.png" alt="Schema works at the producer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a producer instance.</p>
+<p>The schema instance defines the schema for the data being produced using the producer instance.</p>
+<p>Take AVRO as an example, Pulsar extract schema definition from the POJO class and construct the <code>SchemaInfo</code> that the producer needs to pass to a broker when it connects.</p></li>
+<li><p>The producer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the producer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the producer.</p>
+<p>All the messages produced by this producer are tagged with the schema version.</p></li>
+<li><p>If the schema is incompatible, the broker rejects it.</p></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="consumer-side"></a><a href="#consumer-side" 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 [...]
+<p>This diagram illustrates how does Schema work on the consumer side.</p>
+<p><img src="/docs/assets/schema-consumer.png" alt="Schema works at the consumer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a consumer instance.</p>
+<p>The schema instance defines the schema that the consumer uses for decoding messages received from a broker.</p></li>
+<li><p>The consumer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the consumer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the consumer.</p></li>
+<li><p>If the schema is incompatible, the consumer will be disconnected.</p></li>
+<li><p>The consumer receives the messages from the broker.</p>
+<p>If the schema used by the consumer supports schema versioning (for example, AVRO schema), the consumer fetches the  <code>SchemaInfo</code> of the version tagged in messages, and use the passed-in schema and the schema tagged in messages to decode the messages.</p></li>
+</ol>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#schemainfo">SchemaInfo</a></li><li><a href="#schema-type">Schema type</a><ul class="toc-headings"><li><a href="#primitive-type">Primitive type</a></li><li><a href="#complex-type">Complex type</a></li><li><a href="#auto-schema">Auto Schema</a></li><li><a href="#auto_consume">AUTO_CONSUME</a></li></ul></li><li><a href="#schema-version">Schema version</a></ [...]
+      const community = document.querySelector("a[href='#community']").parentNode;
+      const communityMenu =
+        '<li>' +
+        '<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
+        '<div id="community-dropdown" class="hide">' +
+          '<ul id="community-dropdown-items">' +
+            '<li><a href="/en/contact">Contact</a></li>' +
+            '<li><a href="/en/contributing">Contributing</a></li>' +
+            '<li><a href="/en/events">Events</a></li>' +
+            '<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
+            '<li>&nbsp;</li>' +
+            '<li><a href="/en/resources">Resources</a></li>' +
+            '<li><a href="/en/team">Team</a></li>' +
+          '</ul>' +
+        '</div>' +
+        '</li>';
+
+      community.innerHTML = communityMenu;
+
+      const communityMenuItem = document.getElementById("community-menu");
+      const communityDropDown = document.getElementById("community-dropdown");
+      communityMenuItem.addEventListener("click", function(event) {
+        event.preventDefault();
+
+        if (communityDropDown.className == 'hide') {
+          communityDropDown.className = 'visible';
+        } else {
+          communityDropDown.className = 'hide';
+        }
+      });
+    </script></span><span><script src="/js/pjax-api.min.js"></script><script>window.navfoo = new Pjax({
+            areas: [
+              // try to use the first query.
+              '.mainContainer, .docsNavContainer .toc .navWrapper, .onPageNav',
+              // fallback
+              'body'
+            ],
+            link: '.docsNavContainer:not(.docsSliderActive) a',
+            update: {
+              script: false,
+            }
+          });
+        </script></span></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</scri [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: 'd226a455cecdd4bc18a554c1b47e5b52',
+                indexName: 'apache_pulsar',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:next"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/en/next/schema-understand/index.html b/content/docs/en/next/schema-understand/index.html
new file mode 100644
index 0000000..e7d48db
--- /dev/null
+++ b/content/docs/en/next/schema-understand/index.html
@@ -0,0 +1,473 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Understand schema · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="## SchemaInfo"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Understand schema · Apache Pulsar"/><meta property="og: [...]
+              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+              })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+              ga('create', 'UA-102219959-1', 'auto');
+              ga('send', 'pageview');
+            </script><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sid [...]
+        const languagesMenuItem = document.getElementById("languages-menu");
+        const languagesDropDown = document.getElementById("languages-dropdown");
+        languagesMenuItem.addEventListener("click", function(event) {
+          event.preventDefault();
+
+          if (languagesDropDown.className == "hide") {
+            languagesDropDown.className = "visible";
+          } else {
+            languagesDropDown.className = "hide";
+          }
+        });
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/schema-understand.md" target= [...]
+<p>Pulsar schema is defined in a data structure called <code>SchemaInfo</code>.</p>
+<p>The <code>SchemaInfo</code> is stored and enforced on a per-topic basis and cannot be stored at the namespace or tenant level.</p>
+<p>A <code>SchemaInfo</code> consists of the following fields:</p>
+<table style="table">
+<tr>
+<th>
+<p>Field</p>
+</th>
+<th>
+<p>Description</p>
+</th>
+</tr>
+<tr>
+<td> 
+<p><code>name</code></p>
+</td> 
+<td> 
+<p>Schema name (a string).</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>type</code></p>
+</td> 
+<td> 
+<p>Schema type, which determines how to interpret the schema data.</p>
+<ul>
+<li><p>Predefined schema: see <a href="schema-undstand.md#schema-type">here</a>.</p></li>
+<li><p>Customized schema: it is left as an empty string.</p></li>
+</ul>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>schema</code>(<code>payload</code>)</p>
+</td> 
+<td> 
+<p>Schema data, which is a sequence of 8-bit unsigned bytes and schema-type specific.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>properties</code></p>
+</td> 
+<td> 
+<p>It is a user defined properties as a string/string map.</p>
+<p>Applications can use this bag for carrying any application specific logics.</p>
+<p>Possible properties might be the Git hash associated with the schema, an environment string like <code>dev</code> or <code>prod</code>.</p>
+</td>
+</tr>
+</table>
+<p><strong>Example</strong></p>
+<p>This is the <code>SchemaInfo</code> of a string.</p>
+<pre><code class="hljs css language-text">{
+    “name”: “test-string-schema”,
+    “type”: “STRING”,
+    “schema”: “”,
+    “properties”: {}
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-type"></a><a href="#schema-type" 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 [...]
+<p>Pulsar supports various schema types, which are mainly divided into two categories:</p>
+<ul>
+<li><p>Primitive type</p></li>
+<li><p>Complex type</p></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="primitive-type"></a><a href="#primitive-type" 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- [...]
+<p>Currently, Pulsar supports the following primitive types:</p>
+<table>
+<thead>
+<tr><th>Primitive Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BOOLEAN</code></td><td>A binary value</td></tr>
+<tr><td><code>INT8</code></td><td>A 8-bit signed integer</td></tr>
+<tr><td><code>INT16</code></td><td>A 16-bit signed integer</td></tr>
+<tr><td><code>INT32</code></td><td>A 32-bit signed integer</td></tr>
+<tr><td><code>INT64</code></td><td>A 64-bit signed integer</td></tr>
+<tr><td><code>FLOAT</code></td><td>A single precision (32-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>DOUBLE</code></td><td>A double-precision (64-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>BYTES</code></td><td>A sequence of 8-bit unsigned bytes</td></tr>
+<tr><td><code>STRING</code></td><td>A Unicode character sequence</td></tr>
+<tr><td><code>TIMESTAMP</code> (<code>DATE</code>, <code>TIME</code>)</td><td>A logic type represents a specific instant in time with millisecond precision. <br>It stores the number of milliseconds since <code>January 1, 1970, 00:00:00 GMT</code> as an <code>INT64</code> value</td></tr>
+</tbody>
+</table>
+<p>For primitive types, Pulsar does not store any schema data in <code>SchemaInfo</code>. The <code>type</code> in <code>SchemaInfo</code> is used to determine how to serialize and deserialize the data.</p>
+<p>Some of the primitive schema implementations can use <code>properties</code> to store implementation-specific tunable settings. For example, a <code>string</code> schema can use <code>properties</code> to store the encoding charset to serialize and deserialize strings.</p>
+<p>The conversions between <strong>Pulsar schema types</strong> and <strong>language-specific primitive types</strong> are as below.</p>
+<table>
+<thead>
+<tr><th>Schema Type</th><th>Java Type</th><th>Python Type</th><th>Go Type</th></tr>
+</thead>
+<tbody>
+<tr><td>BOOLEAN</td><td>boolean</td><td>bool</td><td>bool</td></tr>
+<tr><td>INT8</td><td>byte</td><td></td><td>int8</td></tr>
+<tr><td>INT16</td><td>short</td><td></td><td>int16</td></tr>
+<tr><td>INT32</td><td>int</td><td></td><td>int32</td></tr>
+<tr><td>INT64</td><td>long</td><td></td><td>int64</td></tr>
+<tr><td>FLOAT</td><td>float</td><td>float</td><td>float32</td></tr>
+<tr><td>DOUBLE</td><td>double</td><td>float</td><td>float64</td></tr>
+<tr><td>BYTES</td><td>byte[], ByteBuffer, ByteBuf</td><td>bytes</td><td>[]byte</td></tr>
+<tr><td>STRING</td><td>string</td><td>str</td><td>string</td></tr>
+<tr><td>TIMESTAMP</td><td>java.sql.Timestamp</td><td></td></tr>
+<tr><td>TIME</td><td>java.sql.Time</td><td></td></tr>
+<tr><td>DATE</td><td>java.util.Date</td><td></td></tr>
+</tbody>
+</table>
+<p><strong>Example</strong></p>
+<p>This example demonstrates how to use a string schema.</p>
+<ol>
+<li><p>Create a producer with a string schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<String> producer = client.newProducer(Schema.STRING).create();
+producer.newMessage().value("Hello Pulsar!").send();
+</code></pre></li>
+<li><p>Create a consumer with a string schema and receive messages.</p>
+<pre><code class="hljs css language-text">Consumer<String> consumer = client.newConsumer(Schema.STRING).create();
+consumer.receive();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="complex-type"></a><a href="#complex-type" 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. [...]
+<p>Currently, Pulsar supports the following complex types:</p>
+<table>
+<thead>
+<tr><th>Complex Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>keyvalue</code></td><td>Represents a complex type of a key/value pair.</td></tr>
+<tr><td><code>struct</code></td><td>Supports <strong>AVRO</strong>, <strong>JSON</strong>, and <strong>Protobuf</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="keyvalue"></a><a href="#keyvalue" 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  [...]
+<p><code>Keyvalue</code> schema helps applications define schemas for both key and value.</p>
+<p>For <code>SchemaInfo</code> of <code>keyvalue</code> schema, Pulsar stores the <code>SchemaInfo</code> of key schema and the <code>SchemaInfo</code> of value schema together.</p>
+<p>Pulsar provides two methods to encode a key/value pair in messages:</p>
+<ul>
+<li><p><code>INLINE</code></p></li>
+<li><p><code>SEPARATED</code></p></li>
+</ul>
+<p>Users can choose the encoding type when constructing the key/value schema.</p>
+<h5><a class="anchor" aria-hidden="true" id="inline"></a><a href="#inline" 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. [...]
+<p>Key/value pairs will be encoded together in the message payload.</p>
+<h5><a class="anchor" aria-hidden="true" id="separated"></a><a href="#separated" 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.6 [...]
+<p>Key will be encoded in the message key and the value will be encoded in the message payload.</p>
+<p><strong>Example</strong></p>
+<p>This example shows how to construct a key/value schema and then use it to produce and consume messages.</p>
+<ol>
+<li><p>Construct a key/value schema with <code>INLINE</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.INLINE
+);
+</code></pre></li>
+<li><p>Optionally, construct a key/value schema with <code>SEPARATED</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+</code></pre></li>
+<li><p>Produce messages using a key/value schema.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+
+Producer<KeyValue<Integer, String>> producer = client.newProducer(kvSchema)
+    .topic(TOPIC)
+    .create();
+
+final int key = 100;
+final String value = "value-100”;
+
+// send the key/value message
+producer.newMessage()
+.value(new KeyValue<>(key, value))
+.send();
+</code></pre></li>
+<li><p>Consume messages using a key/value schema.</p>
+<pre><code class="hljs">Schema&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.<span class="hljs-built_in">STRING</span>,
+KeyValueEncodingType.SEPARATED
+);
+
+Consumer&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; consumer = client.newConsumer(kvSchema)
+    <span class="hljs-params">...</span>
+    .topic(TOPIC)
+    .subscriptionName(SubscriptionName).subscribe();
+
+<span class="hljs-comment">// receive key/value pair</span>
+Message&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; msg = consumer.receive();
+KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt; kv = msg.getValue();
+</code></pre></li>
+</ol>
+<h4><a class="anchor" aria-hidden="true" id="struct"></a><a href="#struct" 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. [...]
+<p>Pulsar uses <a href="http://avro.apache.org/docs/current/spec.html">Avro Specification</a> to declare the schema definition for <code>struct</code> schema.</p>
+<p>This allows Pulsar:</p>
+<ul>
+<li><p>to use same tools to manage schema definitions</p></li>
+<li><p>to use different serialization/deserialization methods to handle data</p></li>
+</ul>
+<p>There are two methods to use <code>struct</code> schema:</p>
+<ul>
+<li><p><code>static</code></p></li>
+<li><p><code>generic</code></p></li>
+</ul>
+<h5><a class="anchor" aria-hidden="true" id="static"></a><a href="#static" 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. [...]
+<p>You can predefine the <code>struct</code> schema, and it can be a POJO in Java, a <code>struct</code> in Go, or classes generated by Avro or Protobuf tools.</p>
+<p><strong>Example</strong></p>
+<p>Pulsar gets the schema definition from the predefined <code>struct</code> using an Avro library. The schema definition is the schema data stored as a part of the <code>SchemaInfo</code>.</p>
+<ol>
+<li><p>Create the <em>User</em> class to define the messages sent to Pulsar topics.</p>
+<pre><code class="hljs css language-text">public class User {
+    String name;
+    int age;
+}
+</code></pre></li>
+<li><p>Create a producer with a <code>struct</code> schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<User> producer = client.newProducer(Schema.AVRO(User.class)).create();
+producer.newMessage().value(User.builder().userName("pulsar-user").userId(1L).build()).send();
+</code></pre></li>
+<li><p>Create a consumer with a <code>struct</code> schema and receive messages</p>
+<pre><code class="hljs css language-text">Consumer<User> consumer = client.newConsumer(Schema.AVRO(User.class)).create();
+User user = consumer.receive();
+</code></pre></li>
+</ol>
+<h5><a class="anchor" aria-hidden="true" id="generic"></a><a href="#generic" 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- [...]
+<p>Sometimes applications do not have pre-defined structs, and you can use this method to define schema and access data.</p>
+<p>You can define the <code>struct</code> schema using the <code>GenericSchemaBuilder</code>, generate a generic struct using <code>GenericRecordBuilder</code> and consume messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<ol>
+<li><p>Use <code>RecordSchemaBuilder</code> to build a schema.</p>
+<pre><code class="hljs css language-text">RecordSchemaBuilder recordSchemaBuilder = SchemaBuilder.record("schemaName");
+recordSchemaBuilder.field("intField").type(SchemaType.INT32);
+SchemaInfo schemaInfo = recordSchemaBuilder.build(SchemaType.AVRO);
+
+Producer<GenericRecord> producer = client.newProducer(Schema.generic(schemaInfo)).create();
+</code></pre></li>
+<li><p>Use <code>RecordBuilder</code> to build the struct records.</p>
+<pre><code class="hljs css language-text">producer.newMessage().value(schema.newRecordBuilder()
+            .set("intField", 32)
+            .build()).send();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="auto-schema"></a><a href="#auto-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 [...]
+<p>If you don't know the schema type of a Pulsar topic in advance, you can use AUTO schema to produce or consume generic records to or from brokers.</p>
+<table>
+<thead>
+<tr><th>Auto Schema Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>AUTO_PRODUCE</code></td><td>This is useful for transferring data <strong>from a producer to a Pulsar topic that has a schema</strong>.</td></tr>
+<tr><td><code>AUTO_CONSUME</code></td><td>This is useful for transferring data <strong>from a Pulsar topic that has a schema to a consumer</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="auto_produce"></a><a href="#auto_produce" 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. [...]
+<p><code>AUTO_PRODUCE</code> schema helps a producer validate whether the bytes sent by the producer is compatible with the schema of a topic.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a producer processing messages from a Kafka topic <em>K</em>.</p></li>
+<li><p>You have a Pulsar topic <em>P</em>, and you do not know its schema type.</p></li>
+<li><p>Your application reads the messages from <em>K</em> and writes the messages to <em>P</em>.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_PRODUCE</code> to verify whether the bytes produced by <em>K</em> can be sent to <em>P</em> or not.</p>
+<pre><code class="hljs css language-text">Produce<byte[]> pulsarProducer = client.newProducer(Schema.AUTO_PRODUCE())
+    …
+    .create();
+
+byte[] kafkaMessageBytes = … ; 
+
+pulsarProducer.produce(kafkaMessageBytes);
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="auto_consume"></a><a href="#auto_consume" 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. [...]
+<p><code>AUTO_CONSUME</code> schema helps a Pulsar topic validate whether the bytes sent by a Pulsar topic is compatible with a consumer, that is, the Pulsar topic deserializes messages into language-specific objects using the <code>SchemaInfo</code> retrieved from broker-side.</p>
+<p>Currently, <code>AUTO_CONSUME</code> only supports <strong>AVRO</strong> and <strong>JSON</strong> schemas. It deserializes messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a Pulsar topic <em>P</em>.</p></li>
+<li><p>You have a consumer (for example, MySQL) receiving messages from the topic <em>P</em>.</p></li>
+<li><p>You application reads the messages from <em>P</em> and writes the messages to MySQL.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_CONSUME</code> to verify whether the bytes produced by <em>P</em> can be sent to MySQL or not.</p>
+<pre><code class="hljs css language-text">Consumer<GenericRecord> pulsarConsumer = client.newConsumer(Schema.AUTO_CONSUME())
+    …
+    .subscribe();
+
+Message<GenericRecord> msg = consumer.receive() ; 
+GenericRecord record = msg.getValue();
+…
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-version"></a><a href="#schema-version" 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- [...]
+<p>Each <code>SchemaInfo</code> stored with a topic has a version. Schema version manages schema changes happening within a topic.</p>
+<p>Messages produced with a given <code>SchemaInfo</code> is tagged with a schema version, so when a message is consumed by a Pulsar client, the Pulsar client can use the schema version to retrieve the corresponding <code>SchemaInfo</code> and then use the <code>SchemaInfo</code> to deserialize data.</p>
+<p>Schemas are versioned in succession. Schema storage happens in a broker that handles the associated topics so that version assignments can be made.</p>
+<p>Once a version is assigned/fetched to/for a schema, all subsequent messages produced by that producer are tagged with the appropriate version.</p>
+<p><strong>Example</strong></p>
+<p>The following example illustrates how the schema version works.</p>
+<p>Suppose that a Pulsar <a href="/docs/en/next/client-libraries-java">Java client</a> created using the code below attempts to connect to Pulsar and begins to send messages:</p>
+<pre><code class="hljs css language-text">PulsarClient client = PulsarClient.builder()
+        .serviceUrl("pulsar://localhost:6650")
+        .build();
+
+Producer<SensorReading> producer = client.newProducer(JSONSchema.of(SensorReading.class))
+        .topic("sensor-data")
+        .sendTimeout(3, TimeUnit.SECONDS)
+        .create();
+</code></pre>
+<p>The table below lists the possible scenarios when this connection attempt occurs and what happens in each scenario:</p>
+<table class="table">
+<tr>
+<th>Scenario</th>
+<th>What happens</th>
+</tr>
+<tr>
+<td> 
+<ul>
+<li>No schema exists for the topic.</li>
+</ul>
+</td>
+<td> 
+<p>(1) The producer is created using the given schema.</p>
+<p>(2) Since no existing schema is compatible with the <code>SensorReading</code> schema, the schema is transmitted to the broker and stored.</p>
+<p>(3) Any consumer created using the same schema or topic can consume messages from the <code>sensor-data</code> topic.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using the same schema that is already stored.</p></li>
+</ul>
+</td>
+<td> 
+<p>(1) The schema is transmitted to the broker.</p>
+<p>(2) The broker determines that the schema is compatible.</p>
+<p>(3) The broker attempts to store the schema in <a href="/docs/en/next/concepts-architecture-overview#persistent-storage">BookKeeper</a> but then determines that it's already stored, so it is used to tag produced messages.</p>
+</td>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using a new schema that is compatible.</p></li>
+</ul>
+</td>
+<td> 
+<p>(1) The schema is transmitted to the broker.</p>
+<p>(2) The broker determines that the schema is compatible and stores the new schema as the current version (with a new version number).</p>
+</td>
+</tr>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="how-does-schema-work"></a><a href="#how-does-schema-work" 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 [...]
+<p>Pulsar schemas are applied and enforced at the <strong>topic</strong> level (schemas cannot be applied at the namespace or tenant level).</p>
+<p>Producers and consumers upload schemas to brokers, so Pulsar schemas work on the producer side and the consumer side.</p>
+<h3><a class="anchor" aria-hidden="true" id="producer-side"></a><a href="#producer-side" 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 [...]
+<p>This diagram illustrates how does schema work on the Producer side.</p>
+<p><img src="/docs/assets/schema-producer.png" alt="Schema works at the producer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a producer instance.</p>
+<p>The schema instance defines the schema for the data being produced using the producer instance.</p>
+<p>Take AVRO as an example, Pulsar extract schema definition from the POJO class and construct the <code>SchemaInfo</code> that the producer needs to pass to a broker when it connects.</p></li>
+<li><p>The producer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the producer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the producer.</p>
+<p>All the messages produced by this producer are tagged with the schema version.</p></li>
+<li><p>If the schema is incompatible, the broker rejects it.</p></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="consumer-side"></a><a href="#consumer-side" 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 [...]
+<p>This diagram illustrates how does Schema work on the consumer side.</p>
+<p><img src="/docs/assets/schema-consumer.png" alt="Schema works at the consumer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a consumer instance.</p>
+<p>The schema instance defines the schema that the consumer uses for decoding messages received from a broker.</p></li>
+<li><p>The consumer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the consumer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the consumer.</p></li>
+<li><p>If the schema is incompatible, the consumer will be disconnected.</p></li>
+<li><p>The consumer receives the messages from the broker.</p>
+<p>If the schema used by the consumer supports schema versioning (for example, AVRO schema), the consumer fetches the  <code>SchemaInfo</code> of the version tagged in messages, and use the passed-in schema and the schema tagged in messages to decode the messages.</p></li>
+</ol>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#schemainfo">SchemaInfo</a></li><li><a href="#schema-type">Schema type</a><ul class="toc-headings"><li><a href="#primitive-type">Primitive type</a></li><li><a href="#complex-type">Complex type</a></li><li><a href="#auto-schema">Auto Schema</a></li><li><a href="#auto_consume">AUTO_CONSUME</a></li></ul></li><li><a href="#schema-version">Schema version</a></ [...]
+      const community = document.querySelector("a[href='#community']").parentNode;
+      const communityMenu =
+        '<li>' +
+        '<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
+        '<div id="community-dropdown" class="hide">' +
+          '<ul id="community-dropdown-items">' +
+            '<li><a href="/en/contact">Contact</a></li>' +
+            '<li><a href="/en/contributing">Contributing</a></li>' +
+            '<li><a href="/en/events">Events</a></li>' +
+            '<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
+            '<li>&nbsp;</li>' +
+            '<li><a href="/en/resources">Resources</a></li>' +
+            '<li><a href="/en/team">Team</a></li>' +
+          '</ul>' +
+        '</div>' +
+        '</li>';
+
+      community.innerHTML = communityMenu;
+
+      const communityMenuItem = document.getElementById("community-menu");
+      const communityDropDown = document.getElementById("community-dropdown");
+      communityMenuItem.addEventListener("click", function(event) {
+        event.preventDefault();
+
+        if (communityDropDown.className == 'hide') {
+          communityDropDown.className = 'visible';
+        } else {
+          communityDropDown.className = 'hide';
+        }
+      });
+    </script></span><span><script src="/js/pjax-api.min.js"></script><script>window.navfoo = new Pjax({
+            areas: [
+              // try to use the first query.
+              '.mainContainer, .docsNavContainer .toc .navWrapper, .onPageNav',
+              // fallback
+              'body'
+            ],
+            link: '.docsNavContainer:not(.docsSliderActive) a',
+            update: {
+              script: false,
+            }
+          });
+        </script></span></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</scri [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: 'd226a455cecdd4bc18a554c1b47e5b52',
+                indexName: 'apache_pulsar',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:next"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/fr/next/schema-understand.html b/content/docs/fr/next/schema-understand.html
new file mode 100644
index 0000000..9e44a59
--- /dev/null
+++ b/content/docs/fr/next/schema-understand.html
@@ -0,0 +1,474 @@
+<!DOCTYPE html><html lang="fr"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Understand schema · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="## SchemaInfo"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="fr"/><meta property="og:title" content="Understand schema · Apache Pulsar"/><meta property="og: [...]
+              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+              })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+              ga('create', 'UA-102219959-1', 'auto');
+              ga('send', 'pageview');
+            </script><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sid [...]
+        const languagesMenuItem = document.getElementById("languages-menu");
+        const languagesDropDown = document.getElementById("languages-dropdown");
+        languagesMenuItem.addEventListener("click", function(event) {
+          event.preventDefault();
+
+          if (languagesDropDown.className == "hide") {
+            languagesDropDown.className = "visible";
+          } else {
+            languagesDropDown.className = "hide";
+          }
+        });
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/fr" target="_blank" rel="noreferrer noopener">Transla [...]
+<p>Pulsar schema is defined in a data structure called <code>SchemaInfo</code>.</p>
+<p>The <code>SchemaInfo</code> is stored and enforced on a per-topic basis and cannot be stored at the namespace or tenant level.</p>
+<p>A <code>SchemaInfo</code> consists of the following fields:</p>
+<table style="table">
+  <tr>
+    <th>
+      Field
+    </th>
+<pre><code class="hljs">&lt;th&gt;
+  Description
+&lt;/th&gt;
+</code></pre>
+  </tr>
+  <tr>
+<td> 
+<p><code>name</code></p>
+</td> 
+<td> 
+<p>Schema name (a string).</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>type</code></p>
+</td> 
+<td> 
+<p>Schema type, which determines how to interpret the schema data.</p>
+<ul>
+<li><p>Predefined schema: see <a href="schema-undstand.md#schema-type">here</a>.</p></li>
+<li><p>Customized schema: it is left as an empty string.</p></li>
+</ul>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>schema</code>(<code>payload</code>)</p>
+</td> 
+<td> 
+<p>Schema data, which is a sequence of 8-bit unsigned bytes and schema-type specific.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>properties</code></p>
+</td> 
+<pre><code class="hljs">&lt;td&gt;
+  It is a user defined properties as a string/string map. Applications can use this bag for carrying any application specific logics. Possible properties might be the Git hash associated with the schema, an environment string like `dev` or `prod`.
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<p><strong>Example</strong></p>
+<p>This is the <code>SchemaInfo</code> of a string.</p>
+<pre><code class="hljs css language-text">{
+    “name”: “test-string-schema”,
+    “type”: “STRING”,
+    “schema”: “”,
+    “properties”: {}
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-type"></a><a href="#schema-type" 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 [...]
+<p>Pulsar supports various schema types, which are mainly divided into two categories:</p>
+<ul>
+<li><p>Primitive type</p></li>
+<li><p>Complex type</p></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="primitive-type"></a><a href="#primitive-type" 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- [...]
+<p>Currently, Pulsar supports the following primitive types:</p>
+<table>
+<thead>
+<tr><th>Primitive Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BOOLEAN</code></td><td>A binary value</td></tr>
+<tr><td><code>INT8</code></td><td>A 8-bit signed integer</td></tr>
+<tr><td><code>INT16</code></td><td>A 16-bit signed integer</td></tr>
+<tr><td><code>INT32</code></td><td>A 32-bit signed integer</td></tr>
+<tr><td><code>INT64</code></td><td>A 64-bit signed integer</td></tr>
+<tr><td><code>FLOAT</code></td><td>A single precision (32-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>DOUBLE</code></td><td>A double-precision (64-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>BYTES</code></td><td>A sequence of 8-bit unsigned bytes</td></tr>
+<tr><td><code>STRING</code></td><td>A Unicode character sequence</td></tr>
+<tr><td><code>TIMESTAMP</code> (<code>DATE</code>, <code>TIME</code>)</td><td>A logic type represents a specific instant in time with millisecond precision.</td></tr>
+<tr><td>It stores the number of milliseconds since <code>January 1, 1970, 00:00:00 GMT</code> as an <code>INT64</code> value</td></tr>
+</tbody>
+</table>
+<p>For primitive types, Pulsar does not store any schema data in <code>SchemaInfo</code>. The <code>type</code> in <code>SchemaInfo</code> is used to determine how to serialize and deserialize the data.</p>
+<p>Some of the primitive schema implementations can use <code>properties</code> to store implementation-specific tunable settings. For example, a <code>string</code> schema can use <code>properties</code> to store the encoding charset to serialize and deserialize strings.</p>
+<p>The conversions between <strong>Pulsar schema types</strong> and <strong>language-specific primitive types</strong> are as below.</p>
+<table>
+<thead>
+<tr><th>Schema Type</th><th>Java Type</th><th>Python Type</th><th>Go Type</th></tr>
+</thead>
+<tbody>
+<tr><td>BOOLEAN</td><td>boolean</td><td>bool</td><td>bool</td></tr>
+<tr><td>INT8</td><td>byte</td><td></td><td>int8</td></tr>
+<tr><td>INT16</td><td>short</td><td></td><td>int16</td></tr>
+<tr><td>INT32</td><td>int</td><td></td><td>int32</td></tr>
+<tr><td>INT64</td><td>long</td><td></td><td>int64</td></tr>
+<tr><td>FLOAT</td><td>float</td><td>float</td><td>float32</td></tr>
+<tr><td>DOUBLE</td><td>double</td><td>float</td><td>float64</td></tr>
+<tr><td>BYTES</td><td>byte[], ByteBuffer, ByteBuf</td><td>bytes</td><td>[]byte</td></tr>
+<tr><td>STRING</td><td>string</td><td>str</td><td>string</td></tr>
+<tr><td>TIMESTAMP</td><td>java.sql.Timestamp</td><td></td><td></td></tr>
+<tr><td>TIME</td><td>java.sql.Time</td><td></td><td></td></tr>
+<tr><td>DATE</td><td>java.util.Date</td><td></td><td></td></tr>
+</tbody>
+</table>
+<p><strong>Example</strong></p>
+<p>This example demonstrates how to use a string schema.</p>
+<ol>
+<li><p>Create a producer with a string schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<String> producer = client.newProducer(Schema.STRING).create();
+producer.newMessage().value("Hello Pulsar!").send();
+</code></pre></li>
+<li><p>Create a consumer with a string schema and receive messages.</p>
+<pre><code class="hljs css language-text">Consumer<String> consumer = client.newConsumer(Schema.STRING).create();
+consumer.receive();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="complex-type"></a><a href="#complex-type" 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. [...]
+<p>Currently, Pulsar supports the following complex types:</p>
+<table>
+<thead>
+<tr><th>Complex Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>keyvalue</code></td><td>Represents a complex type of a key/value pair.</td></tr>
+<tr><td><code>struct</code></td><td>Supports <strong>AVRO</strong>, <strong>JSON</strong>, and <strong>Protobuf</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="keyvalue"></a><a href="#keyvalue" 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  [...]
+<p><code>Keyvalue</code> schema helps applications define schemas for both key and value.</p>
+<p>For <code>SchemaInfo</code> of <code>keyvalue</code> schema, Pulsar stores the <code>SchemaInfo</code> of key schema and the <code>SchemaInfo</code> of value schema together.</p>
+<p>Pulsar provides two methods to encode a key/value pair in messages:</p>
+<ul>
+<li><p><code>INLINE</code></p></li>
+<li><p><code>SEPARATED</code></p></li>
+</ul>
+<p>Users can choose the encoding type when constructing the key/value schema.</p>
+<h5><a class="anchor" aria-hidden="true" id="inline"></a><a href="#inline" 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. [...]
+<p>Key/value pairs will be encoded together in the message payload.</p>
+<h5><a class="anchor" aria-hidden="true" id="separated"></a><a href="#separated" 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.6 [...]
+<p>Key will be encoded in the message key and the value will be encoded in the message payload.</p>
+<p><strong>Example</strong></p>
+<p>This example shows how to construct a key/value schema and then use it to produce and consume messages.</p>
+<ol>
+<li><p>Construct a key/value schema with <code>INLINE</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.INLINE
+);
+</code></pre></li>
+<li><p>Optionally, construct a key/value schema with <code>SEPARATED</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+</code></pre></li>
+<li><p>Produce messages using a key/value schema.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+
+Producer<KeyValue<Integer, String>> producer = client.newProducer(kvSchema)
+    .topic(TOPIC)
+    .create();
+
+final int key = 100;
+final String value = "value-100”;
+
+// send the key/value message
+producer.newMessage()
+.value(new KeyValue<>(key, value))
+.send();
+</code></pre></li>
+<li><p>Consume messages using a key/value schema.</p>
+<pre><code class="hljs">Schema&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.<span class="hljs-built_in">STRING</span>,
+KeyValueEncodingType.SEPARATED
+);
+
+Consumer&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; consumer = client.newConsumer(kvSchema)
+    <span class="hljs-params">...</span>
+    .topic(TOPIC)
+    .subscriptionName(SubscriptionName).subscribe();
+
+<span class="hljs-comment">// receive key/value pair</span>
+Message&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; msg = consumer.receive();
+KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt; kv = msg.getValue();
+</code></pre></li>
+</ol>
+<h4><a class="anchor" aria-hidden="true" id="struct"></a><a href="#struct" 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. [...]
+<p>Pulsar uses <a href="http://avro.apache.org/docs/current/spec.html">Avro Specification</a> to declare the schema definition for <code>struct</code> schema.</p>
+<p>This allows Pulsar:</p>
+<ul>
+<li><p>to use same tools to manage schema definitions</p></li>
+<li><p>to use different serialization/deserialization methods to handle data</p></li>
+</ul>
+<p>There are two methods to use <code>struct</code> schema:</p>
+<ul>
+<li><p><code>static</code></p></li>
+<li><p><code>generic</code></p></li>
+</ul>
+<h5><a class="anchor" aria-hidden="true" id="static"></a><a href="#static" 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. [...]
+<p>You can predefine the <code>struct</code> schema, and it can be a POJO in Java, a <code>struct</code> in Go, or classes generated by Avro or Protobuf tools.</p>
+<p><strong>Example</strong></p>
+<p>Pulsar gets the schema definition from the predefined <code>struct</code> using an Avro library. The schema definition is the schema data stored as a part of the <code>SchemaInfo</code>.</p>
+<ol>
+<li><p>Create the <em>User</em> class to define the messages sent to Pulsar topics.</p>
+<pre><code class="hljs css language-text">public class User {
+    String name;
+    int age;
+}
+</code></pre></li>
+<li><p>Create a producer with a <code>struct</code> schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<User> producer = client.newProducer(Schema.AVRO(User.class)).create();
+producer.newMessage().value(User.builder().userName("pulsar-user").userId(1L).build()).send();
+</code></pre></li>
+<li><p>Create a consumer with a <code>struct</code> schema and receive messages</p>
+<pre><code class="hljs css language-text">Consumer<User> consumer = client.newConsumer(Schema.AVRO(User.class)).create();
+User user = consumer.receive();
+</code></pre></li>
+</ol>
+<h5><a class="anchor" aria-hidden="true" id="generic"></a><a href="#generic" 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- [...]
+<p>Sometimes applications do not have pre-defined structs, and you can use this method to define schema and access data.</p>
+<p>You can define the <code>struct</code> schema using the <code>GenericSchemaBuilder</code>, generate a generic struct using <code>GenericRecordBuilder</code> and consume messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<ol>
+<li><p>Use <code>RecordSchemaBuilder</code> to build a schema.</p>
+<pre><code class="hljs css language-text">RecordSchemaBuilder recordSchemaBuilder = SchemaBuilder.record("schemaName");
+recordSchemaBuilder.field("intField").type(SchemaType.INT32);
+SchemaInfo schemaInfo = recordSchemaBuilder.build(SchemaType.AVRO);
+
+Producer<GenericRecord> producer = client.newProducer(Schema.generic(schemaInfo)).create();
+</code></pre></li>
+<li><p>Use <code>RecordBuilder</code> to build the struct records.</p>
+<pre><code class="hljs css language-text">producer.newMessage().value(schema.newRecordBuilder()
+            .set("intField", 32)
+            .build()).send();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="auto-schema"></a><a href="#auto-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 [...]
+<p>If you don't know the schema type of a Pulsar topic in advance, you can use AUTO schema to produce or consume generic records to or from brokers.</p>
+<table>
+<thead>
+<tr><th>Auto Schema Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>AUTO_PRODUCE</code></td><td>This is useful for transferring data <strong>from a producer to a Pulsar topic that has a schema</strong>.</td></tr>
+<tr><td><code>AUTO_CONSUME</code></td><td>This is useful for transferring data <strong>from a Pulsar topic that has a schema to a consumer</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="auto_produce"></a><a href="#auto_produce" 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. [...]
+<p><code>AUTO_PRODUCE</code> schema helps a producer validate whether the bytes sent by the producer is compatible with the schema of a topic.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a producer processing messages from a Kafka topic <em>K</em>.</p></li>
+<li><p>You have a Pulsar topic <em>P</em>, and you do not know its schema type.</p></li>
+<li><p>Your application reads the messages from <em>K</em> and writes the messages to <em>P</em>.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_PRODUCE</code> to verify whether the bytes produced by <em>K</em> can be sent to <em>P</em> or not.</p>
+<pre><code class="hljs css language-text">Produce<byte[]> pulsarProducer = client.newProducer(Schema.AUTO_PRODUCE())
+    …
+    .create();
+
+byte[] kafkaMessageBytes = … ; 
+
+pulsarProducer.produce(kafkaMessageBytes);
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="auto_consume"></a><a href="#auto_consume" 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. [...]
+<p><code>AUTO_CONSUME</code> schema helps a Pulsar topic validate whether the bytes sent by a Pulsar topic is compatible with a consumer, that is, the Pulsar topic deserializes messages into language-specific objects using the <code>SchemaInfo</code> retrieved from broker-side.</p>
+<p>Currently, <code>AUTO_CONSUME</code> only supports <strong>AVRO</strong> and <strong>JSON</strong> schemas. It deserializes messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a Pulsar topic <em>P</em>.</p></li>
+<li><p>You have a consumer (for example, MySQL) receiving messages from the topic <em>P</em>.</p></li>
+<li><p>You application reads the messages from <em>P</em> and writes the messages to MySQL.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_CONSUME</code> to verify whether the bytes produced by <em>P</em> can be sent to MySQL or not.</p>
+<pre><code class="hljs css language-text">Consumer<GenericRecord> pulsarConsumer = client.newConsumer(Schema.AUTO_CONSUME())
+    …
+    .subscribe();
+
+Message<GenericRecord> msg = consumer.receive() ; 
+GenericRecord record = msg.getValue();
+…
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-version"></a><a href="#schema-version" 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- [...]
+<p>Each <code>SchemaInfo</code> stored with a topic has a version. Schema version manages schema changes happening within a topic.</p>
+<p>Messages produced with a given <code>SchemaInfo</code> is tagged with a schema version, so when a message is consumed by a Pulsar client, the Pulsar client can use the schema version to retrieve the corresponding <code>SchemaInfo</code> and then use the <code>SchemaInfo</code> to deserialize data.</p>
+<p>Schemas are versioned in succession. Schema storage happens in a broker that handles the associated topics so that version assignments can be made.</p>
+<p>Once a version is assigned/fetched to/for a schema, all subsequent messages produced by that producer are tagged with the appropriate version.</p>
+<p><strong>Example</strong></p>
+<p>The following example illustrates how the schema version works.</p>
+<p>Suppose that a Pulsar <a href="/docs/fr/next/client-libraries-java">Java client</a> created using the code below attempts to connect to Pulsar and begins to send messages:</p>
+<pre><code class="hljs css language-text">PulsarClient client = PulsarClient.builder()
+        .serviceUrl("pulsar://localhost:6650")
+        .build();
+
+Producer<SensorReading> producer = client.newProducer(JSONSchema.of(SensorReading.class))
+        .topic("sensor-data")
+        .sendTimeout(3, TimeUnit.SECONDS)
+        .create();
+</code></pre>
+<p>The table below lists the possible scenarios when this connection attempt occurs and what happens in each scenario:</p>
+<table class="table">
+  <tr>
+<th>Scenario</th>
+<th>What happens</th>
+  </tr>
+  <tr>
+<td> 
+<ul>
+<li>No schema exists for the topic.</li>
+</ul>
+</td>
+<td> 
+<p>(1) The producer is created using the given schema.</p>
+<p>(2) Since no existing schema is compatible with the <code>SensorReading</code> schema, the schema is transmitted to the broker and stored.</p>
+<p>(3) Any consumer created using the same schema or topic can consume messages from the <code>sensor-data</code> topic.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using the same schema that is already stored.</p></li>
+</ul>
+</td>
+<td> 
+<p>(1) The schema is transmitted to the broker.</p>
+<p>(2) The broker determines that the schema is compatible.</p>
+<p>(3) The broker attempts to store the schema in <a href="/docs/fr/next/concepts-architecture-overview#persistent-storage">BookKeeper</a> but then determines that it's already stored, so it is used to tag produced messages.</p>
+</td>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using a new schema that is compatible.</p></li>
+</ul>
+</td>
+<pre><code class="hljs">&lt;td&gt;
+  (1) The schema is transmitted to the broker. (2) The broker determines that the schema is compatible and stores the new schema as the current version (with a new version number).
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="how-does-schema-work"></a><a href="#how-does-schema-work" 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 [...]
+<p>Pulsar schemas are applied and enforced at the <strong>topic</strong> level (schemas cannot be applied at the namespace or tenant level).</p>
+<p>Producers and consumers upload schemas to brokers, so Pulsar schemas work on the producer side and the consumer side.</p>
+<h3><a class="anchor" aria-hidden="true" id="producer-side"></a><a href="#producer-side" 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 [...]
+<p>This diagram illustrates how does schema work on the Producer side.</p>
+<p><img src="/docs/assets/schema-producer.png" alt="Schema works at the producer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a producer instance.</p>
+<p>The schema instance defines the schema for the data being produced using the producer instance.</p>
+<p>Take AVRO as an example, Pulsar extract schema definition from the POJO class and construct the <code>SchemaInfo</code> that the producer needs to pass to a broker when it connects.</p></li>
+<li><p>The producer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the producer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the producer.</p>
+<p>All the messages produced by this producer are tagged with the schema version.</p></li>
+<li><p>If the schema is incompatible, the broker rejects it.</p></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="consumer-side"></a><a href="#consumer-side" 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 [...]
+<p>This diagram illustrates how does Schema work on the consumer side.</p>
+<p><img src="/docs/assets/schema-consumer.png" alt="Schema works at the consumer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a consumer instance.</p>
+<p>The schema instance defines the schema that the consumer uses for decoding messages received from a broker.</p></li>
+<li><p>The consumer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the consumer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the consumer.</p></li>
+<li><p>If the schema is incompatible, the consumer will be disconnected.</p></li>
+<li><p>The consumer receives the messages from the broker.</p>
+<p>If the schema used by the consumer supports schema versioning (for example, AVRO schema), the consumer fetches the <code>SchemaInfo</code> of the version tagged in messages, and use the passed-in schema and the schema tagged in messages to decode the messages.</p></li>
+</ol>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#schemainfo">SchemaInfo</a></li><li><a href="#schema-type">Schema type</a><ul class="toc-headings"><li><a href="#primitive-type">Primitive type</a></li><li><a href="#complex-type">Complex type</a></li><li><a href="#auto-schema">Auto Schema</a></li><li><a href="#auto_consume">AUTO_CONSUME</a></li></ul></li><li><a href="#schema-version">Schema version</a></ [...]
+      const community = document.querySelector("a[href='#community']").parentNode;
+      const communityMenu =
+        '<li>' +
+        '<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
+        '<div id="community-dropdown" class="hide">' +
+          '<ul id="community-dropdown-items">' +
+            '<li><a href="/fr/contact">Contact</a></li>' +
+            '<li><a href="/fr/contributing">Contributing</a></li>' +
+            '<li><a href="/fr/events">Events</a></li>' +
+            '<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
+            '<li>&nbsp;</li>' +
+            '<li><a href="/fr/resources">Resources</a></li>' +
+            '<li><a href="/fr/team">Team</a></li>' +
+          '</ul>' +
+        '</div>' +
+        '</li>';
+
+      community.innerHTML = communityMenu;
+
+      const communityMenuItem = document.getElementById("community-menu");
+      const communityDropDown = document.getElementById("community-dropdown");
+      communityMenuItem.addEventListener("click", function(event) {
+        event.preventDefault();
+
+        if (communityDropDown.className == 'hide') {
+          communityDropDown.className = 'visible';
+        } else {
+          communityDropDown.className = 'hide';
+        }
+      });
+    </script></span><span><script src="/js/pjax-api.min.js"></script><script>window.navfoo = new Pjax({
+            areas: [
+              // try to use the first query.
+              '.mainContainer, .docsNavContainer .toc .navWrapper, .onPageNav',
+              // fallback
+              'body'
+            ],
+            link: '.docsNavContainer:not(.docsSliderActive) a',
+            update: {
+              script: false,
+            }
+          });
+        </script></span></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</scri [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: 'd226a455cecdd4bc18a554c1b47e5b52',
+                indexName: 'apache_pulsar',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:fr","version:next"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/fr/next/schema-understand/index.html b/content/docs/fr/next/schema-understand/index.html
new file mode 100644
index 0000000..9e44a59
--- /dev/null
+++ b/content/docs/fr/next/schema-understand/index.html
@@ -0,0 +1,474 @@
+<!DOCTYPE html><html lang="fr"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Understand schema · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="## SchemaInfo"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="fr"/><meta property="og:title" content="Understand schema · Apache Pulsar"/><meta property="og: [...]
+              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+              })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+              ga('create', 'UA-102219959-1', 'auto');
+              ga('send', 'pageview');
+            </script><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sid [...]
+        const languagesMenuItem = document.getElementById("languages-menu");
+        const languagesDropDown = document.getElementById("languages-dropdown");
+        languagesMenuItem.addEventListener("click", function(event) {
+          event.preventDefault();
+
+          if (languagesDropDown.className == "hide") {
+            languagesDropDown.className = "visible";
+          } else {
+            languagesDropDown.className = "hide";
+          }
+        });
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/fr" target="_blank" rel="noreferrer noopener">Transla [...]
+<p>Pulsar schema is defined in a data structure called <code>SchemaInfo</code>.</p>
+<p>The <code>SchemaInfo</code> is stored and enforced on a per-topic basis and cannot be stored at the namespace or tenant level.</p>
+<p>A <code>SchemaInfo</code> consists of the following fields:</p>
+<table style="table">
+  <tr>
+    <th>
+      Field
+    </th>
+<pre><code class="hljs">&lt;th&gt;
+  Description
+&lt;/th&gt;
+</code></pre>
+  </tr>
+  <tr>
+<td> 
+<p><code>name</code></p>
+</td> 
+<td> 
+<p>Schema name (a string).</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>type</code></p>
+</td> 
+<td> 
+<p>Schema type, which determines how to interpret the schema data.</p>
+<ul>
+<li><p>Predefined schema: see <a href="schema-undstand.md#schema-type">here</a>.</p></li>
+<li><p>Customized schema: it is left as an empty string.</p></li>
+</ul>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>schema</code>(<code>payload</code>)</p>
+</td> 
+<td> 
+<p>Schema data, which is a sequence of 8-bit unsigned bytes and schema-type specific.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>properties</code></p>
+</td> 
+<pre><code class="hljs">&lt;td&gt;
+  It is a user defined properties as a string/string map. Applications can use this bag for carrying any application specific logics. Possible properties might be the Git hash associated with the schema, an environment string like `dev` or `prod`.
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<p><strong>Example</strong></p>
+<p>This is the <code>SchemaInfo</code> of a string.</p>
+<pre><code class="hljs css language-text">{
+    “name”: “test-string-schema”,
+    “type”: “STRING”,
+    “schema”: “”,
+    “properties”: {}
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-type"></a><a href="#schema-type" 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 [...]
+<p>Pulsar supports various schema types, which are mainly divided into two categories:</p>
+<ul>
+<li><p>Primitive type</p></li>
+<li><p>Complex type</p></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="primitive-type"></a><a href="#primitive-type" 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- [...]
+<p>Currently, Pulsar supports the following primitive types:</p>
+<table>
+<thead>
+<tr><th>Primitive Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BOOLEAN</code></td><td>A binary value</td></tr>
+<tr><td><code>INT8</code></td><td>A 8-bit signed integer</td></tr>
+<tr><td><code>INT16</code></td><td>A 16-bit signed integer</td></tr>
+<tr><td><code>INT32</code></td><td>A 32-bit signed integer</td></tr>
+<tr><td><code>INT64</code></td><td>A 64-bit signed integer</td></tr>
+<tr><td><code>FLOAT</code></td><td>A single precision (32-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>DOUBLE</code></td><td>A double-precision (64-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>BYTES</code></td><td>A sequence of 8-bit unsigned bytes</td></tr>
+<tr><td><code>STRING</code></td><td>A Unicode character sequence</td></tr>
+<tr><td><code>TIMESTAMP</code> (<code>DATE</code>, <code>TIME</code>)</td><td>A logic type represents a specific instant in time with millisecond precision.</td></tr>
+<tr><td>It stores the number of milliseconds since <code>January 1, 1970, 00:00:00 GMT</code> as an <code>INT64</code> value</td></tr>
+</tbody>
+</table>
+<p>For primitive types, Pulsar does not store any schema data in <code>SchemaInfo</code>. The <code>type</code> in <code>SchemaInfo</code> is used to determine how to serialize and deserialize the data.</p>
+<p>Some of the primitive schema implementations can use <code>properties</code> to store implementation-specific tunable settings. For example, a <code>string</code> schema can use <code>properties</code> to store the encoding charset to serialize and deserialize strings.</p>
+<p>The conversions between <strong>Pulsar schema types</strong> and <strong>language-specific primitive types</strong> are as below.</p>
+<table>
+<thead>
+<tr><th>Schema Type</th><th>Java Type</th><th>Python Type</th><th>Go Type</th></tr>
+</thead>
+<tbody>
+<tr><td>BOOLEAN</td><td>boolean</td><td>bool</td><td>bool</td></tr>
+<tr><td>INT8</td><td>byte</td><td></td><td>int8</td></tr>
+<tr><td>INT16</td><td>short</td><td></td><td>int16</td></tr>
+<tr><td>INT32</td><td>int</td><td></td><td>int32</td></tr>
+<tr><td>INT64</td><td>long</td><td></td><td>int64</td></tr>
+<tr><td>FLOAT</td><td>float</td><td>float</td><td>float32</td></tr>
+<tr><td>DOUBLE</td><td>double</td><td>float</td><td>float64</td></tr>
+<tr><td>BYTES</td><td>byte[], ByteBuffer, ByteBuf</td><td>bytes</td><td>[]byte</td></tr>
+<tr><td>STRING</td><td>string</td><td>str</td><td>string</td></tr>
+<tr><td>TIMESTAMP</td><td>java.sql.Timestamp</td><td></td><td></td></tr>
+<tr><td>TIME</td><td>java.sql.Time</td><td></td><td></td></tr>
+<tr><td>DATE</td><td>java.util.Date</td><td></td><td></td></tr>
+</tbody>
+</table>
+<p><strong>Example</strong></p>
+<p>This example demonstrates how to use a string schema.</p>
+<ol>
+<li><p>Create a producer with a string schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<String> producer = client.newProducer(Schema.STRING).create();
+producer.newMessage().value("Hello Pulsar!").send();
+</code></pre></li>
+<li><p>Create a consumer with a string schema and receive messages.</p>
+<pre><code class="hljs css language-text">Consumer<String> consumer = client.newConsumer(Schema.STRING).create();
+consumer.receive();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="complex-type"></a><a href="#complex-type" 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. [...]
+<p>Currently, Pulsar supports the following complex types:</p>
+<table>
+<thead>
+<tr><th>Complex Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>keyvalue</code></td><td>Represents a complex type of a key/value pair.</td></tr>
+<tr><td><code>struct</code></td><td>Supports <strong>AVRO</strong>, <strong>JSON</strong>, and <strong>Protobuf</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="keyvalue"></a><a href="#keyvalue" 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  [...]
+<p><code>Keyvalue</code> schema helps applications define schemas for both key and value.</p>
+<p>For <code>SchemaInfo</code> of <code>keyvalue</code> schema, Pulsar stores the <code>SchemaInfo</code> of key schema and the <code>SchemaInfo</code> of value schema together.</p>
+<p>Pulsar provides two methods to encode a key/value pair in messages:</p>
+<ul>
+<li><p><code>INLINE</code></p></li>
+<li><p><code>SEPARATED</code></p></li>
+</ul>
+<p>Users can choose the encoding type when constructing the key/value schema.</p>
+<h5><a class="anchor" aria-hidden="true" id="inline"></a><a href="#inline" 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. [...]
+<p>Key/value pairs will be encoded together in the message payload.</p>
+<h5><a class="anchor" aria-hidden="true" id="separated"></a><a href="#separated" 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.6 [...]
+<p>Key will be encoded in the message key and the value will be encoded in the message payload.</p>
+<p><strong>Example</strong></p>
+<p>This example shows how to construct a key/value schema and then use it to produce and consume messages.</p>
+<ol>
+<li><p>Construct a key/value schema with <code>INLINE</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.INLINE
+);
+</code></pre></li>
+<li><p>Optionally, construct a key/value schema with <code>SEPARATED</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+</code></pre></li>
+<li><p>Produce messages using a key/value schema.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+
+Producer<KeyValue<Integer, String>> producer = client.newProducer(kvSchema)
+    .topic(TOPIC)
+    .create();
+
+final int key = 100;
+final String value = "value-100”;
+
+// send the key/value message
+producer.newMessage()
+.value(new KeyValue<>(key, value))
+.send();
+</code></pre></li>
+<li><p>Consume messages using a key/value schema.</p>
+<pre><code class="hljs">Schema&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.<span class="hljs-built_in">STRING</span>,
+KeyValueEncodingType.SEPARATED
+);
+
+Consumer&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; consumer = client.newConsumer(kvSchema)
+    <span class="hljs-params">...</span>
+    .topic(TOPIC)
+    .subscriptionName(SubscriptionName).subscribe();
+
+<span class="hljs-comment">// receive key/value pair</span>
+Message&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; msg = consumer.receive();
+KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt; kv = msg.getValue();
+</code></pre></li>
+</ol>
+<h4><a class="anchor" aria-hidden="true" id="struct"></a><a href="#struct" 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. [...]
+<p>Pulsar uses <a href="http://avro.apache.org/docs/current/spec.html">Avro Specification</a> to declare the schema definition for <code>struct</code> schema.</p>
+<p>This allows Pulsar:</p>
+<ul>
+<li><p>to use same tools to manage schema definitions</p></li>
+<li><p>to use different serialization/deserialization methods to handle data</p></li>
+</ul>
+<p>There are two methods to use <code>struct</code> schema:</p>
+<ul>
+<li><p><code>static</code></p></li>
+<li><p><code>generic</code></p></li>
+</ul>
+<h5><a class="anchor" aria-hidden="true" id="static"></a><a href="#static" 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. [...]
+<p>You can predefine the <code>struct</code> schema, and it can be a POJO in Java, a <code>struct</code> in Go, or classes generated by Avro or Protobuf tools.</p>
+<p><strong>Example</strong></p>
+<p>Pulsar gets the schema definition from the predefined <code>struct</code> using an Avro library. The schema definition is the schema data stored as a part of the <code>SchemaInfo</code>.</p>
+<ol>
+<li><p>Create the <em>User</em> class to define the messages sent to Pulsar topics.</p>
+<pre><code class="hljs css language-text">public class User {
+    String name;
+    int age;
+}
+</code></pre></li>
+<li><p>Create a producer with a <code>struct</code> schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<User> producer = client.newProducer(Schema.AVRO(User.class)).create();
+producer.newMessage().value(User.builder().userName("pulsar-user").userId(1L).build()).send();
+</code></pre></li>
+<li><p>Create a consumer with a <code>struct</code> schema and receive messages</p>
+<pre><code class="hljs css language-text">Consumer<User> consumer = client.newConsumer(Schema.AVRO(User.class)).create();
+User user = consumer.receive();
+</code></pre></li>
+</ol>
+<h5><a class="anchor" aria-hidden="true" id="generic"></a><a href="#generic" 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- [...]
+<p>Sometimes applications do not have pre-defined structs, and you can use this method to define schema and access data.</p>
+<p>You can define the <code>struct</code> schema using the <code>GenericSchemaBuilder</code>, generate a generic struct using <code>GenericRecordBuilder</code> and consume messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<ol>
+<li><p>Use <code>RecordSchemaBuilder</code> to build a schema.</p>
+<pre><code class="hljs css language-text">RecordSchemaBuilder recordSchemaBuilder = SchemaBuilder.record("schemaName");
+recordSchemaBuilder.field("intField").type(SchemaType.INT32);
+SchemaInfo schemaInfo = recordSchemaBuilder.build(SchemaType.AVRO);
+
+Producer<GenericRecord> producer = client.newProducer(Schema.generic(schemaInfo)).create();
+</code></pre></li>
+<li><p>Use <code>RecordBuilder</code> to build the struct records.</p>
+<pre><code class="hljs css language-text">producer.newMessage().value(schema.newRecordBuilder()
+            .set("intField", 32)
+            .build()).send();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="auto-schema"></a><a href="#auto-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 [...]
+<p>If you don't know the schema type of a Pulsar topic in advance, you can use AUTO schema to produce or consume generic records to or from brokers.</p>
+<table>
+<thead>
+<tr><th>Auto Schema Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>AUTO_PRODUCE</code></td><td>This is useful for transferring data <strong>from a producer to a Pulsar topic that has a schema</strong>.</td></tr>
+<tr><td><code>AUTO_CONSUME</code></td><td>This is useful for transferring data <strong>from a Pulsar topic that has a schema to a consumer</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="auto_produce"></a><a href="#auto_produce" 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. [...]
+<p><code>AUTO_PRODUCE</code> schema helps a producer validate whether the bytes sent by the producer is compatible with the schema of a topic.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a producer processing messages from a Kafka topic <em>K</em>.</p></li>
+<li><p>You have a Pulsar topic <em>P</em>, and you do not know its schema type.</p></li>
+<li><p>Your application reads the messages from <em>K</em> and writes the messages to <em>P</em>.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_PRODUCE</code> to verify whether the bytes produced by <em>K</em> can be sent to <em>P</em> or not.</p>
+<pre><code class="hljs css language-text">Produce<byte[]> pulsarProducer = client.newProducer(Schema.AUTO_PRODUCE())
+    …
+    .create();
+
+byte[] kafkaMessageBytes = … ; 
+
+pulsarProducer.produce(kafkaMessageBytes);
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="auto_consume"></a><a href="#auto_consume" 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. [...]
+<p><code>AUTO_CONSUME</code> schema helps a Pulsar topic validate whether the bytes sent by a Pulsar topic is compatible with a consumer, that is, the Pulsar topic deserializes messages into language-specific objects using the <code>SchemaInfo</code> retrieved from broker-side.</p>
+<p>Currently, <code>AUTO_CONSUME</code> only supports <strong>AVRO</strong> and <strong>JSON</strong> schemas. It deserializes messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a Pulsar topic <em>P</em>.</p></li>
+<li><p>You have a consumer (for example, MySQL) receiving messages from the topic <em>P</em>.</p></li>
+<li><p>You application reads the messages from <em>P</em> and writes the messages to MySQL.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_CONSUME</code> to verify whether the bytes produced by <em>P</em> can be sent to MySQL or not.</p>
+<pre><code class="hljs css language-text">Consumer<GenericRecord> pulsarConsumer = client.newConsumer(Schema.AUTO_CONSUME())
+    …
+    .subscribe();
+
+Message<GenericRecord> msg = consumer.receive() ; 
+GenericRecord record = msg.getValue();
+…
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-version"></a><a href="#schema-version" 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- [...]
+<p>Each <code>SchemaInfo</code> stored with a topic has a version. Schema version manages schema changes happening within a topic.</p>
+<p>Messages produced with a given <code>SchemaInfo</code> is tagged with a schema version, so when a message is consumed by a Pulsar client, the Pulsar client can use the schema version to retrieve the corresponding <code>SchemaInfo</code> and then use the <code>SchemaInfo</code> to deserialize data.</p>
+<p>Schemas are versioned in succession. Schema storage happens in a broker that handles the associated topics so that version assignments can be made.</p>
+<p>Once a version is assigned/fetched to/for a schema, all subsequent messages produced by that producer are tagged with the appropriate version.</p>
+<p><strong>Example</strong></p>
+<p>The following example illustrates how the schema version works.</p>
+<p>Suppose that a Pulsar <a href="/docs/fr/next/client-libraries-java">Java client</a> created using the code below attempts to connect to Pulsar and begins to send messages:</p>
+<pre><code class="hljs css language-text">PulsarClient client = PulsarClient.builder()
+        .serviceUrl("pulsar://localhost:6650")
+        .build();
+
+Producer<SensorReading> producer = client.newProducer(JSONSchema.of(SensorReading.class))
+        .topic("sensor-data")
+        .sendTimeout(3, TimeUnit.SECONDS)
+        .create();
+</code></pre>
+<p>The table below lists the possible scenarios when this connection attempt occurs and what happens in each scenario:</p>
+<table class="table">
+  <tr>
+<th>Scenario</th>
+<th>What happens</th>
+  </tr>
+  <tr>
+<td> 
+<ul>
+<li>No schema exists for the topic.</li>
+</ul>
+</td>
+<td> 
+<p>(1) The producer is created using the given schema.</p>
+<p>(2) Since no existing schema is compatible with the <code>SensorReading</code> schema, the schema is transmitted to the broker and stored.</p>
+<p>(3) Any consumer created using the same schema or topic can consume messages from the <code>sensor-data</code> topic.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using the same schema that is already stored.</p></li>
+</ul>
+</td>
+<td> 
+<p>(1) The schema is transmitted to the broker.</p>
+<p>(2) The broker determines that the schema is compatible.</p>
+<p>(3) The broker attempts to store the schema in <a href="/docs/fr/next/concepts-architecture-overview#persistent-storage">BookKeeper</a> but then determines that it's already stored, so it is used to tag produced messages.</p>
+</td>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using a new schema that is compatible.</p></li>
+</ul>
+</td>
+<pre><code class="hljs">&lt;td&gt;
+  (1) The schema is transmitted to the broker. (2) The broker determines that the schema is compatible and stores the new schema as the current version (with a new version number).
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="how-does-schema-work"></a><a href="#how-does-schema-work" 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 [...]
+<p>Pulsar schemas are applied and enforced at the <strong>topic</strong> level (schemas cannot be applied at the namespace or tenant level).</p>
+<p>Producers and consumers upload schemas to brokers, so Pulsar schemas work on the producer side and the consumer side.</p>
+<h3><a class="anchor" aria-hidden="true" id="producer-side"></a><a href="#producer-side" 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 [...]
+<p>This diagram illustrates how does schema work on the Producer side.</p>
+<p><img src="/docs/assets/schema-producer.png" alt="Schema works at the producer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a producer instance.</p>
+<p>The schema instance defines the schema for the data being produced using the producer instance.</p>
+<p>Take AVRO as an example, Pulsar extract schema definition from the POJO class and construct the <code>SchemaInfo</code> that the producer needs to pass to a broker when it connects.</p></li>
+<li><p>The producer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the producer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the producer.</p>
+<p>All the messages produced by this producer are tagged with the schema version.</p></li>
+<li><p>If the schema is incompatible, the broker rejects it.</p></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="consumer-side"></a><a href="#consumer-side" 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 [...]
+<p>This diagram illustrates how does Schema work on the consumer side.</p>
+<p><img src="/docs/assets/schema-consumer.png" alt="Schema works at the consumer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a consumer instance.</p>
+<p>The schema instance defines the schema that the consumer uses for decoding messages received from a broker.</p></li>
+<li><p>The consumer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the consumer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the consumer.</p></li>
+<li><p>If the schema is incompatible, the consumer will be disconnected.</p></li>
+<li><p>The consumer receives the messages from the broker.</p>
+<p>If the schema used by the consumer supports schema versioning (for example, AVRO schema), the consumer fetches the <code>SchemaInfo</code> of the version tagged in messages, and use the passed-in schema and the schema tagged in messages to decode the messages.</p></li>
+</ol>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#schemainfo">SchemaInfo</a></li><li><a href="#schema-type">Schema type</a><ul class="toc-headings"><li><a href="#primitive-type">Primitive type</a></li><li><a href="#complex-type">Complex type</a></li><li><a href="#auto-schema">Auto Schema</a></li><li><a href="#auto_consume">AUTO_CONSUME</a></li></ul></li><li><a href="#schema-version">Schema version</a></ [...]
+      const community = document.querySelector("a[href='#community']").parentNode;
+      const communityMenu =
+        '<li>' +
+        '<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
+        '<div id="community-dropdown" class="hide">' +
+          '<ul id="community-dropdown-items">' +
+            '<li><a href="/fr/contact">Contact</a></li>' +
+            '<li><a href="/fr/contributing">Contributing</a></li>' +
+            '<li><a href="/fr/events">Events</a></li>' +
+            '<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
+            '<li>&nbsp;</li>' +
+            '<li><a href="/fr/resources">Resources</a></li>' +
+            '<li><a href="/fr/team">Team</a></li>' +
+          '</ul>' +
+        '</div>' +
+        '</li>';
+
+      community.innerHTML = communityMenu;
+
+      const communityMenuItem = document.getElementById("community-menu");
+      const communityDropDown = document.getElementById("community-dropdown");
+      communityMenuItem.addEventListener("click", function(event) {
+        event.preventDefault();
+
+        if (communityDropDown.className == 'hide') {
+          communityDropDown.className = 'visible';
+        } else {
+          communityDropDown.className = 'hide';
+        }
+      });
+    </script></span><span><script src="/js/pjax-api.min.js"></script><script>window.navfoo = new Pjax({
+            areas: [
+              // try to use the first query.
+              '.mainContainer, .docsNavContainer .toc .navWrapper, .onPageNav',
+              // fallback
+              'body'
+            ],
+            link: '.docsNavContainer:not(.docsSliderActive) a',
+            update: {
+              script: false,
+            }
+          });
+        </script></span></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</scri [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: 'd226a455cecdd4bc18a554c1b47e5b52',
+                indexName: 'apache_pulsar',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:fr","version:next"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/ja/next/schema-understand.html b/content/docs/ja/next/schema-understand.html
new file mode 100644
index 0000000..82ee795
--- /dev/null
+++ b/content/docs/ja/next/schema-understand.html
@@ -0,0 +1,474 @@
+<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Understand schema · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="## SchemaInfo"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="ja"/><meta property="og:title" content="Understand schema · Apache Pulsar"/><meta property="og: [...]
+              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+              })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+              ga('create', 'UA-102219959-1', 'auto');
+              ga('send', 'pageview');
+            </script><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sid [...]
+        const languagesMenuItem = document.getElementById("languages-menu");
+        const languagesDropDown = document.getElementById("languages-dropdown");
+        languagesMenuItem.addEventListener("click", function(event) {
+          event.preventDefault();
+
+          if (languagesDropDown.className == "hide") {
+            languagesDropDown.className = "visible";
+          } else {
+            languagesDropDown.className = "hide";
+          }
+        });
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/ja" target="_blank" rel="noreferrer noopener">Transla [...]
+<p>Pulsar schema is defined in a data structure called <code>SchemaInfo</code>.</p>
+<p>The <code>SchemaInfo</code> is stored and enforced on a per-topic basis and cannot be stored at the namespace or tenant level.</p>
+<p>A <code>SchemaInfo</code> consists of the following fields:</p>
+<table style="table">
+  <tr>
+    <th>
+      Field
+    </th>
+<pre><code class="hljs">&lt;th&gt;
+  Description
+&lt;/th&gt;
+</code></pre>
+  </tr>
+  <tr>
+<td> 
+<p><code>name</code></p>
+</td> 
+<td> 
+<p>Schema name (a string).</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>type</code></p>
+</td> 
+<td> 
+<p>Schema type, which determines how to interpret the schema data.</p>
+<ul>
+<li><p>Predefined schema: see <a href="schema-undstand.md#schema-type">here</a>.</p></li>
+<li><p>Customized schema: it is left as an empty string.</p></li>
+</ul>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>schema</code>(<code>payload</code>)</p>
+</td> 
+<td> 
+<p>Schema data, which is a sequence of 8-bit unsigned bytes and schema-type specific.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>properties</code></p>
+</td> 
+<pre><code class="hljs">&lt;td&gt;
+  It is a user defined properties as a string/string map. Applications can use this bag for carrying any application specific logics. Possible properties might be the Git hash associated with the schema, an environment string like `dev` or `prod`.
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<p><strong>Example</strong></p>
+<p>This is the <code>SchemaInfo</code> of a string.</p>
+<pre><code class="hljs css language-text">{
+    “name”: “test-string-schema”,
+    “type”: “STRING”,
+    “schema”: “”,
+    “properties”: {}
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-type"></a><a href="#schema-type" 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 [...]
+<p>Pulsar supports various schema types, which are mainly divided into two categories:</p>
+<ul>
+<li><p>Primitive type</p></li>
+<li><p>Complex type</p></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="primitive-type"></a><a href="#primitive-type" 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- [...]
+<p>Currently, Pulsar supports the following primitive types:</p>
+<table>
+<thead>
+<tr><th>Primitive Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BOOLEAN</code></td><td>A binary value</td></tr>
+<tr><td><code>INT8</code></td><td>A 8-bit signed integer</td></tr>
+<tr><td><code>INT16</code></td><td>A 16-bit signed integer</td></tr>
+<tr><td><code>INT32</code></td><td>A 32-bit signed integer</td></tr>
+<tr><td><code>INT64</code></td><td>A 64-bit signed integer</td></tr>
+<tr><td><code>FLOAT</code></td><td>A single precision (32-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>DOUBLE</code></td><td>A double-precision (64-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>BYTES</code></td><td>A sequence of 8-bit unsigned bytes</td></tr>
+<tr><td><code>STRING</code></td><td>A Unicode character sequence</td></tr>
+<tr><td><code>TIMESTAMP</code> (<code>DATE</code>, <code>TIME</code>)</td><td>A logic type represents a specific instant in time with millisecond precision.</td></tr>
+<tr><td>It stores the number of milliseconds since <code>January 1, 1970, 00:00:00 GMT</code> as an <code>INT64</code> value</td></tr>
+</tbody>
+</table>
+<p>For primitive types, Pulsar does not store any schema data in <code>SchemaInfo</code>. The <code>type</code> in <code>SchemaInfo</code> is used to determine how to serialize and deserialize the data.</p>
+<p>Some of the primitive schema implementations can use <code>properties</code> to store implementation-specific tunable settings. For example, a <code>string</code> schema can use <code>properties</code> to store the encoding charset to serialize and deserialize strings.</p>
+<p>The conversions between <strong>Pulsar schema types</strong> and <strong>language-specific primitive types</strong> are as below.</p>
+<table>
+<thead>
+<tr><th>Schema Type</th><th>Java Type</th><th>Python Type</th><th>Go Type</th></tr>
+</thead>
+<tbody>
+<tr><td>BOOLEAN</td><td>boolean</td><td>bool</td><td>bool</td></tr>
+<tr><td>INT8</td><td>byte</td><td></td><td>int8</td></tr>
+<tr><td>INT16</td><td>short</td><td></td><td>int16</td></tr>
+<tr><td>INT32</td><td>int</td><td></td><td>int32</td></tr>
+<tr><td>INT64</td><td>long</td><td></td><td>int64</td></tr>
+<tr><td>FLOAT</td><td>float</td><td>float</td><td>float32</td></tr>
+<tr><td>DOUBLE</td><td>double</td><td>float</td><td>float64</td></tr>
+<tr><td>BYTES</td><td>byte[], ByteBuffer, ByteBuf</td><td>bytes</td><td>[]byte</td></tr>
+<tr><td>STRING</td><td>string</td><td>str</td><td>string</td></tr>
+<tr><td>TIMESTAMP</td><td>java.sql.Timestamp</td><td></td><td></td></tr>
+<tr><td>TIME</td><td>java.sql.Time</td><td></td><td></td></tr>
+<tr><td>DATE</td><td>java.util.Date</td><td></td><td></td></tr>
+</tbody>
+</table>
+<p><strong>Example</strong></p>
+<p>This example demonstrates how to use a string schema.</p>
+<ol>
+<li><p>Create a producer with a string schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<String> producer = client.newProducer(Schema.STRING).create();
+producer.newMessage().value("Hello Pulsar!").send();
+</code></pre></li>
+<li><p>Create a consumer with a string schema and receive messages.</p>
+<pre><code class="hljs css language-text">Consumer<String> consumer = client.newConsumer(Schema.STRING).create();
+consumer.receive();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="complex-type"></a><a href="#complex-type" 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. [...]
+<p>Currently, Pulsar supports the following complex types:</p>
+<table>
+<thead>
+<tr><th>Complex Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>keyvalue</code></td><td>Represents a complex type of a key/value pair.</td></tr>
+<tr><td><code>struct</code></td><td>Supports <strong>AVRO</strong>, <strong>JSON</strong>, and <strong>Protobuf</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="keyvalue"></a><a href="#keyvalue" 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  [...]
+<p><code>Keyvalue</code> schema helps applications define schemas for both key and value.</p>
+<p>For <code>SchemaInfo</code> of <code>keyvalue</code> schema, Pulsar stores the <code>SchemaInfo</code> of key schema and the <code>SchemaInfo</code> of value schema together.</p>
+<p>Pulsar provides two methods to encode a key/value pair in messages:</p>
+<ul>
+<li><p><code>INLINE</code></p></li>
+<li><p><code>SEPARATED</code></p></li>
+</ul>
+<p>Users can choose the encoding type when constructing the key/value schema.</p>
+<h5><a class="anchor" aria-hidden="true" id="inline"></a><a href="#inline" 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. [...]
+<p>Key/value pairs will be encoded together in the message payload.</p>
+<h5><a class="anchor" aria-hidden="true" id="separated"></a><a href="#separated" 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.6 [...]
+<p>Key will be encoded in the message key and the value will be encoded in the message payload.</p>
+<p><strong>Example</strong></p>
+<p>This example shows how to construct a key/value schema and then use it to produce and consume messages.</p>
+<ol>
+<li><p>Construct a key/value schema with <code>INLINE</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.INLINE
+);
+</code></pre></li>
+<li><p>Optionally, construct a key/value schema with <code>SEPARATED</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+</code></pre></li>
+<li><p>Produce messages using a key/value schema.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+
+Producer<KeyValue<Integer, String>> producer = client.newProducer(kvSchema)
+    .topic(TOPIC)
+    .create();
+
+final int key = 100;
+final String value = "value-100”;
+
+// send the key/value message
+producer.newMessage()
+.value(new KeyValue<>(key, value))
+.send();
+</code></pre></li>
+<li><p>Consume messages using a key/value schema.</p>
+<pre><code class="hljs">Schema&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.<span class="hljs-built_in">STRING</span>,
+KeyValueEncodingType.SEPARATED
+);
+
+Consumer&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; consumer = client.newConsumer(kvSchema)
+    <span class="hljs-params">...</span>
+    .topic(TOPIC)
+    .subscriptionName(SubscriptionName).subscribe();
+
+<span class="hljs-comment">// receive key/value pair</span>
+Message&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; msg = consumer.receive();
+KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt; kv = msg.getValue();
+</code></pre></li>
+</ol>
+<h4><a class="anchor" aria-hidden="true" id="struct"></a><a href="#struct" 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. [...]
+<p>Pulsar uses <a href="http://avro.apache.org/docs/current/spec.html">Avro Specification</a> to declare the schema definition for <code>struct</code> schema.</p>
+<p>This allows Pulsar:</p>
+<ul>
+<li><p>to use same tools to manage schema definitions</p></li>
+<li><p>to use different serialization/deserialization methods to handle data</p></li>
+</ul>
+<p>There are two methods to use <code>struct</code> schema:</p>
+<ul>
+<li><p><code>static</code></p></li>
+<li><p><code>generic</code></p></li>
+</ul>
+<h5><a class="anchor" aria-hidden="true" id="static"></a><a href="#static" 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. [...]
+<p>You can predefine the <code>struct</code> schema, and it can be a POJO in Java, a <code>struct</code> in Go, or classes generated by Avro or Protobuf tools.</p>
+<p><strong>Example</strong></p>
+<p>Pulsar gets the schema definition from the predefined <code>struct</code> using an Avro library. The schema definition is the schema data stored as a part of the <code>SchemaInfo</code>.</p>
+<ol>
+<li><p>Create the <em>User</em> class to define the messages sent to Pulsar topics.</p>
+<pre><code class="hljs css language-text">public class User {
+    String name;
+    int age;
+}
+</code></pre></li>
+<li><p>Create a producer with a <code>struct</code> schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<User> producer = client.newProducer(Schema.AVRO(User.class)).create();
+producer.newMessage().value(User.builder().userName("pulsar-user").userId(1L).build()).send();
+</code></pre></li>
+<li><p>Create a consumer with a <code>struct</code> schema and receive messages</p>
+<pre><code class="hljs css language-text">Consumer<User> consumer = client.newConsumer(Schema.AVRO(User.class)).create();
+User user = consumer.receive();
+</code></pre></li>
+</ol>
+<h5><a class="anchor" aria-hidden="true" id="generic"></a><a href="#generic" 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- [...]
+<p>Sometimes applications do not have pre-defined structs, and you can use this method to define schema and access data.</p>
+<p>You can define the <code>struct</code> schema using the <code>GenericSchemaBuilder</code>, generate a generic struct using <code>GenericRecordBuilder</code> and consume messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<ol>
+<li><p>Use <code>RecordSchemaBuilder</code> to build a schema.</p>
+<pre><code class="hljs css language-text">RecordSchemaBuilder recordSchemaBuilder = SchemaBuilder.record("schemaName");
+recordSchemaBuilder.field("intField").type(SchemaType.INT32);
+SchemaInfo schemaInfo = recordSchemaBuilder.build(SchemaType.AVRO);
+
+Producer<GenericRecord> producer = client.newProducer(Schema.generic(schemaInfo)).create();
+</code></pre></li>
+<li><p>Use <code>RecordBuilder</code> to build the struct records.</p>
+<pre><code class="hljs css language-text">producer.newMessage().value(schema.newRecordBuilder()
+            .set("intField", 32)
+            .build()).send();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="auto-schema"></a><a href="#auto-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 [...]
+<p>If you don't know the schema type of a Pulsar topic in advance, you can use AUTO schema to produce or consume generic records to or from brokers.</p>
+<table>
+<thead>
+<tr><th>Auto Schema Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>AUTO_PRODUCE</code></td><td>This is useful for transferring data <strong>from a producer to a Pulsar topic that has a schema</strong>.</td></tr>
+<tr><td><code>AUTO_CONSUME</code></td><td>This is useful for transferring data <strong>from a Pulsar topic that has a schema to a consumer</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="auto_produce"></a><a href="#auto_produce" 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. [...]
+<p><code>AUTO_PRODUCE</code> schema helps a producer validate whether the bytes sent by the producer is compatible with the schema of a topic.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a producer processing messages from a Kafka topic <em>K</em>.</p></li>
+<li><p>You have a Pulsar topic <em>P</em>, and you do not know its schema type.</p></li>
+<li><p>Your application reads the messages from <em>K</em> and writes the messages to <em>P</em>.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_PRODUCE</code> to verify whether the bytes produced by <em>K</em> can be sent to <em>P</em> or not.</p>
+<pre><code class="hljs css language-text">Produce<byte[]> pulsarProducer = client.newProducer(Schema.AUTO_PRODUCE())
+    …
+    .create();
+
+byte[] kafkaMessageBytes = … ; 
+
+pulsarProducer.produce(kafkaMessageBytes);
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="auto_consume"></a><a href="#auto_consume" 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. [...]
+<p><code>AUTO_CONSUME</code> schema helps a Pulsar topic validate whether the bytes sent by a Pulsar topic is compatible with a consumer, that is, the Pulsar topic deserializes messages into language-specific objects using the <code>SchemaInfo</code> retrieved from broker-side.</p>
+<p>Currently, <code>AUTO_CONSUME</code> only supports <strong>AVRO</strong> and <strong>JSON</strong> schemas. It deserializes messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a Pulsar topic <em>P</em>.</p></li>
+<li><p>You have a consumer (for example, MySQL) receiving messages from the topic <em>P</em>.</p></li>
+<li><p>You application reads the messages from <em>P</em> and writes the messages to MySQL.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_CONSUME</code> to verify whether the bytes produced by <em>P</em> can be sent to MySQL or not.</p>
+<pre><code class="hljs css language-text">Consumer<GenericRecord> pulsarConsumer = client.newConsumer(Schema.AUTO_CONSUME())
+    …
+    .subscribe();
+
+Message<GenericRecord> msg = consumer.receive() ; 
+GenericRecord record = msg.getValue();
+…
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-version"></a><a href="#schema-version" 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- [...]
+<p>Each <code>SchemaInfo</code> stored with a topic has a version. Schema version manages schema changes happening within a topic.</p>
+<p>Messages produced with a given <code>SchemaInfo</code> is tagged with a schema version, so when a message is consumed by a Pulsar client, the Pulsar client can use the schema version to retrieve the corresponding <code>SchemaInfo</code> and then use the <code>SchemaInfo</code> to deserialize data.</p>
+<p>Schemas are versioned in succession. Schema storage happens in a broker that handles the associated topics so that version assignments can be made.</p>
+<p>Once a version is assigned/fetched to/for a schema, all subsequent messages produced by that producer are tagged with the appropriate version.</p>
+<p><strong>Example</strong></p>
+<p>The following example illustrates how the schema version works.</p>
+<p>Suppose that a Pulsar <a href="/docs/ja/next/client-libraries-java">Java client</a> created using the code below attempts to connect to Pulsar and begins to send messages:</p>
+<pre><code class="hljs css language-text">PulsarClient client = PulsarClient.builder()
+        .serviceUrl("pulsar://localhost:6650")
+        .build();
+
+Producer<SensorReading> producer = client.newProducer(JSONSchema.of(SensorReading.class))
+        .topic("sensor-data")
+        .sendTimeout(3, TimeUnit.SECONDS)
+        .create();
+</code></pre>
+<p>The table below lists the possible scenarios when this connection attempt occurs and what happens in each scenario:</p>
+<table class="table">
+  <tr>
+<th>Scenario</th>
+<th>What happens</th>
+  </tr>
+  <tr>
+<td> 
+<ul>
+<li>No schema exists for the topic.</li>
+</ul>
+</td>
+<td> 
+<p>(1) The producer is created using the given schema.</p>
+<p>(2) Since no existing schema is compatible with the <code>SensorReading</code> schema, the schema is transmitted to the broker and stored.</p>
+<p>(3) Any consumer created using the same schema or topic can consume messages from the <code>sensor-data</code> topic.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using the same schema that is already stored.</p></li>
+</ul>
+</td>
+<td> 
+<p>(1) The schema is transmitted to the broker.</p>
+<p>(2) The broker determines that the schema is compatible.</p>
+<p>(3) The broker attempts to store the schema in <a href="/docs/ja/next/concepts-architecture-overview#persistent-storage">BookKeeper</a> but then determines that it's already stored, so it is used to tag produced messages.</p>
+</td>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using a new schema that is compatible.</p></li>
+</ul>
+</td>
+<pre><code class="hljs">&lt;td&gt;
+  (1) The schema is transmitted to the broker. (2) The broker determines that the schema is compatible and stores the new schema as the current version (with a new version number).
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="how-does-schema-work"></a><a href="#how-does-schema-work" 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 [...]
+<p>Pulsar schemas are applied and enforced at the <strong>topic</strong> level (schemas cannot be applied at the namespace or tenant level).</p>
+<p>Producers and consumers upload schemas to brokers, so Pulsar schemas work on the producer side and the consumer side.</p>
+<h3><a class="anchor" aria-hidden="true" id="producer-side"></a><a href="#producer-side" 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 [...]
+<p>This diagram illustrates how does schema work on the Producer side.</p>
+<p><img src="/docs/assets/schema-producer.png" alt="Schema works at the producer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a producer instance.</p>
+<p>The schema instance defines the schema for the data being produced using the producer instance.</p>
+<p>Take AVRO as an example, Pulsar extract schema definition from the POJO class and construct the <code>SchemaInfo</code> that the producer needs to pass to a broker when it connects.</p></li>
+<li><p>The producer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the producer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the producer.</p>
+<p>All the messages produced by this producer are tagged with the schema version.</p></li>
+<li><p>If the schema is incompatible, the broker rejects it.</p></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="consumer-side"></a><a href="#consumer-side" 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 [...]
+<p>This diagram illustrates how does Schema work on the consumer side.</p>
+<p><img src="/docs/assets/schema-consumer.png" alt="Schema works at the consumer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a consumer instance.</p>
+<p>The schema instance defines the schema that the consumer uses for decoding messages received from a broker.</p></li>
+<li><p>The consumer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the consumer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the consumer.</p></li>
+<li><p>If the schema is incompatible, the consumer will be disconnected.</p></li>
+<li><p>The consumer receives the messages from the broker.</p>
+<p>If the schema used by the consumer supports schema versioning (for example, AVRO schema), the consumer fetches the <code>SchemaInfo</code> of the version tagged in messages, and use the passed-in schema and the schema tagged in messages to decode the messages.</p></li>
+</ol>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#schemainfo">SchemaInfo</a></li><li><a href="#schema-type">Schema type</a><ul class="toc-headings"><li><a href="#primitive-type">Primitive type</a></li><li><a href="#complex-type">Complex type</a></li><li><a href="#auto-schema">Auto Schema</a></li><li><a href="#auto_consume">AUTO_CONSUME</a></li></ul></li><li><a href="#schema-version">Schema version</a></ [...]
+      const community = document.querySelector("a[href='#community']").parentNode;
+      const communityMenu =
+        '<li>' +
+        '<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
+        '<div id="community-dropdown" class="hide">' +
+          '<ul id="community-dropdown-items">' +
+            '<li><a href="/ja/contact">Contact</a></li>' +
+            '<li><a href="/ja/contributing">Contributing</a></li>' +
+            '<li><a href="/ja/events">Events</a></li>' +
+            '<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
+            '<li>&nbsp;</li>' +
+            '<li><a href="/ja/resources">Resources</a></li>' +
+            '<li><a href="/ja/team">Team</a></li>' +
+          '</ul>' +
+        '</div>' +
+        '</li>';
+
+      community.innerHTML = communityMenu;
+
+      const communityMenuItem = document.getElementById("community-menu");
+      const communityDropDown = document.getElementById("community-dropdown");
+      communityMenuItem.addEventListener("click", function(event) {
+        event.preventDefault();
+
+        if (communityDropDown.className == 'hide') {
+          communityDropDown.className = 'visible';
+        } else {
+          communityDropDown.className = 'hide';
+        }
+      });
+    </script></span><span><script src="/js/pjax-api.min.js"></script><script>window.navfoo = new Pjax({
+            areas: [
+              // try to use the first query.
+              '.mainContainer, .docsNavContainer .toc .navWrapper, .onPageNav',
+              // fallback
+              'body'
+            ],
+            link: '.docsNavContainer:not(.docsSliderActive) a',
+            update: {
+              script: false,
+            }
+          });
+        </script></span></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</scri [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: 'd226a455cecdd4bc18a554c1b47e5b52',
+                indexName: 'apache_pulsar',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:ja","version:next"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/ja/next/schema-understand/index.html b/content/docs/ja/next/schema-understand/index.html
new file mode 100644
index 0000000..82ee795
--- /dev/null
+++ b/content/docs/ja/next/schema-understand/index.html
@@ -0,0 +1,474 @@
+<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Understand schema · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="## SchemaInfo"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="ja"/><meta property="og:title" content="Understand schema · Apache Pulsar"/><meta property="og: [...]
+              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+              })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+              ga('create', 'UA-102219959-1', 'auto');
+              ga('send', 'pageview');
+            </script><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sid [...]
+        const languagesMenuItem = document.getElementById("languages-menu");
+        const languagesDropDown = document.getElementById("languages-dropdown");
+        languagesMenuItem.addEventListener("click", function(event) {
+          event.preventDefault();
+
+          if (languagesDropDown.className == "hide") {
+            languagesDropDown.className = "visible";
+          } else {
+            languagesDropDown.className = "hide";
+          }
+        });
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/ja" target="_blank" rel="noreferrer noopener">Transla [...]
+<p>Pulsar schema is defined in a data structure called <code>SchemaInfo</code>.</p>
+<p>The <code>SchemaInfo</code> is stored and enforced on a per-topic basis and cannot be stored at the namespace or tenant level.</p>
+<p>A <code>SchemaInfo</code> consists of the following fields:</p>
+<table style="table">
+  <tr>
+    <th>
+      Field
+    </th>
+<pre><code class="hljs">&lt;th&gt;
+  Description
+&lt;/th&gt;
+</code></pre>
+  </tr>
+  <tr>
+<td> 
+<p><code>name</code></p>
+</td> 
+<td> 
+<p>Schema name (a string).</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>type</code></p>
+</td> 
+<td> 
+<p>Schema type, which determines how to interpret the schema data.</p>
+<ul>
+<li><p>Predefined schema: see <a href="schema-undstand.md#schema-type">here</a>.</p></li>
+<li><p>Customized schema: it is left as an empty string.</p></li>
+</ul>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>schema</code>(<code>payload</code>)</p>
+</td> 
+<td> 
+<p>Schema data, which is a sequence of 8-bit unsigned bytes and schema-type specific.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>properties</code></p>
+</td> 
+<pre><code class="hljs">&lt;td&gt;
+  It is a user defined properties as a string/string map. Applications can use this bag for carrying any application specific logics. Possible properties might be the Git hash associated with the schema, an environment string like `dev` or `prod`.
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<p><strong>Example</strong></p>
+<p>This is the <code>SchemaInfo</code> of a string.</p>
+<pre><code class="hljs css language-text">{
+    “name”: “test-string-schema”,
+    “type”: “STRING”,
+    “schema”: “”,
+    “properties”: {}
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-type"></a><a href="#schema-type" 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 [...]
+<p>Pulsar supports various schema types, which are mainly divided into two categories:</p>
+<ul>
+<li><p>Primitive type</p></li>
+<li><p>Complex type</p></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="primitive-type"></a><a href="#primitive-type" 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- [...]
+<p>Currently, Pulsar supports the following primitive types:</p>
+<table>
+<thead>
+<tr><th>Primitive Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BOOLEAN</code></td><td>A binary value</td></tr>
+<tr><td><code>INT8</code></td><td>A 8-bit signed integer</td></tr>
+<tr><td><code>INT16</code></td><td>A 16-bit signed integer</td></tr>
+<tr><td><code>INT32</code></td><td>A 32-bit signed integer</td></tr>
+<tr><td><code>INT64</code></td><td>A 64-bit signed integer</td></tr>
+<tr><td><code>FLOAT</code></td><td>A single precision (32-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>DOUBLE</code></td><td>A double-precision (64-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>BYTES</code></td><td>A sequence of 8-bit unsigned bytes</td></tr>
+<tr><td><code>STRING</code></td><td>A Unicode character sequence</td></tr>
+<tr><td><code>TIMESTAMP</code> (<code>DATE</code>, <code>TIME</code>)</td><td>A logic type represents a specific instant in time with millisecond precision.</td></tr>
+<tr><td>It stores the number of milliseconds since <code>January 1, 1970, 00:00:00 GMT</code> as an <code>INT64</code> value</td></tr>
+</tbody>
+</table>
+<p>For primitive types, Pulsar does not store any schema data in <code>SchemaInfo</code>. The <code>type</code> in <code>SchemaInfo</code> is used to determine how to serialize and deserialize the data.</p>
+<p>Some of the primitive schema implementations can use <code>properties</code> to store implementation-specific tunable settings. For example, a <code>string</code> schema can use <code>properties</code> to store the encoding charset to serialize and deserialize strings.</p>
+<p>The conversions between <strong>Pulsar schema types</strong> and <strong>language-specific primitive types</strong> are as below.</p>
+<table>
+<thead>
+<tr><th>Schema Type</th><th>Java Type</th><th>Python Type</th><th>Go Type</th></tr>
+</thead>
+<tbody>
+<tr><td>BOOLEAN</td><td>boolean</td><td>bool</td><td>bool</td></tr>
+<tr><td>INT8</td><td>byte</td><td></td><td>int8</td></tr>
+<tr><td>INT16</td><td>short</td><td></td><td>int16</td></tr>
+<tr><td>INT32</td><td>int</td><td></td><td>int32</td></tr>
+<tr><td>INT64</td><td>long</td><td></td><td>int64</td></tr>
+<tr><td>FLOAT</td><td>float</td><td>float</td><td>float32</td></tr>
+<tr><td>DOUBLE</td><td>double</td><td>float</td><td>float64</td></tr>
+<tr><td>BYTES</td><td>byte[], ByteBuffer, ByteBuf</td><td>bytes</td><td>[]byte</td></tr>
+<tr><td>STRING</td><td>string</td><td>str</td><td>string</td></tr>
+<tr><td>TIMESTAMP</td><td>java.sql.Timestamp</td><td></td><td></td></tr>
+<tr><td>TIME</td><td>java.sql.Time</td><td></td><td></td></tr>
+<tr><td>DATE</td><td>java.util.Date</td><td></td><td></td></tr>
+</tbody>
+</table>
+<p><strong>Example</strong></p>
+<p>This example demonstrates how to use a string schema.</p>
+<ol>
+<li><p>Create a producer with a string schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<String> producer = client.newProducer(Schema.STRING).create();
+producer.newMessage().value("Hello Pulsar!").send();
+</code></pre></li>
+<li><p>Create a consumer with a string schema and receive messages.</p>
+<pre><code class="hljs css language-text">Consumer<String> consumer = client.newConsumer(Schema.STRING).create();
+consumer.receive();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="complex-type"></a><a href="#complex-type" 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. [...]
+<p>Currently, Pulsar supports the following complex types:</p>
+<table>
+<thead>
+<tr><th>Complex Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>keyvalue</code></td><td>Represents a complex type of a key/value pair.</td></tr>
+<tr><td><code>struct</code></td><td>Supports <strong>AVRO</strong>, <strong>JSON</strong>, and <strong>Protobuf</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="keyvalue"></a><a href="#keyvalue" 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  [...]
+<p><code>Keyvalue</code> schema helps applications define schemas for both key and value.</p>
+<p>For <code>SchemaInfo</code> of <code>keyvalue</code> schema, Pulsar stores the <code>SchemaInfo</code> of key schema and the <code>SchemaInfo</code> of value schema together.</p>
+<p>Pulsar provides two methods to encode a key/value pair in messages:</p>
+<ul>
+<li><p><code>INLINE</code></p></li>
+<li><p><code>SEPARATED</code></p></li>
+</ul>
+<p>Users can choose the encoding type when constructing the key/value schema.</p>
+<h5><a class="anchor" aria-hidden="true" id="inline"></a><a href="#inline" 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. [...]
+<p>Key/value pairs will be encoded together in the message payload.</p>
+<h5><a class="anchor" aria-hidden="true" id="separated"></a><a href="#separated" 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.6 [...]
+<p>Key will be encoded in the message key and the value will be encoded in the message payload.</p>
+<p><strong>Example</strong></p>
+<p>This example shows how to construct a key/value schema and then use it to produce and consume messages.</p>
+<ol>
+<li><p>Construct a key/value schema with <code>INLINE</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.INLINE
+);
+</code></pre></li>
+<li><p>Optionally, construct a key/value schema with <code>SEPARATED</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+</code></pre></li>
+<li><p>Produce messages using a key/value schema.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+
+Producer<KeyValue<Integer, String>> producer = client.newProducer(kvSchema)
+    .topic(TOPIC)
+    .create();
+
+final int key = 100;
+final String value = "value-100”;
+
+// send the key/value message
+producer.newMessage()
+.value(new KeyValue<>(key, value))
+.send();
+</code></pre></li>
+<li><p>Consume messages using a key/value schema.</p>
+<pre><code class="hljs">Schema&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.<span class="hljs-built_in">STRING</span>,
+KeyValueEncodingType.SEPARATED
+);
+
+Consumer&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; consumer = client.newConsumer(kvSchema)
+    <span class="hljs-params">...</span>
+    .topic(TOPIC)
+    .subscriptionName(SubscriptionName).subscribe();
+
+<span class="hljs-comment">// receive key/value pair</span>
+Message&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; msg = consumer.receive();
+KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt; kv = msg.getValue();
+</code></pre></li>
+</ol>
+<h4><a class="anchor" aria-hidden="true" id="struct"></a><a href="#struct" 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. [...]
+<p>Pulsar uses <a href="http://avro.apache.org/docs/current/spec.html">Avro Specification</a> to declare the schema definition for <code>struct</code> schema.</p>
+<p>This allows Pulsar:</p>
+<ul>
+<li><p>to use same tools to manage schema definitions</p></li>
+<li><p>to use different serialization/deserialization methods to handle data</p></li>
+</ul>
+<p>There are two methods to use <code>struct</code> schema:</p>
+<ul>
+<li><p><code>static</code></p></li>
+<li><p><code>generic</code></p></li>
+</ul>
+<h5><a class="anchor" aria-hidden="true" id="static"></a><a href="#static" 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. [...]
+<p>You can predefine the <code>struct</code> schema, and it can be a POJO in Java, a <code>struct</code> in Go, or classes generated by Avro or Protobuf tools.</p>
+<p><strong>Example</strong></p>
+<p>Pulsar gets the schema definition from the predefined <code>struct</code> using an Avro library. The schema definition is the schema data stored as a part of the <code>SchemaInfo</code>.</p>
+<ol>
+<li><p>Create the <em>User</em> class to define the messages sent to Pulsar topics.</p>
+<pre><code class="hljs css language-text">public class User {
+    String name;
+    int age;
+}
+</code></pre></li>
+<li><p>Create a producer with a <code>struct</code> schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<User> producer = client.newProducer(Schema.AVRO(User.class)).create();
+producer.newMessage().value(User.builder().userName("pulsar-user").userId(1L).build()).send();
+</code></pre></li>
+<li><p>Create a consumer with a <code>struct</code> schema and receive messages</p>
+<pre><code class="hljs css language-text">Consumer<User> consumer = client.newConsumer(Schema.AVRO(User.class)).create();
+User user = consumer.receive();
+</code></pre></li>
+</ol>
+<h5><a class="anchor" aria-hidden="true" id="generic"></a><a href="#generic" 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- [...]
+<p>Sometimes applications do not have pre-defined structs, and you can use this method to define schema and access data.</p>
+<p>You can define the <code>struct</code> schema using the <code>GenericSchemaBuilder</code>, generate a generic struct using <code>GenericRecordBuilder</code> and consume messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<ol>
+<li><p>Use <code>RecordSchemaBuilder</code> to build a schema.</p>
+<pre><code class="hljs css language-text">RecordSchemaBuilder recordSchemaBuilder = SchemaBuilder.record("schemaName");
+recordSchemaBuilder.field("intField").type(SchemaType.INT32);
+SchemaInfo schemaInfo = recordSchemaBuilder.build(SchemaType.AVRO);
+
+Producer<GenericRecord> producer = client.newProducer(Schema.generic(schemaInfo)).create();
+</code></pre></li>
+<li><p>Use <code>RecordBuilder</code> to build the struct records.</p>
+<pre><code class="hljs css language-text">producer.newMessage().value(schema.newRecordBuilder()
+            .set("intField", 32)
+            .build()).send();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="auto-schema"></a><a href="#auto-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 [...]
+<p>If you don't know the schema type of a Pulsar topic in advance, you can use AUTO schema to produce or consume generic records to or from brokers.</p>
+<table>
+<thead>
+<tr><th>Auto Schema Type</th><th>Description</th></tr>
+</thead>
+<tbody>
+<tr><td><code>AUTO_PRODUCE</code></td><td>This is useful for transferring data <strong>from a producer to a Pulsar topic that has a schema</strong>.</td></tr>
+<tr><td><code>AUTO_CONSUME</code></td><td>This is useful for transferring data <strong>from a Pulsar topic that has a schema to a consumer</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="auto_produce"></a><a href="#auto_produce" 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. [...]
+<p><code>AUTO_PRODUCE</code> schema helps a producer validate whether the bytes sent by the producer is compatible with the schema of a topic.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a producer processing messages from a Kafka topic <em>K</em>.</p></li>
+<li><p>You have a Pulsar topic <em>P</em>, and you do not know its schema type.</p></li>
+<li><p>Your application reads the messages from <em>K</em> and writes the messages to <em>P</em>.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_PRODUCE</code> to verify whether the bytes produced by <em>K</em> can be sent to <em>P</em> or not.</p>
+<pre><code class="hljs css language-text">Produce<byte[]> pulsarProducer = client.newProducer(Schema.AUTO_PRODUCE())
+    …
+    .create();
+
+byte[] kafkaMessageBytes = … ; 
+
+pulsarProducer.produce(kafkaMessageBytes);
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="auto_consume"></a><a href="#auto_consume" 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. [...]
+<p><code>AUTO_CONSUME</code> schema helps a Pulsar topic validate whether the bytes sent by a Pulsar topic is compatible with a consumer, that is, the Pulsar topic deserializes messages into language-specific objects using the <code>SchemaInfo</code> retrieved from broker-side.</p>
+<p>Currently, <code>AUTO_CONSUME</code> only supports <strong>AVRO</strong> and <strong>JSON</strong> schemas. It deserializes messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a Pulsar topic <em>P</em>.</p></li>
+<li><p>You have a consumer (for example, MySQL) receiving messages from the topic <em>P</em>.</p></li>
+<li><p>You application reads the messages from <em>P</em> and writes the messages to MySQL.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_CONSUME</code> to verify whether the bytes produced by <em>P</em> can be sent to MySQL or not.</p>
+<pre><code class="hljs css language-text">Consumer<GenericRecord> pulsarConsumer = client.newConsumer(Schema.AUTO_CONSUME())
+    …
+    .subscribe();
+
+Message<GenericRecord> msg = consumer.receive() ; 
+GenericRecord record = msg.getValue();
+…
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-version"></a><a href="#schema-version" 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- [...]
+<p>Each <code>SchemaInfo</code> stored with a topic has a version. Schema version manages schema changes happening within a topic.</p>
+<p>Messages produced with a given <code>SchemaInfo</code> is tagged with a schema version, so when a message is consumed by a Pulsar client, the Pulsar client can use the schema version to retrieve the corresponding <code>SchemaInfo</code> and then use the <code>SchemaInfo</code> to deserialize data.</p>
+<p>Schemas are versioned in succession. Schema storage happens in a broker that handles the associated topics so that version assignments can be made.</p>
+<p>Once a version is assigned/fetched to/for a schema, all subsequent messages produced by that producer are tagged with the appropriate version.</p>
+<p><strong>Example</strong></p>
+<p>The following example illustrates how the schema version works.</p>
+<p>Suppose that a Pulsar <a href="/docs/ja/next/client-libraries-java">Java client</a> created using the code below attempts to connect to Pulsar and begins to send messages:</p>
+<pre><code class="hljs css language-text">PulsarClient client = PulsarClient.builder()
+        .serviceUrl("pulsar://localhost:6650")
+        .build();
+
+Producer<SensorReading> producer = client.newProducer(JSONSchema.of(SensorReading.class))
+        .topic("sensor-data")
+        .sendTimeout(3, TimeUnit.SECONDS)
+        .create();
+</code></pre>
+<p>The table below lists the possible scenarios when this connection attempt occurs and what happens in each scenario:</p>
+<table class="table">
+  <tr>
+<th>Scenario</th>
+<th>What happens</th>
+  </tr>
+  <tr>
+<td> 
+<ul>
+<li>No schema exists for the topic.</li>
+</ul>
+</td>
+<td> 
+<p>(1) The producer is created using the given schema.</p>
+<p>(2) Since no existing schema is compatible with the <code>SensorReading</code> schema, the schema is transmitted to the broker and stored.</p>
+<p>(3) Any consumer created using the same schema or topic can consume messages from the <code>sensor-data</code> topic.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using the same schema that is already stored.</p></li>
+</ul>
+</td>
+<td> 
+<p>(1) The schema is transmitted to the broker.</p>
+<p>(2) The broker determines that the schema is compatible.</p>
+<p>(3) The broker attempts to store the schema in <a href="/docs/ja/next/concepts-architecture-overview#persistent-storage">BookKeeper</a> but then determines that it's already stored, so it is used to tag produced messages.</p>
+</td>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using a new schema that is compatible.</p></li>
+</ul>
+</td>
+<pre><code class="hljs">&lt;td&gt;
+  (1) The schema is transmitted to the broker. (2) The broker determines that the schema is compatible and stores the new schema as the current version (with a new version number).
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="how-does-schema-work"></a><a href="#how-does-schema-work" 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 [...]
+<p>Pulsar schemas are applied and enforced at the <strong>topic</strong> level (schemas cannot be applied at the namespace or tenant level).</p>
+<p>Producers and consumers upload schemas to brokers, so Pulsar schemas work on the producer side and the consumer side.</p>
+<h3><a class="anchor" aria-hidden="true" id="producer-side"></a><a href="#producer-side" 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 [...]
+<p>This diagram illustrates how does schema work on the Producer side.</p>
+<p><img src="/docs/assets/schema-producer.png" alt="Schema works at the producer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a producer instance.</p>
+<p>The schema instance defines the schema for the data being produced using the producer instance.</p>
+<p>Take AVRO as an example, Pulsar extract schema definition from the POJO class and construct the <code>SchemaInfo</code> that the producer needs to pass to a broker when it connects.</p></li>
+<li><p>The producer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the producer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the producer.</p>
+<p>All the messages produced by this producer are tagged with the schema version.</p></li>
+<li><p>If the schema is incompatible, the broker rejects it.</p></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="consumer-side"></a><a href="#consumer-side" 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 [...]
+<p>This diagram illustrates how does Schema work on the consumer side.</p>
+<p><img src="/docs/assets/schema-consumer.png" alt="Schema works at the consumer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a consumer instance.</p>
+<p>The schema instance defines the schema that the consumer uses for decoding messages received from a broker.</p></li>
+<li><p>The consumer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the consumer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the consumer.</p></li>
+<li><p>If the schema is incompatible, the consumer will be disconnected.</p></li>
+<li><p>The consumer receives the messages from the broker.</p>
+<p>If the schema used by the consumer supports schema versioning (for example, AVRO schema), the consumer fetches the <code>SchemaInfo</code> of the version tagged in messages, and use the passed-in schema and the schema tagged in messages to decode the messages.</p></li>
+</ol>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#schemainfo">SchemaInfo</a></li><li><a href="#schema-type">Schema type</a><ul class="toc-headings"><li><a href="#primitive-type">Primitive type</a></li><li><a href="#complex-type">Complex type</a></li><li><a href="#auto-schema">Auto Schema</a></li><li><a href="#auto_consume">AUTO_CONSUME</a></li></ul></li><li><a href="#schema-version">Schema version</a></ [...]
+      const community = document.querySelector("a[href='#community']").parentNode;
+      const communityMenu =
+        '<li>' +
+        '<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
+        '<div id="community-dropdown" class="hide">' +
+          '<ul id="community-dropdown-items">' +
+            '<li><a href="/ja/contact">Contact</a></li>' +
+            '<li><a href="/ja/contributing">Contributing</a></li>' +
+            '<li><a href="/ja/events">Events</a></li>' +
+            '<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
+            '<li>&nbsp;</li>' +
+            '<li><a href="/ja/resources">Resources</a></li>' +
+            '<li><a href="/ja/team">Team</a></li>' +
+          '</ul>' +
+        '</div>' +
+        '</li>';
+
+      community.innerHTML = communityMenu;
+
+      const communityMenuItem = document.getElementById("community-menu");
+      const communityDropDown = document.getElementById("community-dropdown");
+      communityMenuItem.addEventListener("click", function(event) {
+        event.preventDefault();
+
+        if (communityDropDown.className == 'hide') {
+          communityDropDown.className = 'visible';
+        } else {
+          communityDropDown.className = 'hide';
+        }
+      });
+    </script></span><span><script src="/js/pjax-api.min.js"></script><script>window.navfoo = new Pjax({
+            areas: [
+              // try to use the first query.
+              '.mainContainer, .docsNavContainer .toc .navWrapper, .onPageNav',
+              // fallback
+              'body'
+            ],
+            link: '.docsNavContainer:not(.docsSliderActive) a',
+            update: {
+              script: false,
+            }
+          });
+        </script></span></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</scri [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: 'd226a455cecdd4bc18a554c1b47e5b52',
+                indexName: 'apache_pulsar',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:ja","version:next"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/next/schema-understand.html b/content/docs/next/schema-understand.html
new file mode 100644
index 0000000..6ced3e2
--- /dev/null
+++ b/content/docs/next/schema-understand.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content=""/><meta property="og:title" content="Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/index.html"/><meta property="og:description" content [...]
+              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+              })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+              ga('create', 'UA-102219959-1', 'auto');
+              ga('send', 'pageview');
+            </script><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body><script>
+                <!--
+                window.location.href = "/docs/en/next/schema-understand";
+                // -->
+                </script></body></html>
\ No newline at end of file
diff --git a/content/docs/next/schema-understand/index.html b/content/docs/next/schema-understand/index.html
new file mode 100644
index 0000000..6ced3e2
--- /dev/null
+++ b/content/docs/next/schema-understand/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content=""/><meta property="og:title" content="Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/index.html"/><meta property="og:description" content [...]
+              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+              })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+              ga('create', 'UA-102219959-1', 'auto');
+              ga('send', 'pageview');
+            </script><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body><script>
+                <!--
+                window.location.href = "/docs/en/next/schema-understand";
+                // -->
+                </script></body></html>
\ No newline at end of file
diff --git a/content/docs/zh-CN/next/schema-understand.html b/content/docs/zh-CN/next/schema-understand.html
new file mode 100644
index 0000000..048a7de
--- /dev/null
+++ b/content/docs/zh-CN/next/schema-understand.html
@@ -0,0 +1,474 @@
+<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Understand schema · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="## SchemaInfo"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="zh-CN"/><meta property="og:title" content="Understand schema · Apache Pulsar"/><meta propert [...]
+              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+              })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+              ga('create', 'UA-102219959-1', 'auto');
+              ga('send', 'pageview');
+            </script><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sid [...]
+        const languagesMenuItem = document.getElementById("languages-menu");
+        const languagesDropDown = document.getElementById("languages-dropdown");
+        languagesMenuItem.addEventListener("click", function(event) {
+          event.preventDefault();
+
+          if (languagesDropDown.className == "hide") {
+            languagesDropDown.className = "visible";
+          } else {
+            languagesDropDown.className = "hide";
+          }
+        });
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/zh-CN" target="_blank" rel="noreferrer noopener">Tran [...]
+<p>Pulsar schema is defined in a data structure called <code>SchemaInfo</code>.</p>
+<p>The <code>SchemaInfo</code> is stored and enforced on a per-topic basis and cannot be stored at the namespace or tenant level.</p>
+<p>A <code>SchemaInfo</code> consists of the following fields:</p>
+<table style="table">
+  <tr>
+    <th>
+      字段
+    </th>
+<pre><code class="hljs">&lt;th&gt;
+  说明:
+&lt;/th&gt;
+</code></pre>
+  </tr>
+  <tr>
+<td> 
+<p><code>name</code></p>
+</td> 
+<td> 
+<p>Schema name (a string).</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>type</code></p>
+</td> 
+<td> 
+<p>Schema type, which determines how to interpret the schema data.</p>
+<ul>
+<li><p>Predefined schema: see <a href="schema-undstand.md#schema-type">here</a>.</p></li>
+<li><p>Customized schema: it is left as an empty string.</p></li>
+</ul>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>schema</code>(<code>payload</code>)</p>
+</td> 
+<td> 
+<p>Schema data, which is a sequence of 8-bit unsigned bytes and schema-type specific.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>properties</code></p>
+</td> 
+<pre><code class="hljs">&lt;td&gt;
+  It is a user defined properties as a string/string map. 应用可以使用这个包裹传递程序指定的逻辑。 Possible properties might be the Git hash associated with the schema, an environment string like `dev` or `prod`.
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<p><strong>Example</strong></p>
+<p>This is the <code>SchemaInfo</code> of a string.</p>
+<pre><code class="hljs css language-text">{
+    “name”: “test-string-schema”,
+    “type”: “STRING”,
+    “schema”: “”,
+    “properties”: {}
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-type"></a><a href="#schema-type" 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 [...]
+<p>Pulsar supports various schema types, which are mainly divided into two categories:</p>
+<ul>
+<li><p>Primitive type</p></li>
+<li><p>Complex type</p></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="primitive-type"></a><a href="#primitive-type" 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- [...]
+<p>Currently, Pulsar supports the following primitive types:</p>
+<table>
+<thead>
+<tr><th>Primitive Type</th><th>说明:</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BOOLEAN</code></td><td>A binary value</td></tr>
+<tr><td><code>INT8</code></td><td>A 8-bit signed integer</td></tr>
+<tr><td><code>INT16</code></td><td>A 16-bit signed integer</td></tr>
+<tr><td><code>INT32</code></td><td>A 32-bit signed integer</td></tr>
+<tr><td><code>INT64</code></td><td>A 64-bit signed integer</td></tr>
+<tr><td><code>FLOAT</code></td><td>A single precision (32-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>DOUBLE</code></td><td>A double-precision (64-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>BYTES</code></td><td>A sequence of 8-bit unsigned bytes</td></tr>
+<tr><td><code>STRING</code></td><td>A Unicode character sequence</td></tr>
+<tr><td><code>TIMESTAMP</code> (<code>DATE</code>, <code>TIME</code>)</td><td>A logic type represents a specific instant in time with millisecond precision.</td></tr>
+<tr><td>It stores the number of milliseconds since <code>January 1, 1970, 00:00:00 GMT</code> as an <code>INT64</code> value</td></tr>
+</tbody>
+</table>
+<p>For primitive types, Pulsar does not store any schema data in <code>SchemaInfo</code>. The <code>type</code> in <code>SchemaInfo</code> is used to determine how to serialize and deserialize the data.</p>
+<p>Some of the primitive schema implementations can use <code>properties</code> to store implementation-specific tunable settings. For example, a <code>string</code> schema can use <code>properties</code> to store the encoding charset to serialize and deserialize strings.</p>
+<p>The conversions between <strong>Pulsar schema types</strong> and <strong>language-specific primitive types</strong> are as below.</p>
+<table>
+<thead>
+<tr><th>Schema Type</th><th>Java Type</th><th>Python 类型</th><th>Go Type</th></tr>
+</thead>
+<tbody>
+<tr><td>BOOLEAN</td><td>boolean</td><td>bool</td><td>bool</td></tr>
+<tr><td>INT8</td><td>byte</td><td></td><td>int8</td></tr>
+<tr><td>INT16</td><td>short</td><td></td><td>int16</td></tr>
+<tr><td>INT32</td><td>int</td><td></td><td>int32</td></tr>
+<tr><td>INT64</td><td>long</td><td></td><td>int64</td></tr>
+<tr><td>FLOAT</td><td>float</td><td>float</td><td>float32</td></tr>
+<tr><td>DOUBLE</td><td>double</td><td>float</td><td>float64</td></tr>
+<tr><td>BYTES</td><td>byte[], ByteBuffer, ByteBuf</td><td>bytes</td><td>[]byte</td></tr>
+<tr><td>STRING</td><td>string</td><td>str</td><td>string</td></tr>
+<tr><td>TIMESTAMP</td><td>java.sql.Timestamp</td><td></td><td></td></tr>
+<tr><td>TIME</td><td>java.sql.Time</td><td></td><td></td></tr>
+<tr><td>DATE</td><td>java.util.Date</td><td></td><td></td></tr>
+</tbody>
+</table>
+<p><strong>Example</strong></p>
+<p>This example demonstrates how to use a string schema.</p>
+<ol>
+<li><p>Create a producer with a string schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<String> producer = client.newProducer(Schema.STRING).create();
+producer.newMessage().value("Hello Pulsar!").send();
+</code></pre></li>
+<li><p>Create a consumer with a string schema and receive messages.</p>
+<pre><code class="hljs css language-text">Consumer<String> consumer = client.newConsumer(Schema.STRING).create();
+consumer.receive();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="complex-type"></a><a href="#complex-type" 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. [...]
+<p>Currently, Pulsar supports the following complex types:</p>
+<table>
+<thead>
+<tr><th>Complex Type</th><th>说明:</th></tr>
+</thead>
+<tbody>
+<tr><td><code>keyvalue</code></td><td>Represents a complex type of a key/value pair.</td></tr>
+<tr><td><code>struct</code></td><td>Supports <strong>AVRO</strong>, <strong>JSON</strong>, and <strong>Protobuf</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="keyvalue"></a><a href="#keyvalue" 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  [...]
+<p><code>Keyvalue</code> schema helps applications define schemas for both key and value.</p>
+<p>For <code>SchemaInfo</code> of <code>keyvalue</code> schema, Pulsar stores the <code>SchemaInfo</code> of key schema and the <code>SchemaInfo</code> of value schema together.</p>
+<p>Pulsar provides two methods to encode a key/value pair in messages:</p>
+<ul>
+<li><p><code>INLINE</code></p></li>
+<li><p><code>SEPARATED</code></p></li>
+</ul>
+<p>Users can choose the encoding type when constructing the key/value schema.</p>
+<h5><a class="anchor" aria-hidden="true" id="inline"></a><a href="#inline" 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. [...]
+<p>Key/value pairs will be encoded together in the message payload.</p>
+<h5><a class="anchor" aria-hidden="true" id="separated"></a><a href="#separated" 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.6 [...]
+<p>Key will be encoded in the message key and the value will be encoded in the message payload.</p>
+<p><strong>Example</strong></p>
+<p>This example shows how to construct a key/value schema and then use it to produce and consume messages.</p>
+<ol>
+<li><p>Construct a key/value schema with <code>INLINE</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.INLINE
+);
+</code></pre></li>
+<li><p>Optionally, construct a key/value schema with <code>SEPARATED</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+</code></pre></li>
+<li><p>Produce messages using a key/value schema.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+
+Producer<KeyValue<Integer, String>> producer = client.newProducer(kvSchema)
+    .topic(TOPIC)
+    .create();
+
+final int key = 100;
+final String value = "value-100”;
+
+// send the key/value message
+producer.newMessage()
+.value(new KeyValue<>(key, value))
+.send();
+</code></pre></li>
+<li><p>Consume messages using a key/value schema.</p>
+<pre><code class="hljs">Schema&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.<span class="hljs-built_in">STRING</span>,
+KeyValueEncodingType.SEPARATED
+);
+
+Consumer&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; consumer = client.newConsumer(kvSchema)
+    <span class="hljs-params">...</span>
+    .topic(TOPIC)
+    .subscriptionName(SubscriptionName).subscribe();
+
+<span class="hljs-comment">// receive key/value pair</span>
+Message&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; msg = consumer.receive();
+KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt; kv = msg.getValue();
+</code></pre></li>
+</ol>
+<h4><a class="anchor" aria-hidden="true" id="struct"></a><a href="#struct" 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. [...]
+<p>Pulsar uses <a href="http://avro.apache.org/docs/current/spec.html">Avro Specification</a> to declare the schema definition for <code>struct</code> schema.</p>
+<p>This allows Pulsar:</p>
+<ul>
+<li><p>to use same tools to manage schema definitions</p></li>
+<li><p>to use different serialization/deserialization methods to handle data</p></li>
+</ul>
+<p>There are two methods to use <code>struct</code> schema:</p>
+<ul>
+<li><p><code>static</code></p></li>
+<li><p><code>generic</code></p></li>
+</ul>
+<h5><a class="anchor" aria-hidden="true" id="static"></a><a href="#static" 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. [...]
+<p>You can predefine the <code>struct</code> schema, and it can be a POJO in Java, a <code>struct</code> in Go, or classes generated by Avro or Protobuf tools.</p>
+<p><strong>Example</strong></p>
+<p>Pulsar gets the schema definition from the predefined <code>struct</code> using an Avro library. The schema definition is the schema data stored as a part of the <code>SchemaInfo</code>.</p>
+<ol>
+<li><p>Create the <em>User</em> class to define the messages sent to Pulsar topics.</p>
+<pre><code class="hljs css language-text">public class User {
+    String name;
+    int age;
+}
+</code></pre></li>
+<li><p>Create a producer with a <code>struct</code> schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<User> producer = client.newProducer(Schema.AVRO(User.class)).create();
+producer.newMessage().value(User.builder().userName("pulsar-user").userId(1L).build()).send();
+</code></pre></li>
+<li><p>Create a consumer with a <code>struct</code> schema and receive messages</p>
+<pre><code class="hljs css language-text">Consumer<User> consumer = client.newConsumer(Schema.AVRO(User.class)).create();
+User user = consumer.receive();
+</code></pre></li>
+</ol>
+<h5><a class="anchor" aria-hidden="true" id="generic"></a><a href="#generic" 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- [...]
+<p>Sometimes applications do not have pre-defined structs, and you can use this method to define schema and access data.</p>
+<p>You can define the <code>struct</code> schema using the <code>GenericSchemaBuilder</code>, generate a generic struct using <code>GenericRecordBuilder</code> and consume messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<ol>
+<li><p>Use <code>RecordSchemaBuilder</code> to build a schema.</p>
+<pre><code class="hljs css language-text">RecordSchemaBuilder recordSchemaBuilder = SchemaBuilder.record("schemaName");
+recordSchemaBuilder.field("intField").type(SchemaType.INT32);
+SchemaInfo schemaInfo = recordSchemaBuilder.build(SchemaType.AVRO);
+
+Producer<GenericRecord> producer = client.newProducer(Schema.generic(schemaInfo)).create();
+</code></pre></li>
+<li><p>Use <code>RecordBuilder</code> to build the struct records.</p>
+<pre><code class="hljs css language-text">producer.newMessage().value(schema.newRecordBuilder()
+            .set("intField", 32)
+            .build()).send();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="auto-schema"></a><a href="#auto-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 [...]
+<p>If you don't know the schema type of a Pulsar topic in advance, you can use AUTO schema to produce or consume generic records to or from brokers.</p>
+<table>
+<thead>
+<tr><th>Auto Schema Type</th><th>说明:</th></tr>
+</thead>
+<tbody>
+<tr><td><code>AUTO_PRODUCE</code></td><td>This is useful for transferring data <strong>from a producer to a Pulsar topic that has a schema</strong>.</td></tr>
+<tr><td><code>AUTO_CONSUME</code></td><td>This is useful for transferring data <strong>from a Pulsar topic that has a schema to a consumer</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="auto_produce"></a><a href="#auto_produce" 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. [...]
+<p><code>AUTO_PRODUCE</code> schema helps a producer validate whether the bytes sent by the producer is compatible with the schema of a topic.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a producer processing messages from a Kafka topic <em>K</em>.</p></li>
+<li><p>You have a Pulsar topic <em>P</em>, and you do not know its schema type.</p></li>
+<li><p>Your application reads the messages from <em>K</em> and writes the messages to <em>P</em>.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_PRODUCE</code> to verify whether the bytes produced by <em>K</em> can be sent to <em>P</em> or not.</p>
+<pre><code class="hljs css language-text">Produce<byte[]> pulsarProducer = client.newProducer(Schema.AUTO_PRODUCE())
+    …
+    .create();
+
+byte[] kafkaMessageBytes = … ; 
+
+pulsarProducer.produce(kafkaMessageBytes);
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="auto_consume"></a><a href="#auto_consume" 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. [...]
+<p><code>AUTO_CONSUME</code> schema helps a Pulsar topic validate whether the bytes sent by a Pulsar topic is compatible with a consumer, that is, the Pulsar topic deserializes messages into language-specific objects using the <code>SchemaInfo</code> retrieved from broker-side.</p>
+<p>Currently, <code>AUTO_CONSUME</code> only supports <strong>AVRO</strong> and <strong>JSON</strong> schemas. It deserializes messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a Pulsar topic <em>P</em>.</p></li>
+<li><p>You have a consumer (for example, MySQL) receiving messages from the topic <em>P</em>.</p></li>
+<li><p>You application reads the messages from <em>P</em> and writes the messages to MySQL.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_CONSUME</code> to verify whether the bytes produced by <em>P</em> can be sent to MySQL or not.</p>
+<pre><code class="hljs css language-text">Consumer<GenericRecord> pulsarConsumer = client.newConsumer(Schema.AUTO_CONSUME())
+    …
+    .subscribe();
+
+Message<GenericRecord> msg = consumer.receive() ; 
+GenericRecord record = msg.getValue();
+…
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-version"></a><a href="#schema-version" 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- [...]
+<p>Each <code>SchemaInfo</code> stored with a topic has a version. Schema version manages schema changes happening within a topic.</p>
+<p>Messages produced with a given <code>SchemaInfo</code> is tagged with a schema version, so when a message is consumed by a Pulsar client, the Pulsar client can use the schema version to retrieve the corresponding <code>SchemaInfo</code> and then use the <code>SchemaInfo</code> to deserialize data.</p>
+<p>Schema版本是连续的。 Schema storage happens in a broker that handles the associated topics so that version assignments can be made.</p>
+<p>一旦分配/提供了schema的版本,后续由该生产者生产的所有消息,都将被恰当的版本所标记。</p>
+<p><strong>Example</strong></p>
+<p>The following example illustrates how the schema version works.</p>
+<p>Suppose that a Pulsar <a href="/docs/zh-CN/next/client-libraries-java">Java client</a> created using the code below attempts to connect to Pulsar and begins to send messages:</p>
+<pre><code class="hljs css language-text">PulsarClient client = PulsarClient.builder()
+        .serviceUrl("pulsar://localhost:6650")
+        .build();
+
+Producer<SensorReading> producer = client.newProducer(JSONSchema.of(SensorReading.class))
+        .topic("sensor-data")
+        .sendTimeout(3, TimeUnit.SECONDS)
+        .create();
+</code></pre>
+<p>The table below lists the possible scenarios when this connection attempt occurs and what happens in each scenario:</p>
+<table class="table">
+  <tr>
+<th>场景</th>
+<th>发生了什么</th>
+  </tr>
+  <tr>
+<td> 
+<ul>
+<li>No schema exists for the topic.</li>
+</ul>
+</td>
+<td> 
+<p>(1) The producer is created using the given schema.</p>
+<p>(2) Since no existing schema is compatible with the <code>SensorReading</code> schema, the schema is transmitted to the broker and stored.</p>
+<p>(3) Any consumer created using the same schema or topic can consume messages from the <code>sensor-data</code> topic.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using the same schema that is already stored.</p></li>
+</ul>
+</td>
+<td> 
+<p>(1) The schema is transmitted to the broker.</p>
+<p>(2) The broker determines that the schema is compatible.</p>
+<p>(3) The broker attempts to store the schema in <a href="/docs/zh-CN/next/concepts-architecture-overview#persistent-storage">BookKeeper</a> but then determines that it's already stored, so it is used to tag produced messages.</p>
+</td>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using a new schema that is compatible.</p></li>
+</ul>
+</td>
+<pre><code class="hljs">&lt;td&gt;
+  (1) The schema is transmitted to the broker. (2) The broker determines that the schema is compatible and stores the new schema as the current version (with a new version number).
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="how-does-schema-work"></a><a href="#how-does-schema-work" 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 [...]
+<p>Pulsar schemas are applied and enforced at the <strong>topic</strong> level (schemas cannot be applied at the namespace or tenant level).</p>
+<p>Producers and consumers upload schemas to brokers, so Pulsar schemas work on the producer side and the consumer side.</p>
+<h3><a class="anchor" aria-hidden="true" id="producer-side"></a><a href="#producer-side" 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 [...]
+<p>This diagram illustrates how does schema work on the Producer side.</p>
+<p><img src="/docs/assets/schema-producer.png" alt="Schema works at the producer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a producer instance.</p>
+<p>The schema instance defines the schema for the data being produced using the producer instance.</p>
+<p>Take AVRO as an example, Pulsar extract schema definition from the POJO class and construct the <code>SchemaInfo</code> that the producer needs to pass to a broker when it connects.</p></li>
+<li><p>The producer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the producer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the producer.</p>
+<p>All the messages produced by this producer are tagged with the schema version.</p></li>
+<li><p>If the schema is incompatible, the broker rejects it.</p></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="consumer-side"></a><a href="#consumer-side" 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 [...]
+<p>This diagram illustrates how does Schema work on the consumer side.</p>
+<p><img src="/docs/assets/schema-consumer.png" alt="Schema works at the consumer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a consumer instance.</p>
+<p>The schema instance defines the schema that the consumer uses for decoding messages received from a broker.</p></li>
+<li><p>The consumer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the consumer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the consumer.</p></li>
+<li><p>If the schema is incompatible, the consumer will be disconnected.</p></li>
+<li><p>The consumer receives the messages from the broker.</p>
+<p>If the schema used by the consumer supports schema versioning (for example, AVRO schema), the consumer fetches the <code>SchemaInfo</code> of the version tagged in messages, and use the passed-in schema and the schema tagged in messages to decode the messages.</p></li>
+</ol>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#schemainfo">SchemaInfo</a></li><li><a href="#schema-type">Schema type</a><ul class="toc-headings"><li><a href="#primitive-type">Primitive type</a></li><li><a href="#complex-type">Complex type</a></li><li><a href="#auto-schema">Auto Schema</a></li><li><a href="#auto_consume">AUTO_CONSUME</a></li></ul></li><li><a href="#schema-version">Schema version</a></ [...]
+      const community = document.querySelector("a[href='#community']").parentNode;
+      const communityMenu =
+        '<li>' +
+        '<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
+        '<div id="community-dropdown" class="hide">' +
+          '<ul id="community-dropdown-items">' +
+            '<li><a href="/zh-CN/contact">Contact</a></li>' +
+            '<li><a href="/zh-CN/contributing">Contributing</a></li>' +
+            '<li><a href="/zh-CN/events">Events</a></li>' +
+            '<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
+            '<li>&nbsp;</li>' +
+            '<li><a href="/zh-CN/resources">Resources</a></li>' +
+            '<li><a href="/zh-CN/team">Team</a></li>' +
+          '</ul>' +
+        '</div>' +
+        '</li>';
+
+      community.innerHTML = communityMenu;
+
+      const communityMenuItem = document.getElementById("community-menu");
+      const communityDropDown = document.getElementById("community-dropdown");
+      communityMenuItem.addEventListener("click", function(event) {
+        event.preventDefault();
+
+        if (communityDropDown.className == 'hide') {
+          communityDropDown.className = 'visible';
+        } else {
+          communityDropDown.className = 'hide';
+        }
+      });
+    </script></span><span><script src="/js/pjax-api.min.js"></script><script>window.navfoo = new Pjax({
+            areas: [
+              // try to use the first query.
+              '.mainContainer, .docsNavContainer .toc .navWrapper, .onPageNav',
+              // fallback
+              'body'
+            ],
+            link: '.docsNavContainer:not(.docsSliderActive) a',
+            update: {
+              script: false,
+            }
+          });
+        </script></span></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</scri [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: 'd226a455cecdd4bc18a554c1b47e5b52',
+                indexName: 'apache_pulsar',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:zh-CN","version:next"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/zh-CN/next/schema-understand/index.html b/content/docs/zh-CN/next/schema-understand/index.html
new file mode 100644
index 0000000..048a7de
--- /dev/null
+++ b/content/docs/zh-CN/next/schema-understand/index.html
@@ -0,0 +1,474 @@
+<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Understand schema · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="## SchemaInfo"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="zh-CN"/><meta property="og:title" content="Understand schema · Apache Pulsar"/><meta propert [...]
+              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+              })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+              ga('create', 'UA-102219959-1', 'auto');
+              ga('send', 'pageview');
+            </script><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sid [...]
+        const languagesMenuItem = document.getElementById("languages-menu");
+        const languagesDropDown = document.getElementById("languages-dropdown");
+        languagesMenuItem.addEventListener("click", function(event) {
+          event.preventDefault();
+
+          if (languagesDropDown.className == "hide") {
+            languagesDropDown.className = "visible";
+          } else {
+            languagesDropDown.className = "hide";
+          }
+        });
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://crowdin.com/project/apache-pulsar/zh-CN" target="_blank" rel="noreferrer noopener">Tran [...]
+<p>Pulsar schema is defined in a data structure called <code>SchemaInfo</code>.</p>
+<p>The <code>SchemaInfo</code> is stored and enforced on a per-topic basis and cannot be stored at the namespace or tenant level.</p>
+<p>A <code>SchemaInfo</code> consists of the following fields:</p>
+<table style="table">
+  <tr>
+    <th>
+      字段
+    </th>
+<pre><code class="hljs">&lt;th&gt;
+  说明:
+&lt;/th&gt;
+</code></pre>
+  </tr>
+  <tr>
+<td> 
+<p><code>name</code></p>
+</td> 
+<td> 
+<p>Schema name (a string).</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>type</code></p>
+</td> 
+<td> 
+<p>Schema type, which determines how to interpret the schema data.</p>
+<ul>
+<li><p>Predefined schema: see <a href="schema-undstand.md#schema-type">here</a>.</p></li>
+<li><p>Customized schema: it is left as an empty string.</p></li>
+</ul>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>schema</code>(<code>payload</code>)</p>
+</td> 
+<td> 
+<p>Schema data, which is a sequence of 8-bit unsigned bytes and schema-type specific.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<p><code>properties</code></p>
+</td> 
+<pre><code class="hljs">&lt;td&gt;
+  It is a user defined properties as a string/string map. 应用可以使用这个包裹传递程序指定的逻辑。 Possible properties might be the Git hash associated with the schema, an environment string like `dev` or `prod`.
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<p><strong>Example</strong></p>
+<p>This is the <code>SchemaInfo</code> of a string.</p>
+<pre><code class="hljs css language-text">{
+    “name”: “test-string-schema”,
+    “type”: “STRING”,
+    “schema”: “”,
+    “properties”: {}
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-type"></a><a href="#schema-type" 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 [...]
+<p>Pulsar supports various schema types, which are mainly divided into two categories:</p>
+<ul>
+<li><p>Primitive type</p></li>
+<li><p>Complex type</p></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="primitive-type"></a><a href="#primitive-type" 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- [...]
+<p>Currently, Pulsar supports the following primitive types:</p>
+<table>
+<thead>
+<tr><th>Primitive Type</th><th>说明:</th></tr>
+</thead>
+<tbody>
+<tr><td><code>BOOLEAN</code></td><td>A binary value</td></tr>
+<tr><td><code>INT8</code></td><td>A 8-bit signed integer</td></tr>
+<tr><td><code>INT16</code></td><td>A 16-bit signed integer</td></tr>
+<tr><td><code>INT32</code></td><td>A 32-bit signed integer</td></tr>
+<tr><td><code>INT64</code></td><td>A 64-bit signed integer</td></tr>
+<tr><td><code>FLOAT</code></td><td>A single precision (32-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>DOUBLE</code></td><td>A double-precision (64-bit) IEEE 754 floating-point number</td></tr>
+<tr><td><code>BYTES</code></td><td>A sequence of 8-bit unsigned bytes</td></tr>
+<tr><td><code>STRING</code></td><td>A Unicode character sequence</td></tr>
+<tr><td><code>TIMESTAMP</code> (<code>DATE</code>, <code>TIME</code>)</td><td>A logic type represents a specific instant in time with millisecond precision.</td></tr>
+<tr><td>It stores the number of milliseconds since <code>January 1, 1970, 00:00:00 GMT</code> as an <code>INT64</code> value</td></tr>
+</tbody>
+</table>
+<p>For primitive types, Pulsar does not store any schema data in <code>SchemaInfo</code>. The <code>type</code> in <code>SchemaInfo</code> is used to determine how to serialize and deserialize the data.</p>
+<p>Some of the primitive schema implementations can use <code>properties</code> to store implementation-specific tunable settings. For example, a <code>string</code> schema can use <code>properties</code> to store the encoding charset to serialize and deserialize strings.</p>
+<p>The conversions between <strong>Pulsar schema types</strong> and <strong>language-specific primitive types</strong> are as below.</p>
+<table>
+<thead>
+<tr><th>Schema Type</th><th>Java Type</th><th>Python 类型</th><th>Go Type</th></tr>
+</thead>
+<tbody>
+<tr><td>BOOLEAN</td><td>boolean</td><td>bool</td><td>bool</td></tr>
+<tr><td>INT8</td><td>byte</td><td></td><td>int8</td></tr>
+<tr><td>INT16</td><td>short</td><td></td><td>int16</td></tr>
+<tr><td>INT32</td><td>int</td><td></td><td>int32</td></tr>
+<tr><td>INT64</td><td>long</td><td></td><td>int64</td></tr>
+<tr><td>FLOAT</td><td>float</td><td>float</td><td>float32</td></tr>
+<tr><td>DOUBLE</td><td>double</td><td>float</td><td>float64</td></tr>
+<tr><td>BYTES</td><td>byte[], ByteBuffer, ByteBuf</td><td>bytes</td><td>[]byte</td></tr>
+<tr><td>STRING</td><td>string</td><td>str</td><td>string</td></tr>
+<tr><td>TIMESTAMP</td><td>java.sql.Timestamp</td><td></td><td></td></tr>
+<tr><td>TIME</td><td>java.sql.Time</td><td></td><td></td></tr>
+<tr><td>DATE</td><td>java.util.Date</td><td></td><td></td></tr>
+</tbody>
+</table>
+<p><strong>Example</strong></p>
+<p>This example demonstrates how to use a string schema.</p>
+<ol>
+<li><p>Create a producer with a string schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<String> producer = client.newProducer(Schema.STRING).create();
+producer.newMessage().value("Hello Pulsar!").send();
+</code></pre></li>
+<li><p>Create a consumer with a string schema and receive messages.</p>
+<pre><code class="hljs css language-text">Consumer<String> consumer = client.newConsumer(Schema.STRING).create();
+consumer.receive();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="complex-type"></a><a href="#complex-type" 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. [...]
+<p>Currently, Pulsar supports the following complex types:</p>
+<table>
+<thead>
+<tr><th>Complex Type</th><th>说明:</th></tr>
+</thead>
+<tbody>
+<tr><td><code>keyvalue</code></td><td>Represents a complex type of a key/value pair.</td></tr>
+<tr><td><code>struct</code></td><td>Supports <strong>AVRO</strong>, <strong>JSON</strong>, and <strong>Protobuf</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="keyvalue"></a><a href="#keyvalue" 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  [...]
+<p><code>Keyvalue</code> schema helps applications define schemas for both key and value.</p>
+<p>For <code>SchemaInfo</code> of <code>keyvalue</code> schema, Pulsar stores the <code>SchemaInfo</code> of key schema and the <code>SchemaInfo</code> of value schema together.</p>
+<p>Pulsar provides two methods to encode a key/value pair in messages:</p>
+<ul>
+<li><p><code>INLINE</code></p></li>
+<li><p><code>SEPARATED</code></p></li>
+</ul>
+<p>Users can choose the encoding type when constructing the key/value schema.</p>
+<h5><a class="anchor" aria-hidden="true" id="inline"></a><a href="#inline" 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. [...]
+<p>Key/value pairs will be encoded together in the message payload.</p>
+<h5><a class="anchor" aria-hidden="true" id="separated"></a><a href="#separated" 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.6 [...]
+<p>Key will be encoded in the message key and the value will be encoded in the message payload.</p>
+<p><strong>Example</strong></p>
+<p>This example shows how to construct a key/value schema and then use it to produce and consume messages.</p>
+<ol>
+<li><p>Construct a key/value schema with <code>INLINE</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.INLINE
+);
+</code></pre></li>
+<li><p>Optionally, construct a key/value schema with <code>SEPARATED</code> encoding type.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+</code></pre></li>
+<li><p>Produce messages using a key/value schema.</p>
+<pre><code class="hljs css language-text">Schema<KeyValue<Integer, String>> kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.STRING,
+KeyValueEncodingType.SEPARATED
+);
+
+Producer<KeyValue<Integer, String>> producer = client.newProducer(kvSchema)
+    .topic(TOPIC)
+    .create();
+
+final int key = 100;
+final String value = "value-100”;
+
+// send the key/value message
+producer.newMessage()
+.value(new KeyValue<>(key, value))
+.send();
+</code></pre></li>
+<li><p>Consume messages using a key/value schema.</p>
+<pre><code class="hljs">Schema&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; kvSchema = Schema.KeyValue(
+Schema.INT32,
+Schema.<span class="hljs-built_in">STRING</span>,
+KeyValueEncodingType.SEPARATED
+);
+
+Consumer&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; consumer = client.newConsumer(kvSchema)
+    <span class="hljs-params">...</span>
+    .topic(TOPIC)
+    .subscriptionName(SubscriptionName).subscribe();
+
+<span class="hljs-comment">// receive key/value pair</span>
+Message&lt;KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt;&gt; msg = consumer.receive();
+KeyValue&lt;<span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">String</span>&gt; kv = msg.getValue();
+</code></pre></li>
+</ol>
+<h4><a class="anchor" aria-hidden="true" id="struct"></a><a href="#struct" 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. [...]
+<p>Pulsar uses <a href="http://avro.apache.org/docs/current/spec.html">Avro Specification</a> to declare the schema definition for <code>struct</code> schema.</p>
+<p>This allows Pulsar:</p>
+<ul>
+<li><p>to use same tools to manage schema definitions</p></li>
+<li><p>to use different serialization/deserialization methods to handle data</p></li>
+</ul>
+<p>There are two methods to use <code>struct</code> schema:</p>
+<ul>
+<li><p><code>static</code></p></li>
+<li><p><code>generic</code></p></li>
+</ul>
+<h5><a class="anchor" aria-hidden="true" id="static"></a><a href="#static" 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. [...]
+<p>You can predefine the <code>struct</code> schema, and it can be a POJO in Java, a <code>struct</code> in Go, or classes generated by Avro or Protobuf tools.</p>
+<p><strong>Example</strong></p>
+<p>Pulsar gets the schema definition from the predefined <code>struct</code> using an Avro library. The schema definition is the schema data stored as a part of the <code>SchemaInfo</code>.</p>
+<ol>
+<li><p>Create the <em>User</em> class to define the messages sent to Pulsar topics.</p>
+<pre><code class="hljs css language-text">public class User {
+    String name;
+    int age;
+}
+</code></pre></li>
+<li><p>Create a producer with a <code>struct</code> schema and send messages.</p>
+<pre><code class="hljs css language-text">Producer<User> producer = client.newProducer(Schema.AVRO(User.class)).create();
+producer.newMessage().value(User.builder().userName("pulsar-user").userId(1L).build()).send();
+</code></pre></li>
+<li><p>Create a consumer with a <code>struct</code> schema and receive messages</p>
+<pre><code class="hljs css language-text">Consumer<User> consumer = client.newConsumer(Schema.AVRO(User.class)).create();
+User user = consumer.receive();
+</code></pre></li>
+</ol>
+<h5><a class="anchor" aria-hidden="true" id="generic"></a><a href="#generic" 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- [...]
+<p>Sometimes applications do not have pre-defined structs, and you can use this method to define schema and access data.</p>
+<p>You can define the <code>struct</code> schema using the <code>GenericSchemaBuilder</code>, generate a generic struct using <code>GenericRecordBuilder</code> and consume messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<ol>
+<li><p>Use <code>RecordSchemaBuilder</code> to build a schema.</p>
+<pre><code class="hljs css language-text">RecordSchemaBuilder recordSchemaBuilder = SchemaBuilder.record("schemaName");
+recordSchemaBuilder.field("intField").type(SchemaType.INT32);
+SchemaInfo schemaInfo = recordSchemaBuilder.build(SchemaType.AVRO);
+
+Producer<GenericRecord> producer = client.newProducer(Schema.generic(schemaInfo)).create();
+</code></pre></li>
+<li><p>Use <code>RecordBuilder</code> to build the struct records.</p>
+<pre><code class="hljs css language-text">producer.newMessage().value(schema.newRecordBuilder()
+            .set("intField", 32)
+            .build()).send();
+</code></pre></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="auto-schema"></a><a href="#auto-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 [...]
+<p>If you don't know the schema type of a Pulsar topic in advance, you can use AUTO schema to produce or consume generic records to or from brokers.</p>
+<table>
+<thead>
+<tr><th>Auto Schema Type</th><th>说明:</th></tr>
+</thead>
+<tbody>
+<tr><td><code>AUTO_PRODUCE</code></td><td>This is useful for transferring data <strong>from a producer to a Pulsar topic that has a schema</strong>.</td></tr>
+<tr><td><code>AUTO_CONSUME</code></td><td>This is useful for transferring data <strong>from a Pulsar topic that has a schema to a consumer</strong>.</td></tr>
+</tbody>
+</table>
+<h4><a class="anchor" aria-hidden="true" id="auto_produce"></a><a href="#auto_produce" 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. [...]
+<p><code>AUTO_PRODUCE</code> schema helps a producer validate whether the bytes sent by the producer is compatible with the schema of a topic.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a producer processing messages from a Kafka topic <em>K</em>.</p></li>
+<li><p>You have a Pulsar topic <em>P</em>, and you do not know its schema type.</p></li>
+<li><p>Your application reads the messages from <em>K</em> and writes the messages to <em>P</em>.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_PRODUCE</code> to verify whether the bytes produced by <em>K</em> can be sent to <em>P</em> or not.</p>
+<pre><code class="hljs css language-text">Produce<byte[]> pulsarProducer = client.newProducer(Schema.AUTO_PRODUCE())
+    …
+    .create();
+
+byte[] kafkaMessageBytes = … ; 
+
+pulsarProducer.produce(kafkaMessageBytes);
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="auto_consume"></a><a href="#auto_consume" 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. [...]
+<p><code>AUTO_CONSUME</code> schema helps a Pulsar topic validate whether the bytes sent by a Pulsar topic is compatible with a consumer, that is, the Pulsar topic deserializes messages into language-specific objects using the <code>SchemaInfo</code> retrieved from broker-side.</p>
+<p>Currently, <code>AUTO_CONSUME</code> only supports <strong>AVRO</strong> and <strong>JSON</strong> schemas. It deserializes messages into <code>GenericRecord</code>.</p>
+<p><strong>Example</strong></p>
+<p>Suppose that:</p>
+<ul>
+<li><p>You have a Pulsar topic <em>P</em>.</p></li>
+<li><p>You have a consumer (for example, MySQL) receiving messages from the topic <em>P</em>.</p></li>
+<li><p>You application reads the messages from <em>P</em> and writes the messages to MySQL.</p></li>
+</ul>
+<p>In this case, you can use <code>AUTO_CONSUME</code> to verify whether the bytes produced by <em>P</em> can be sent to MySQL or not.</p>
+<pre><code class="hljs css language-text">Consumer<GenericRecord> pulsarConsumer = client.newConsumer(Schema.AUTO_CONSUME())
+    …
+    .subscribe();
+
+Message<GenericRecord> msg = consumer.receive() ; 
+GenericRecord record = msg.getValue();
+…
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="schema-version"></a><a href="#schema-version" 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- [...]
+<p>Each <code>SchemaInfo</code> stored with a topic has a version. Schema version manages schema changes happening within a topic.</p>
+<p>Messages produced with a given <code>SchemaInfo</code> is tagged with a schema version, so when a message is consumed by a Pulsar client, the Pulsar client can use the schema version to retrieve the corresponding <code>SchemaInfo</code> and then use the <code>SchemaInfo</code> to deserialize data.</p>
+<p>Schema版本是连续的。 Schema storage happens in a broker that handles the associated topics so that version assignments can be made.</p>
+<p>一旦分配/提供了schema的版本,后续由该生产者生产的所有消息,都将被恰当的版本所标记。</p>
+<p><strong>Example</strong></p>
+<p>The following example illustrates how the schema version works.</p>
+<p>Suppose that a Pulsar <a href="/docs/zh-CN/next/client-libraries-java">Java client</a> created using the code below attempts to connect to Pulsar and begins to send messages:</p>
+<pre><code class="hljs css language-text">PulsarClient client = PulsarClient.builder()
+        .serviceUrl("pulsar://localhost:6650")
+        .build();
+
+Producer<SensorReading> producer = client.newProducer(JSONSchema.of(SensorReading.class))
+        .topic("sensor-data")
+        .sendTimeout(3, TimeUnit.SECONDS)
+        .create();
+</code></pre>
+<p>The table below lists the possible scenarios when this connection attempt occurs and what happens in each scenario:</p>
+<table class="table">
+  <tr>
+<th>场景</th>
+<th>发生了什么</th>
+  </tr>
+  <tr>
+<td> 
+<ul>
+<li>No schema exists for the topic.</li>
+</ul>
+</td>
+<td> 
+<p>(1) The producer is created using the given schema.</p>
+<p>(2) Since no existing schema is compatible with the <code>SensorReading</code> schema, the schema is transmitted to the broker and stored.</p>
+<p>(3) Any consumer created using the same schema or topic can consume messages from the <code>sensor-data</code> topic.</p>
+</td>
+</tr>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using the same schema that is already stored.</p></li>
+</ul>
+</td>
+<td> 
+<p>(1) The schema is transmitted to the broker.</p>
+<p>(2) The broker determines that the schema is compatible.</p>
+<p>(3) The broker attempts to store the schema in <a href="/docs/zh-CN/next/concepts-architecture-overview#persistent-storage">BookKeeper</a> but then determines that it's already stored, so it is used to tag produced messages.</p>
+</td>
+<tr>
+<td> 
+<ul>
+<li><p>A schema already exists.</p></li>
+<li><p>The producer connects using a new schema that is compatible.</p></li>
+</ul>
+</td>
+<pre><code class="hljs">&lt;td&gt;
+  (1) The schema is transmitted to the broker. (2) The broker determines that the schema is compatible and stores the new schema as the current version (with a new version number).
+&lt;/td&gt;
+</code></pre>
+  </tr>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="how-does-schema-work"></a><a href="#how-does-schema-work" 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 [...]
+<p>Pulsar schemas are applied and enforced at the <strong>topic</strong> level (schemas cannot be applied at the namespace or tenant level).</p>
+<p>Producers and consumers upload schemas to brokers, so Pulsar schemas work on the producer side and the consumer side.</p>
+<h3><a class="anchor" aria-hidden="true" id="producer-side"></a><a href="#producer-side" 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 [...]
+<p>This diagram illustrates how does schema work on the Producer side.</p>
+<p><img src="/docs/assets/schema-producer.png" alt="Schema works at the producer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a producer instance.</p>
+<p>The schema instance defines the schema for the data being produced using the producer instance.</p>
+<p>Take AVRO as an example, Pulsar extract schema definition from the POJO class and construct the <code>SchemaInfo</code> that the producer needs to pass to a broker when it connects.</p></li>
+<li><p>The producer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the producer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the producer.</p>
+<p>All the messages produced by this producer are tagged with the schema version.</p></li>
+<li><p>If the schema is incompatible, the broker rejects it.</p></li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="consumer-side"></a><a href="#consumer-side" 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 [...]
+<p>This diagram illustrates how does Schema work on the consumer side.</p>
+<p><img src="/docs/assets/schema-consumer.png" alt="Schema works at the consumer side"></p>
+<ol>
+<li><p>The application uses a schema instance to construct a consumer instance.</p>
+<p>The schema instance defines the schema that the consumer uses for decoding messages received from a broker.</p></li>
+<li><p>The consumer connects to the broker with the <code>SchemaInfo</code> extracted from the passed-in schema instance.</p></li>
+<li><p>The broker looks up the schema in the schema storage to check if it is already a registered schema.</p></li>
+<li><p>If yes, the broker skips the schema validation since it is a known schema, and returns the schema version to the consumer.</p></li>
+<li><p>If no, the broker validates the schema based on the schema compatibility check strategy defined for the topic.</p></li>
+<li><p>If the schema is compatible, the broker stores it and returns the schema version to the consumer.</p></li>
+<li><p>If the schema is incompatible, the consumer will be disconnected.</p></li>
+<li><p>The consumer receives the messages from the broker.</p>
+<p>If the schema used by the consumer supports schema versioning (for example, AVRO schema), the consumer fetches the <code>SchemaInfo</code> of the version tagged in messages, and use the passed-in schema and the schema tagged in messages to decode the messages.</p></li>
+</ol>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#schemainfo">SchemaInfo</a></li><li><a href="#schema-type">Schema type</a><ul class="toc-headings"><li><a href="#primitive-type">Primitive type</a></li><li><a href="#complex-type">Complex type</a></li><li><a href="#auto-schema">Auto Schema</a></li><li><a href="#auto_consume">AUTO_CONSUME</a></li></ul></li><li><a href="#schema-version">Schema version</a></ [...]
+      const community = document.querySelector("a[href='#community']").parentNode;
+      const communityMenu =
+        '<li>' +
+        '<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
+        '<div id="community-dropdown" class="hide">' +
+          '<ul id="community-dropdown-items">' +
+            '<li><a href="/zh-CN/contact">Contact</a></li>' +
+            '<li><a href="/zh-CN/contributing">Contributing</a></li>' +
+            '<li><a href="/zh-CN/events">Events</a></li>' +
+            '<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
+            '<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
+            '<li>&nbsp;</li>' +
+            '<li><a href="/zh-CN/resources">Resources</a></li>' +
+            '<li><a href="/zh-CN/team">Team</a></li>' +
+          '</ul>' +
+        '</div>' +
+        '</li>';
+
+      community.innerHTML = communityMenu;
+
+      const communityMenuItem = document.getElementById("community-menu");
+      const communityDropDown = document.getElementById("community-dropdown");
+      communityMenuItem.addEventListener("click", function(event) {
+        event.preventDefault();
+
+        if (communityDropDown.className == 'hide') {
+          communityDropDown.className = 'visible';
+        } else {
+          communityDropDown.className = 'hide';
+        }
+      });
+    </script></span><span><script src="/js/pjax-api.min.js"></script><script>window.navfoo = new Pjax({
+            areas: [
+              // try to use the first query.
+              '.mainContainer, .docsNavContainer .toc .navWrapper, .onPageNav',
+              // fallback
+              'body'
+            ],
+            link: '.docsNavContainer:not(.docsSliderActive) a',
+            update: {
+              script: false,
+            }
+          });
+        </script></span></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</scri [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: 'd226a455cecdd4bc18a554c1b47e5b52',
+                indexName: 'apache_pulsar',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:zh-CN","version:next"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/en/resources.html b/content/en/resources.html
index c13cafa..797ded9 100644
--- a/content/en/resources.html
+++ b/content/en/resources.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/en/resources/index.html b/content/en/resources/index.html
index c13cafa..797ded9 100644
--- a/content/en/resources/index.html
+++ b/content/en/resources/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/fr/resources.html b/content/fr/resources.html
index df136ee..aa0aa5d 100644
--- a/content/fr/resources.html
+++ b/content/fr/resources.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Ressources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Ressources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/fr/resources/index.html b/content/fr/resources/index.html
index df136ee..aa0aa5d 100644
--- a/content/fr/resources/index.html
+++ b/content/fr/resources/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Ressources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Ressources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/ja/resources.html b/content/ja/resources.html
index 597db4e..92bc6ef 100644
--- a/content/ja/resources.html
+++ b/content/ja/resources.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/ja/resources/index.html b/content/ja/resources/index.html
index 597db4e..92bc6ef 100644
--- a/content/ja/resources/index.html
+++ b/content/ja/resources/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/resources.html b/content/resources.html
index c13cafa..797ded9 100644
--- a/content/resources.html
+++ b/content/resources.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/resources/index.html b/content/resources/index.html
index c13cafa..797ded9 100644
--- a/content/resources/index.html
+++ b/content/resources/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>Resources</h1><hr/></header><h2>Articles</h2><table class="versions"><thead><tr><th>Forum</th><th> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/sitemap.xml b/content/sitemap.xml
index ec3af20..8486afb 100644
--- a/content/sitemap.xml
+++ b/content/sitemap.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://pulsar.incubator.apache.org/admin-rest-api</loc><changefreq>weekly</changefreq><prior [...]
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://pulsar.incubator.apache.org/admin-rest-api</loc><changefreq>weekly</changefreq><prior [...]
\ No newline at end of file
diff --git a/content/swagger/2.5.0-SNAPSHOT/swagger.json b/content/swagger/2.5.0-SNAPSHOT/swagger.json
index 67b4b2b..ad33223 100644
--- a/content/swagger/2.5.0-SNAPSHOT/swagger.json
+++ b/content/swagger/2.5.0-SNAPSHOT/swagger.json
@@ -8866,41 +8866,41 @@
           "type" : "number",
           "format" : "double"
         },
-        "lastUpdate" : {
-          "type" : "integer",
-          "format" : "int64"
+        "underLoaded" : {
+          "type" : "boolean"
         },
-        "cpu" : {
-          "$ref" : "#/definitions/ResourceUsage"
+        "overLoaded" : {
+          "type" : "boolean"
         },
-        "memory" : {
-          "$ref" : "#/definitions/ResourceUsage"
+        "loadReportType" : {
+          "type" : "string"
         },
-        "msgThroughputIn" : {
-          "type" : "number",
-          "format" : "double"
+        "bandwidthIn" : {
+          "$ref" : "#/definitions/ResourceUsage"
         },
-        "msgThroughputOut" : {
-          "type" : "number",
-          "format" : "double"
+        "bandwidthOut" : {
+          "$ref" : "#/definitions/ResourceUsage"
         },
-        "bandwidthIn" : {
+        "memory" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
-        "directMemory" : {
+        "cpu" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
-        "bandwidthOut" : {
+        "directMemory" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
-        "underLoaded" : {
-          "type" : "boolean"
+        "lastUpdate" : {
+          "type" : "integer",
+          "format" : "int64"
         },
-        "overLoaded" : {
-          "type" : "boolean"
+        "msgThroughputIn" : {
+          "type" : "number",
+          "format" : "double"
         },
-        "loadReportType" : {
-          "type" : "string"
+        "msgThroughputOut" : {
+          "type" : "number",
+          "format" : "double"
         }
       }
     },
@@ -9068,10 +9068,10 @@
           "type" : "number",
           "format" : "double"
         },
-        "connectedSince" : {
+        "producerName" : {
           "type" : "string"
         },
-        "producerName" : {
+        "connectedSince" : {
           "type" : "string"
         },
         "clientVersion" : {
@@ -9739,10 +9739,10 @@
             "type" : "string"
           }
         },
-        "connectedSince" : {
+        "producerName" : {
           "type" : "string"
         },
-        "producerName" : {
+        "connectedSince" : {
           "type" : "string"
         },
         "clientVersion" : {
@@ -9804,15 +9804,15 @@
     "ResourceDescription" : {
       "type" : "object",
       "properties" : {
-        "usagePct" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
         "resourceUsage" : {
           "type" : "object",
           "additionalProperties" : {
             "$ref" : "#/definitions/ResourceUsage"
           }
+        },
+        "usagePct" : {
+          "type" : "integer",
+          "format" : "int32"
         }
       }
     },
@@ -9847,11 +9847,11 @@
     "ResourceUnit" : {
       "type" : "object",
       "properties" : {
-        "resourceId" : {
-          "type" : "string"
-        },
         "availableResource" : {
           "$ref" : "#/definitions/ResourceDescription"
+        },
+        "resourceId" : {
+          "type" : "string"
         }
       }
     },
diff --git a/content/swagger/2.5.0-SNAPSHOT/swaggerfunctions.json b/content/swagger/2.5.0-SNAPSHOT/swaggerfunctions.json
index c4e88c7..8b807c8 100644
--- a/content/swagger/2.5.0-SNAPSHOT/swaggerfunctions.json
+++ b/content/swagger/2.5.0-SNAPSHOT/swaggerfunctions.json
@@ -1348,6 +1348,12 @@
     "Message" : {
       "type" : "object",
       "properties" : {
+        "producerName" : {
+          "type" : "string"
+        },
+        "replicatedFrom" : {
+          "type" : "string"
+        },
         "replicated" : {
           "type" : "boolean"
         },
@@ -1359,16 +1365,9 @@
           "type" : "integer",
           "format" : "int64"
         },
-        "producerName" : {
+        "topicName" : {
           "type" : "string"
         },
-        "messageId" : {
-          "$ref" : "#/definitions/MessageId"
-        },
-        "sequenceId" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
         "keyBytes" : {
           "type" : "array",
           "items" : {
@@ -1376,8 +1375,12 @@
             "format" : "byte"
           }
         },
-        "replicatedFrom" : {
-          "type" : "string"
+        "messageId" : {
+          "$ref" : "#/definitions/MessageId"
+        },
+        "sequenceId" : {
+          "type" : "integer",
+          "format" : "int64"
         },
         "orderingKey" : {
           "type" : "array",
@@ -1400,9 +1403,6 @@
             "format" : "byte"
           }
         },
-        "topicName" : {
-          "type" : "string"
-        },
         "data" : {
           "type" : "array",
           "items" : {
diff --git a/content/swagger/swagger.json b/content/swagger/swagger.json
index 67b4b2b..ad33223 100644
--- a/content/swagger/swagger.json
+++ b/content/swagger/swagger.json
@@ -8866,41 +8866,41 @@
           "type" : "number",
           "format" : "double"
         },
-        "lastUpdate" : {
-          "type" : "integer",
-          "format" : "int64"
+        "underLoaded" : {
+          "type" : "boolean"
         },
-        "cpu" : {
-          "$ref" : "#/definitions/ResourceUsage"
+        "overLoaded" : {
+          "type" : "boolean"
         },
-        "memory" : {
-          "$ref" : "#/definitions/ResourceUsage"
+        "loadReportType" : {
+          "type" : "string"
         },
-        "msgThroughputIn" : {
-          "type" : "number",
-          "format" : "double"
+        "bandwidthIn" : {
+          "$ref" : "#/definitions/ResourceUsage"
         },
-        "msgThroughputOut" : {
-          "type" : "number",
-          "format" : "double"
+        "bandwidthOut" : {
+          "$ref" : "#/definitions/ResourceUsage"
         },
-        "bandwidthIn" : {
+        "memory" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
-        "directMemory" : {
+        "cpu" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
-        "bandwidthOut" : {
+        "directMemory" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
-        "underLoaded" : {
-          "type" : "boolean"
+        "lastUpdate" : {
+          "type" : "integer",
+          "format" : "int64"
         },
-        "overLoaded" : {
-          "type" : "boolean"
+        "msgThroughputIn" : {
+          "type" : "number",
+          "format" : "double"
         },
-        "loadReportType" : {
-          "type" : "string"
+        "msgThroughputOut" : {
+          "type" : "number",
+          "format" : "double"
         }
       }
     },
@@ -9068,10 +9068,10 @@
           "type" : "number",
           "format" : "double"
         },
-        "connectedSince" : {
+        "producerName" : {
           "type" : "string"
         },
-        "producerName" : {
+        "connectedSince" : {
           "type" : "string"
         },
         "clientVersion" : {
@@ -9739,10 +9739,10 @@
             "type" : "string"
           }
         },
-        "connectedSince" : {
+        "producerName" : {
           "type" : "string"
         },
-        "producerName" : {
+        "connectedSince" : {
           "type" : "string"
         },
         "clientVersion" : {
@@ -9804,15 +9804,15 @@
     "ResourceDescription" : {
       "type" : "object",
       "properties" : {
-        "usagePct" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
         "resourceUsage" : {
           "type" : "object",
           "additionalProperties" : {
             "$ref" : "#/definitions/ResourceUsage"
           }
+        },
+        "usagePct" : {
+          "type" : "integer",
+          "format" : "int32"
         }
       }
     },
@@ -9847,11 +9847,11 @@
     "ResourceUnit" : {
       "type" : "object",
       "properties" : {
-        "resourceId" : {
-          "type" : "string"
-        },
         "availableResource" : {
           "$ref" : "#/definitions/ResourceDescription"
+        },
+        "resourceId" : {
+          "type" : "string"
         }
       }
     },
diff --git a/content/swagger/swaggerfunctions.json b/content/swagger/swaggerfunctions.json
index c4e88c7..8b807c8 100644
--- a/content/swagger/swaggerfunctions.json
+++ b/content/swagger/swaggerfunctions.json
@@ -1348,6 +1348,12 @@
     "Message" : {
       "type" : "object",
       "properties" : {
+        "producerName" : {
+          "type" : "string"
+        },
+        "replicatedFrom" : {
+          "type" : "string"
+        },
         "replicated" : {
           "type" : "boolean"
         },
@@ -1359,16 +1365,9 @@
           "type" : "integer",
           "format" : "int64"
         },
-        "producerName" : {
+        "topicName" : {
           "type" : "string"
         },
-        "messageId" : {
-          "$ref" : "#/definitions/MessageId"
-        },
-        "sequenceId" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
         "keyBytes" : {
           "type" : "array",
           "items" : {
@@ -1376,8 +1375,12 @@
             "format" : "byte"
           }
         },
-        "replicatedFrom" : {
-          "type" : "string"
+        "messageId" : {
+          "$ref" : "#/definitions/MessageId"
+        },
+        "sequenceId" : {
+          "type" : "integer",
+          "format" : "int64"
         },
         "orderingKey" : {
           "type" : "array",
@@ -1400,9 +1403,6 @@
             "format" : "byte"
           }
         },
-        "topicName" : {
-          "type" : "string"
-        },
         "data" : {
           "type" : "array",
           "items" : {
diff --git a/content/zh-CN/resources.html b/content/zh-CN/resources.html
index b7d0694..69f77ac 100644
--- a/content/zh-CN/resources.html
+++ b/content/zh-CN/resources.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>资源</h1><hr/></header><h2>文章</h2><table class="versions"><thead><tr><th>论坛</th><th>链接</th></tr></th [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>资源</h1><hr/></header><h2>文章</h2><table class="versions"><thead><tr><th>论坛</th><th>链接</th></tr></th [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/zh-CN/resources/index.html b/content/zh-CN/resources/index.html
index b7d0694..69f77ac 100644
--- a/content/zh-CN/resources/index.html
+++ b/content/zh-CN/resources/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>资源</h1><hr/></header><h2>文章</h2><table class="versions"><thead><tr><th>论坛</th><th>链接</th></tr></th [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer documentContainer postContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1>资源</h1><hr/></header><h2>文章</h2><table class="versions"><thead><tr><th>论坛</th><th>链接</th></tr></th [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +