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/06/19 09:06:41 UTC

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

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 a4a45db  Updated site at revision 34f1a58
a4a45db is described below

commit a4a45dbacc7717220ed7ee4c28b3ef227c241df0
Author: jenkins <bu...@apache.org>
AuthorDate: Wed Jun 19 09:06:34 2019 +0000

    Updated site at revision 34f1a58
---
 content/css/main.css                               |   2 +-
 content/docs/en/next/admin-api-overview.html       |  18 ++
 content/docs/en/next/admin-api-overview/index.html |  18 ++
 content/docs/en/next/client-libraries-java.html    |   8 +
 .../docs/en/next/client-libraries-java/index.html  |   8 +
 content/docs/en/next/cookbooks-compaction.html     |   2 +-
 .../docs/en/next/cookbooks-compaction/index.html   |   2 +-
 content/docs/en/next/deploy-bare-metal.html        |   3 +
 content/docs/en/next/deploy-bare-metal/index.html  |   3 +
 content/docs/en/next/develop-cpp.html              |   2 +-
 content/docs/en/next/develop-cpp/index.html        |   2 +-
 content/docs/en/next/functions-quickstart.html     | 171 +++++++++-----
 .../docs/en/next/functions-quickstart/index.html   | 171 +++++++++-----
 content/docs/fr/next/admin-api-overview.html       |  18 ++
 content/docs/fr/next/admin-api-overview/index.html |  18 ++
 content/docs/fr/next/client-libraries-java.html    |  10 +-
 .../docs/fr/next/client-libraries-java/index.html  |  10 +-
 content/docs/fr/next/cookbooks-compaction.html     |   2 +-
 .../docs/fr/next/cookbooks-compaction/index.html   |   2 +-
 content/docs/fr/next/deploy-bare-metal.html        |   1 +
 content/docs/fr/next/deploy-bare-metal/index.html  |   1 +
 content/docs/fr/next/develop-cpp.html              |   2 +-
 content/docs/fr/next/develop-cpp/index.html        |   2 +-
 content/docs/fr/next/functions-quickstart.html     | 172 ++++++++------
 .../docs/fr/next/functions-quickstart/index.html   | 172 ++++++++------
 content/docs/ja/next/admin-api-overview.html       |  18 ++
 content/docs/ja/next/admin-api-overview/index.html |  18 ++
 content/docs/ja/next/client-libraries-java.html    |   8 +
 .../docs/ja/next/client-libraries-java/index.html  |   8 +
 content/docs/ja/next/cookbooks-compaction.html     |   2 +-
 .../docs/ja/next/cookbooks-compaction/index.html   |   2 +-
 content/docs/ja/next/deploy-bare-metal.html        |   1 +
 content/docs/ja/next/deploy-bare-metal/index.html  |   1 +
 content/docs/ja/next/develop-cpp.html              |   2 +-
 content/docs/ja/next/develop-cpp/index.html        |   2 +-
 content/docs/ja/next/functions-quickstart.html     | 172 ++++++++------
 .../docs/ja/next/functions-quickstart/index.html   | 172 ++++++++------
 content/docs/zh-CN/next/admin-api-overview.html    |  18 ++
 .../docs/zh-CN/next/admin-api-overview/index.html  |  18 ++
 content/docs/zh-CN/next/client-libraries-java.html |   8 +
 .../zh-CN/next/client-libraries-java/index.html    |   8 +
 content/docs/zh-CN/next/cookbooks-compaction.html  |   2 +-
 .../zh-CN/next/cookbooks-compaction/index.html     |   2 +-
 content/docs/zh-CN/next/deploy-bare-metal.html     |   1 +
 .../docs/zh-CN/next/deploy-bare-metal/index.html   |   1 +
 content/docs/zh-CN/next/develop-cpp.html           |   2 +-
 content/docs/zh-CN/next/develop-cpp/index.html     |   2 +-
 content/docs/zh-CN/next/functions-quickstart.html  | 172 ++++++++------
 .../zh-CN/next/functions-quickstart/index.html     | 172 ++++++++------
 content/swagger/2.4.0-SNAPSHOT/swagger.json        |  28 +--
 .../swagger/2.4.0-SNAPSHOT/swaggerfunctions.json   |  54 ++---
 content/swagger/2.4.0-SNAPSHOT/swaggersink.json    | 259 ++++++++++++++++-----
 content/swagger/2.4.0-SNAPSHOT/swaggersource.json  | 195 +++++++++++++---
 53 files changed, 1478 insertions(+), 690 deletions(-)

diff --git a/content/css/main.css b/content/css/main.css
index 0e3f252..ba6d6b9 100644
--- a/content/css/main.css
+++ b/content/css/main.css
@@ -1 +1 @@
-a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}b [...]
\ No newline at end of file
+a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}b [...]
\ No newline at end of file
diff --git a/content/docs/en/next/admin-api-overview.html b/content/docs/en/next/admin-api-overview.html
index 33a083b..7cb752c 100644
--- a/content/docs/en/next/admin-api-overview.html
+++ b/content/docs/en/next/admin-api-overview.html
@@ -139,6 +139,24 @@ config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
 
 PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
 </code></pre>
+<p>If you have multiple brokers to use, you can use multi-host like Pulsar service. For example,</p>
+<pre><code class="hljs css language-java">URL url = <span class="hljs-keyword">new</span> URL(<span class="hljs-string">"http://localhost:8080,localhost:8081,localhost:8082"</span>);
+<span class="hljs-comment">// Pass auth-plugin class fully-qualified name if Pulsar-security is enabled.</span>
+String authPluginClassName = <span class="hljs-string">"com.org.MyAuthPluginClass"</span>; 
+<span class="hljs-comment">// Pass auth-param if auth-plugin class requires it</span>
+String authParams = <span class="hljs-string">"param1=value1"</span>;
+<span class="hljs-keyword">boolean</span> useTls = <span class="hljs-keyword">false</span>;
+<span class="hljs-keyword">boolean</span> tlsAllowInsecureConnection = <span class="hljs-keyword">false</span>;
+String tlsTrustCertsFilePath = <span class="hljs-keyword">null</span>;
+
+ClientConfiguration config = <span class="hljs-keyword">new</span> ClientConfiguration();
+config.setAuthentication(authPluginClassName, authParams);
+config.setUseTls(useTls);
+config.setTlsAllowInsecureConnection(tlsAllowInsecureConnection);
+config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
+
+PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
+</code></pre>
 </span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/next/client-libraries-websocket"><span class="arrow-prev">← </span><span class="function-name-prevnext">WebSocket</span></a><a class="docs-next button" href="/docs/en/next/admin-api-clusters"><span>Clusters</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#admin-setup">Admin setup</a><ul class="toc-headings"><li><a hr [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
diff --git a/content/docs/en/next/admin-api-overview/index.html b/content/docs/en/next/admin-api-overview/index.html
index 33a083b..7cb752c 100644
--- a/content/docs/en/next/admin-api-overview/index.html
+++ b/content/docs/en/next/admin-api-overview/index.html
@@ -139,6 +139,24 @@ config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
 
 PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
 </code></pre>
+<p>If you have multiple brokers to use, you can use multi-host like Pulsar service. For example,</p>
+<pre><code class="hljs css language-java">URL url = <span class="hljs-keyword">new</span> URL(<span class="hljs-string">"http://localhost:8080,localhost:8081,localhost:8082"</span>);
+<span class="hljs-comment">// Pass auth-plugin class fully-qualified name if Pulsar-security is enabled.</span>
+String authPluginClassName = <span class="hljs-string">"com.org.MyAuthPluginClass"</span>; 
+<span class="hljs-comment">// Pass auth-param if auth-plugin class requires it</span>
+String authParams = <span class="hljs-string">"param1=value1"</span>;
+<span class="hljs-keyword">boolean</span> useTls = <span class="hljs-keyword">false</span>;
+<span class="hljs-keyword">boolean</span> tlsAllowInsecureConnection = <span class="hljs-keyword">false</span>;
+String tlsTrustCertsFilePath = <span class="hljs-keyword">null</span>;
+
+ClientConfiguration config = <span class="hljs-keyword">new</span> ClientConfiguration();
+config.setAuthentication(authPluginClassName, authParams);
+config.setUseTls(useTls);
+config.setTlsAllowInsecureConnection(tlsAllowInsecureConnection);
+config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
+
+PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
+</code></pre>
 </span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/next/client-libraries-websocket"><span class="arrow-prev">← </span><span class="function-name-prevnext">WebSocket</span></a><a class="docs-next button" href="/docs/en/next/admin-api-clusters"><span>Clusters</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#admin-setup">Admin setup</a><ul class="toc-headings"><li><a hr [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
diff --git a/content/docs/en/next/client-libraries-java.html b/content/docs/en/next/client-libraries-java.html
index 5239220..9731ef1 100644
--- a/content/docs/en/next/client-libraries-java.html
+++ b/content/docs/en/next/client-libraries-java.html
@@ -115,6 +115,9 @@ dependencies {
 <p>Pulsar protocol URLs are assigned to specific clusters, use the <code>pulsar</code> scheme and have a default port of 6650. Here's an example for <code>localhost</code>:</p>
 <pre><code class="hljs css language-http">pulsar://localhost:6650
 </code></pre>
+<p>If you have more than one broker, the URL may look like this:</p>
+<pre><code class="hljs css language-http">pulsar://localhost:6550,localhost:6651,localhost:6652
+</code></pre>
 <p>A URL for a production Pulsar cluster may look something like this:</p>
 <pre><code class="hljs css language-http">pulsar://pulsar.us-west.example.com:6650
 </code></pre>
@@ -128,6 +131,11 @@ dependencies {
         .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650"</span>)
         .build();
 </code></pre>
+<p>If you have multiple brokers, you can initiate a PulsarClient like this:</p>
+<pre><code class="hljs css language-java">PulsarClient client = PulsarClient.builder()
+        .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650,localhost:6651,localhost:6652"</span>)
+        .build();
+</code></pre>
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="default-broker-urls-for-standalone-clusters"></a><a href="#default-broker-urls-for-standalone-clusters" 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-1v1h [...]
 <p>If you're running a cluster in <a href="/docs/en/next/standalone">standalone mode</a>, the broker will be available at the <code>pulsar://localhost:6650</code> URL by default.</p>
diff --git a/content/docs/en/next/client-libraries-java/index.html b/content/docs/en/next/client-libraries-java/index.html
index 5239220..9731ef1 100644
--- a/content/docs/en/next/client-libraries-java/index.html
+++ b/content/docs/en/next/client-libraries-java/index.html
@@ -115,6 +115,9 @@ dependencies {
 <p>Pulsar protocol URLs are assigned to specific clusters, use the <code>pulsar</code> scheme and have a default port of 6650. Here's an example for <code>localhost</code>:</p>
 <pre><code class="hljs css language-http">pulsar://localhost:6650
 </code></pre>
+<p>If you have more than one broker, the URL may look like this:</p>
+<pre><code class="hljs css language-http">pulsar://localhost:6550,localhost:6651,localhost:6652
+</code></pre>
 <p>A URL for a production Pulsar cluster may look something like this:</p>
 <pre><code class="hljs css language-http">pulsar://pulsar.us-west.example.com:6650
 </code></pre>
@@ -128,6 +131,11 @@ dependencies {
         .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650"</span>)
         .build();
 </code></pre>
+<p>If you have multiple brokers, you can initiate a PulsarClient like this:</p>
+<pre><code class="hljs css language-java">PulsarClient client = PulsarClient.builder()
+        .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650,localhost:6651,localhost:6652"</span>)
+        .build();
+</code></pre>
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="default-broker-urls-for-standalone-clusters"></a><a href="#default-broker-urls-for-standalone-clusters" 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-1v1h [...]
 <p>If you're running a cluster in <a href="/docs/en/next/standalone">standalone mode</a>, the broker will be available at the <code>pulsar://localhost:6650</code> URL by default.</p>
diff --git a/content/docs/en/next/cookbooks-compaction.html b/content/docs/en/next/cookbooks-compaction.html
index adb464e..a83b36d 100644
--- a/content/docs/en/next/cookbooks-compaction.html
+++ b/content/docs/en/next/cookbooks-compaction.html
@@ -87,7 +87,7 @@
 <p>Compaction only works on messages that have keys (as in the stock ticker example the stock symbol serves as the key for each message). Keys can thus be thought of as the axis along which compaction is applied. Messages that don't have keys are simply ignored by compaction.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="when-should-i-use-compacted-topics-when"></a><a href="#when-should-i-use-compacted-topics-when" 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  [...]
-<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scneario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
+<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scenario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
 <ul>
 <li>They can read from the &quot;original,&quot; non-compacted topic in case they need access to &quot;historical&quot; values, i.e. the entirety of the topic's messages.</li>
 <li>They can read from the compacted topic if they only want to see the most up-to-date messages.</li>
diff --git a/content/docs/en/next/cookbooks-compaction/index.html b/content/docs/en/next/cookbooks-compaction/index.html
index adb464e..a83b36d 100644
--- a/content/docs/en/next/cookbooks-compaction/index.html
+++ b/content/docs/en/next/cookbooks-compaction/index.html
@@ -87,7 +87,7 @@
 <p>Compaction only works on messages that have keys (as in the stock ticker example the stock symbol serves as the key for each message). Keys can thus be thought of as the axis along which compaction is applied. Messages that don't have keys are simply ignored by compaction.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="when-should-i-use-compacted-topics-when"></a><a href="#when-should-i-use-compacted-topics-when" 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  [...]
-<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scneario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
+<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scenario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
 <ul>
 <li>They can read from the &quot;original,&quot; non-compacted topic in case they need access to &quot;historical&quot; values, i.e. the entirety of the topic's messages.</li>
 <li>They can read from the compacted topic if they only want to see the most up-to-date messages.</li>
diff --git a/content/docs/en/next/deploy-bare-metal.html b/content/docs/en/next/deploy-bare-metal.html
index 65223c9..4a7c70c 100644
--- a/content/docs/en/next/deploy-bare-metal.html
+++ b/content/docs/en/next/deploy-bare-metal.html
@@ -120,6 +120,9 @@ for running ZooKeeper.</p>
 <p>However if you don't have enough machines, or are trying out Pulsar in cluster mode (and expand the cluster later),
 you can even deploy Pulsar in one node, where it will run zookeeper, bookie and broker in same machine.</p>
 </blockquote>
+<blockquote>
+<p>If you don't have a DNS server, you can use multi-host in service URL instead.</p>
+</blockquote>
 <p>Each machine in your cluster will need to have <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 8</a> or higher installed.</p>
 <p>Here's a diagram showing the basic setup:</p>
 <p><img src="/docs/assets/pulsar-basic-setup.png" alt="alt-text"></p>
diff --git a/content/docs/en/next/deploy-bare-metal/index.html b/content/docs/en/next/deploy-bare-metal/index.html
index 65223c9..4a7c70c 100644
--- a/content/docs/en/next/deploy-bare-metal/index.html
+++ b/content/docs/en/next/deploy-bare-metal/index.html
@@ -120,6 +120,9 @@ for running ZooKeeper.</p>
 <p>However if you don't have enough machines, or are trying out Pulsar in cluster mode (and expand the cluster later),
 you can even deploy Pulsar in one node, where it will run zookeeper, bookie and broker in same machine.</p>
 </blockquote>
+<blockquote>
+<p>If you don't have a DNS server, you can use multi-host in service URL instead.</p>
+</blockquote>
 <p>Each machine in your cluster will need to have <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 8</a> or higher installed.</p>
 <p>Here's a diagram showing the basic setup:</p>
 <p><img src="/docs/assets/pulsar-basic-setup.png" alt="alt-text"></p>
diff --git a/content/docs/en/next/develop-cpp.html b/content/docs/en/next/develop-cpp.html
index 5c1978e..a8d7716 100644
--- a/content/docs/en/next/develop-cpp.html
+++ b/content/docs/en/next/develop-cpp.html
@@ -96,7 +96,7 @@
 <h3><a class="anchor" aria-hidden="true" id="linux"></a><a href="#linux" 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.09 [...]
 <p>First, install all of the necessary dependencies:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> apt-get install cmake libssl-dev libcurl4-openssl-dev liblog4cxx-dev \</span>
-  libprotobuf-dev libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
+  libprotobuf-dev protobuf-compiler libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
 </code></pre>
 <p>Then compile and install <a href="https://github.com/google/googletest">Google Test</a>:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> libgtest-dev version is 1.18.0 or above</span>
diff --git a/content/docs/en/next/develop-cpp/index.html b/content/docs/en/next/develop-cpp/index.html
index 5c1978e..a8d7716 100644
--- a/content/docs/en/next/develop-cpp/index.html
+++ b/content/docs/en/next/develop-cpp/index.html
@@ -96,7 +96,7 @@
 <h3><a class="anchor" aria-hidden="true" id="linux"></a><a href="#linux" 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.09 [...]
 <p>First, install all of the necessary dependencies:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> apt-get install cmake libssl-dev libcurl4-openssl-dev liblog4cxx-dev \</span>
-  libprotobuf-dev libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
+  libprotobuf-dev protobuf-compiler libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
 </code></pre>
 <p>Then compile and install <a href="https://github.com/google/googletest">Google Test</a>:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> libgtest-dev version is 1.18.0 or above</span>
diff --git a/content/docs/en/next/functions-quickstart.html b/content/docs/en/next/functions-quickstart.html
index 6dec37e..51b9fc8 100644
--- a/content/docs/en/next/functions-quickstart.html
+++ b/content/docs/en/next/functions-quickstart.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/en/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/en/n [...]
-"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/en/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pul [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/en/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/en/next/ [...]
+"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/en/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar  [...]
 "/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.incubator.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.incubator.apache.org/blog/atom.x [...]
               (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),
@@ -76,23 +76,23 @@
                 };
               }
             });
-        </script></nav></div><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/functions-quickstart.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial will walk you through running a <a href="/docs/en/next/reference-ter [...]
+        </script></nav></div><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/functions-quickstart.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial walks you through running a <a href="/docs/en/next/reference-termino [...]
 <blockquote>
-<p>In local run mode, your Pulsar Function will communicate with your Pulsar cluster but will run outside of the cluster.</p>
+<p>In local run mode, Pulsar Functions communicate with Pulsar cluster, but run outside of the cluster.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" 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>In order to follow along with this tutorial, you'll need to have <a href="https://maven.apache.org/download.cgi">Maven</a> installed on your machine.</p>
+<p>Install <a href="https://maven.apache.org/download.cgi">Maven</a> on your machine.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-standalone-pulsar-cluster"></a><a href="#run-a-standalone-pulsar-cluster" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<p>In order to run our Pulsar Functions, we'll need to run a Pulsar cluster locally first. The easiest way to do that is to run Pulsar in <a href="/docs/en/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster:</p>
+<p>In order to run Pulsar Functions, you need to run a Pulsar cluster locally first. The easiest way is to run Pulsar in <a href="/docs/en/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster.</p>
 <pre><code class="hljs css language-bash">$ wget https://archive.apache.org/dist/pulsar/pulsar-2.3.2/apache-pulsar-2.3.2-bin.tar.gz
 $ tar xvfz apache-pulsar-2.3.2-bin.tar.gz
 $ <span class="hljs-built_in">cd</span> apache-pulsar-2.3.2
 $ bin/pulsar standalone \
   --advertised-address 127.0.0.1
 </code></pre>
-<p>When running Pulsar in standalone mode, the <code>public</code> tenant and <code>default</code> namespace will be created automatically for you. That tenant and namespace will be used throughout this tutorial.</p>
+<p>When running Pulsar in standalone mode, the <code>public</code> tenant and the <code>default</code> namespace are created automatically. The tenant and namespace are used throughout this tutorial.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-local-run-mode"></a><a href="#run-a-pulsar-function-in-local-run-mode" 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  [...]
-<p>Let's start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes that new string to another Pulsar topic. Here's the code for the function:</p>
+<p>You can start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes the new string to another Pulsar topic. The following is the code for the function.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.apache.pulsar.functions.api.examples;
 
 <span class="hljs-keyword">import</span> java.util.function.Function;
@@ -104,7 +104,7 @@ $ bin/pulsar standalone \
     }
 }
 </code></pre>
-<p>A JAR file containing this and several other functions (written in Java) is included with the binary distribution you downloaded above (in the <code>examples</code> folder). To run the function in local mode, i.e. on our laptop but outside our Pulsar cluster:</p>
+<p>A JAR file containing this function and several other functions (written in Java) is included with the binary distribution you have downloaded (in the <code>examples</code> folder). Run the function in local mode on your laptop but outside your Pulsar cluster with the following commands.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -113,38 +113,37 @@ $ bin/pulsar standalone \
   --name exclamation
 </code></pre>
 <blockquote>
-<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics-allowed"></a><a href="#multiple-input-topics-allowed" 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  [...]
-<p>In the example above, a single topic was specified using the <code>--inputs</code> flag. You can also specify multiple input topics as a comma-separated list using the same flag. Here's an example:</p>
+<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics"></a><a href="#multiple-input-topics" 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 [...]
+<p>In the example above, a single topic is specified using the <code>--inputs</code> flag. You can also specify multiple input topics with a comma-separated list using the same flag.</p>
 <pre><code class="hljs css language-bash">--inputs topic1,topic2
 </code></pre>
 </blockquote>
-<p>We can open up another shell and use the <a href="/docs/en/next/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool to listen for messages on the output topic:</p>
+<p>You can open up another shell and use the <a href="/docs/en/next/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool to listen for messages on the output topic.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-client consume persistent://public/default/exclamation-output \
   --subscription-name my-subscription \
   --num-messages 0
 </code></pre>
 <blockquote>
-<p>Setting the <code>--num-messages</code> flag to 0 means that the consumer will listen on the topic indefinitely (rather than only accepting a certain number of messages).</p>
+<p>Setting the <code>--num-messages</code> flag to <code>0</code> means that consumers listen on the topic indefinitely, rather than only accepting a certain number of messages.</p>
 </blockquote>
-<p>With a listener up and running, we can open up another shell and produce a message on the input topic that we specified:</p>
+<p>With a listener up and running, you can open up another shell and produce a message on the input topic that you specify.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-client produce persistent://public/default/exclamation-input \
   --num-produce 1 \
   --messages <span class="hljs-string">"Hello world"</span>
 </code></pre>
-<p>In the output, you should see the following:</p>
+<p>When the message has been successfully processed by the exclamation function, you will see the following output. To shut down the function, press <strong>Ctrl+C</strong>.</p>
 <pre><code class="hljs"><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span> <span class="hljs-comment">got</span> <span class="hljs-comment">message</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span>
 <span class="hljs-comment">Hello</span> <span class="hljs-comment">world!</span>
 </code></pre>
-<p>Success! As you can see, the message has been successfully processed by the exclamation function. To shut down the function, simply hit <strong>Ctrl+C</strong>.</p>
-<p>Here's what happened:</p>
+<h3><a class="anchor" aria-hidden="true" id="process-explanation"></a><a href="#process-explanation" 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.2 [...]
 <ul>
-<li>The <code>Hello world</code> message that we published to the input topic (<code>persistent://public/default/exclamation-input</code>) was passed to the exclamation function that we ran on our machine</li>
-<li>The exclamation function processed the message (providing a result of <code>Hello world!</code>) and published the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
-<li>If our exclamation function <em>hadn't</em> been running, Pulsar would have durably stored the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumed and acknowledged the message</li>
+<li>The <code>Hello world</code> message you publish to the input topic (<code>persistent://public/default/exclamation-input</code>) is passed to the exclamation function.</li>
+<li>The exclamation function processes the message (providing a result of <code>Hello world!</code>) and publishes the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
+<li>If the exclamation function <em>does not</em> run, Pulsar will durably store the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumes and acknowledges the message.</li>
 </ul>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-cluster-mode"></a><a href="#run-a-pulsar-function-in-cluster-mode" 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 [...]
-<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and experimentation, but if you want to use Pulsar Functions in a real Pulsar deployment, you'll want to run them in <strong>cluster mode</strong>. In this mode, Pulsar Functions run <em>inside</em> your Pulsar cluster and are managed using the same <a href="/docs/en/next/pulsar-admin#functions"><code>pulsar-admin functions</code></a> interface that we've been using thus far.</p>
-<p>This command, for example, would deploy the same exclamation function we ran locally above <em>in our Pulsar cluster</em> (rather than outside it):</p>
+<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and test. However, when you use Pulsar for real deployment, you run it in <strong>cluster mode</strong>. In cluster mode, Pulsar Functions run <em>inside</em> of your Pulsar cluster and are managed using the same <a href="/docs/en/next/pulsar-admin#functions"><code>pulsar-admin functions</code></a> interface.</p>
+<p>The following command deploys the same exclamation function you run locally in your Pulsar cluster, rather than outside of it.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -152,18 +151,18 @@ $ bin/pulsar standalone \
   --output persistent://public/default/exclamation-output \
   --name exclamation
 </code></pre>
-<p>You should see <code>Created successfully</code> in the output. Now, let's see a list of functions running in our cluster:</p>
+<p>You will see <code>Created successfully</code> in the output. Check the list of functions running in your cluster.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> list \
   --tenant public \
   --namespace default
 </code></pre>
-<p>We should see just the <code>exclamation</code> function listed there. We can also check the status of our deployed function using the <code>getstatus</code> command:</p>
+<p>You will see the <code>exclamation</code> function. Check the status of your deployed function using the <code>getstatus</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> getstatus \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"functionStatusList"</span>: [
     {
@@ -173,13 +172,13 @@ $ bin/pulsar standalone \
   ]
 }
 </code></pre>
-<p>As we can see, (a) the instance is currently running and (b) there is one instance, with an ID of 0, running. We can get other information about the function (topics, tenant, namespace, etc.) using the <code>get</code> command instead of <code>getstatus</code>:</p>
+<p>As you can see, the instance is currently running, and an instance with the ID of <code>0</code> is running. With the <code>get</code> command, you can get other information about the function, for example, topics, tenant, namespace, and so on.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> get \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -193,7 +192,7 @@ $ bin/pulsar standalone \
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">1</span>
 }
 </code></pre>
-<p>As we can see, the parallelism of the function is 1, meaning that only one instance of the function is running in our cluster. Let's update our function to a parallelism of 3 using the <code>update</code> command:</p>
+<p>As you can see, only one instance of the function is running in your cluster. Update the parallel functions to <code>3</code> using the <code>update</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> update \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -204,7 +203,7 @@ $ bin/pulsar standalone \
   --name exclamation \
   --parallelism 3
 </code></pre>
-<p>You should see <code>Updated successfully</code> in the output. If you run the <code>get</code> command from above for the function, you can see that the parallelism has increased to 3, meaning that there are now three instances of the function running in our cluster:</p>
+<p>You will see <code>Updated successfully</code> in the output. If you enter the <code>get</code> command, you see that the parallel functions are increased to <code>3</code>, meaning that three instances of the function are running in your cluster.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -218,28 +217,26 @@ $ bin/pulsar standalone \
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">3</span>
 }
 </code></pre>
-<p>Finally, we can shut down our running function using the <code>delete</code> command:</p>
+<p>Shut down the running function with the <code>delete</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> delete \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
-<h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" 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.5 [...]
-<blockquote>
-<p>In order to write and run the <a href="/docs/en/next/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>When you see <code>Deleted successfully</code> in the output, you've successfully run, updated, and shut down functions running in cluster mode.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-new-function"></a><a href="#write-and-run-a-new-function" 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 [...]
+<p>In order to write and run <a href="/docs/en/next/functions-api#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
-</blockquote>
-<p>In the above examples, we ran and managed a pre-written Pulsar Function and saw how it worked. To really get our hands dirty, let's write and our own function from scratch, using the Python API. This simple function will also take a string as input but it will reverse the string and publish the resulting, reversed string to the specified topic.</p>
-<p>First, create a new Python file:</p>
+<p>In the examples above, you run and manage pre-written Pulsar Functions and learn how they work. You can also write your own functions with Python API. In the following example, the function takes a string as input, reverses the string, and publishes the reversed string to the specified topic.</p>
+<p>First, create a new Python file.</p>
 <pre><code class="hljs css language-bash">$ touch reverse.py
 </code></pre>
-<p>In that file, add the following:</p>
+<p>Add the following information in the Python file.</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
-<p>Here, the <code>process</code> method defines the processing logic of the Pulsar Function. It simply uses some Python slice magic to reverse each incoming string. Now, we can deploy the function using <code>create</code>:</p>
+<p>The <code>process</code> method defines the processing logic of Pulsar Functions. It uses Python slice magic to reverse each incoming string. You can deploy the function using the <code>create</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --py reverse.py \
   --classname reverse \
@@ -249,30 +246,81 @@ $ bin/pulsar standalone \
   --namespace default \
   --name reverse
 </code></pre>
-<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, we can <strong>trigger</strong> the function using the <a href="/docs/en/next/pulsar-admin#trigger"><code>trigger</code></a> command. This command will send a message that we specify to the function and also give us the function's output. Here's an example:</p>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, you can <strong>trigger</strong> the function using the <a href="/docs/en/next/pulsar-admin#trigger"><code>trigger</code></a> command. This command sends a message that you specify to the function and returns the function output. The following is an example.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger \
   --name reverse \
   --tenant public \
   --namespace default \
   --trigger-value <span class="hljs-string">"sdrawrof won si tub sdrawkcab saw gnirts sihT"</span>
 </code></pre>
-<p>You should get this output:</p>
+<p>You will get the following output.</p>
 <pre><code class="hljs">This <span class="hljs-built_in">string</span> was backwards <span class="hljs-keyword">but</span> <span class="hljs-keyword">is</span> now forwards
 </code></pre>
-<p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
-<h2><a class="anchor" aria-hidden="true" id="packaging-python-dependencies"></a><a href="#packaging-python-dependencies" 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  [...]
-<p>For python functions requiring dependencies to be deployable in pulsar worker instances in an offline manner, we need to package the artifacts as below.</p>
-<h4><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Following programs are required to be installed on the client machine</p>
-<pre><code class="hljs">pip <span class="hljs-string">\\</span> rquired <span class="hljs-keyword">for</span> getting python dependencies
-zip <span class="hljs-string">\\</span> <span class="hljs-keyword">for</span> building zip archives
+<p>You have created a new Pulsar Function, deployed it in your Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a>, and triggered the Function.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-go-function"></a><a href="#write-and-run-a-go-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Go function depends on <code>pulsar-client-go</code>. Make sure that you have built <code>pulsar-client-go</code> before using Go function.</p>
+<p>To write and run a Go function, complete the following steps.</p>
+<ol>
+<li>Create a new Go file.</li>
+</ol>
+<pre><code class="hljs">touch helloFunc<span class="hljs-selector-class">.go</span>
+</code></pre>
+<ol start="2">
+<li>Append a byte for messages from the input topic.<br>
+The following is a <code>helloFunc.go</code> example. Each message from the input topic is appended with a <code>110</code> byte, and then delivered to the output topic.</li>
+</ol>
+<pre><code class="hljs"><span class="hljs-keyword">package</span> main
+
+<span class="hljs-keyword">import</span> (
+    <span class="hljs-string">"context"</span>
+
+    <span class="hljs-string">"github.com/apache/pulsar/pulsar-function-go/pf"</span>
+)
+
+<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">HandleResponse</span><span class="hljs-params">(ctx context.Context, in []<span class="hljs-keyword">byte</span>)</span> <span class="hljs-params">([]<span class="hljs-keyword">byte</span>, error)</span></span> {
+    res := <span class="hljs-built_in">append</span>(in, <span class="hljs-number">110</span>)
+    <span class="hljs-keyword">return</span> res, <span class="hljs-literal">nil</span>
+}
+
+<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
+    pf.Start(HandleResponse)
+}
 </code></pre>
-<h4><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
-<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the python function</p>
+<ol start="3">
+<li>Compile code.</li>
+</ol>
+<pre><code class="hljs"><span class="hljs-keyword">go</span> build -o examplepulsar helloFunc.<span class="hljs-keyword">go</span>
+</code></pre>
+<ol start="4">
+<li>Run Go function.</li>
+</ol>
+<pre><code class="hljs">$ bin/pulsar-admin functions create \
+  -<span class="ruby">-go examplepulsar \
+</span>  -<span class="ruby">-inputs <span class="hljs-symbol">persistent:</span>/<span class="hljs-regexp">/public/default</span><span class="hljs-regexp">/backwards \
+</span></span>  -<span class="ruby"><span class="hljs-regexp">-output persistent:/</span><span class="hljs-regexp">/public/default</span><span class="hljs-regexp">/forwards \
+</span></span>  -<span class="ruby"><span class="hljs-regexp">-tenant public \
+</span></span>  -<span class="ruby"><span class="hljs-regexp">-namespace default \
+</span></span>  -<span class="ruby"><span class="hljs-regexp">-name gofunc
+</span></span></code></pre>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Start a producer and produce messages to the <code>backwards</code> input topic. Start a consumer and consume messages from the <code>forwards</code> output topic, you will see <code>110</code> is appended to all messages.</p>
+<p>The <code>--classname</code> parameter is not specified when running Go function, because there is no <code>Class</code> concept in Go, which is different from Java and Python.</p>
+<blockquote>
+<p>Note<br>
+When you use the <code>--go</code> command to specify an executable file, make sure you have executable permissions.</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="package-python-dependencies"></a><a href="#package-python-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>When you deploy Python functions in a cluster offline, you need to package the required dependencies in a ZIP file before deployment.</p>
+<h3><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>The following programs are required to be installed on the client machine.</p>
+<pre><code class="hljs">pip \\ <span class="hljs-keyword">required</span> <span class="hljs-keyword">for</span> getting python dependencies
+<span class="hljs-built_in">zip</span> \\ <span class="hljs-keyword">for</span> building <span class="hljs-built_in">zip</span> archives
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
+<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the Python function.</p>
 <pre><code class="hljs">sh==<span class="hljs-number">1.12</span><span class="hljs-number">.14</span>
 </code></pre>
-<p>Prepare the pulsar function in folder called <strong>src</strong>.</p>
-<p>Run the following command to gather the python dependencies in the folder caller <strong>deps</strong></p>
+<p>Prepare the Pulsar Function in the <strong>src</strong> folder.</p>
+<p>Run the following command to gather Python dependencies in the <strong>deps</strong> folder.</p>
 <pre><code class="hljs">pip download \
 -<span class="ruby">-only-binary <span class="hljs-symbol">:all</span>: \
 </span>-<span class="ruby">-platform manylinux1_x86_64 \
@@ -281,15 +329,18 @@ zip <span class="hljs-string">\\</span> <span class="hljs-keyword">for</span> bu
 </span>-<span class="ruby">-abi cp27m -r requirements.txt -d deps
 </span>
 </code></pre>
-<p>Sample ouptut</p>
+<p>Sample output</p>
 <pre><code class="hljs">Collecting sh==<span class="hljs-number">1.12</span><span class="hljs-number">.14</span> (<span class="hljs-built_in">from</span> -r requirements.txt (<span class="hljs-built_in">line</span> <span class="hljs-number">1</span>))
   Using cached <span class="hljs-keyword">https</span>://<span class="hljs-built_in">files</span>.pythonhosted.org/packages/<span class="hljs-number">4</span><span class="hljs-keyword">a</span>/<span class="hljs-number">22</span>/<span class="hljs-number">17</span>b22ef5b049f12080f5815c41bf94de3c229217609e469001a8f80c1b3d/sh<span class="hljs-number">-1.12</span><span class="hljs-number">.14</span>-py2.py3-<span class="hljs-literal">none</span>-<span class="hljs-keyword">any</span>.whl
   Saved ./deps/sh<span class="hljs-number">-1.12</span><span class="hljs-number">.14</span>-py2.py3-<span class="hljs-literal">none</span>-<span class="hljs-keyword">any</span>.whl
 Successfully downloaded sh
 </code></pre>
-<p><strong>Note</strong> pulsar-client is not needed as a dependency as it already installed in the worker node.</p>
-<h4><a class="anchor" aria-hidden="true" id="packaging"></a><a href="#packaging" 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>Create a destination folder with the desired pacaking name eg : <strong>exclamation</strong>, copy <strong>src</strong> and <strong>deps</strong> folder into it and finally compress the folder into a zip archive.</p>
+<blockquote>
+<p>Note<br>
+<code>pulsar-client</code> is not needed as a dependency as it has already installed in the worker node.</p>
+</blockquote>
+<h4><a class="anchor" aria-hidden="true" id="package"></a><a href="#package" 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>Create a destination folder with the desired package name, for example, <strong>exclamation</strong>. Copy the <strong>src</strong> and <strong>deps</strong> folders into it, and compress the folder into a ZIP archive.</p>
 <p>Sample sequence</p>
 <pre><code class="hljs">cp -R deps exclamation/
 cp -R src exclamation/
@@ -303,12 +354,8 @@ drwxr-xr-x   <span class="hljs-number">3</span> a.ahmed  staff   <span class="hl
 
 zip -r exclamation.zip exclamation
 </code></pre>
-<p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
-<ul>
-<li><a href="/docs/en/next/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/next/functions-deploying">Deploying Pulsar Functions</a></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/next/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar clus [...]
+<p>After package all the required dependencies into the <strong>exclamation.zip</strong> file, you can deploy functions in a Pulsar worker. The Pulsar worker does not need internet connectivity to download packages, because they are all included in the ZIP file.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/next/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar clus [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/next/functions-quickstart/index.html b/content/docs/en/next/functions-quickstart/index.html
index 6dec37e..51b9fc8 100644
--- a/content/docs/en/next/functions-quickstart/index.html
+++ b/content/docs/en/next/functions-quickstart/index.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/en/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/en/n [...]
-"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/en/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pul [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/en/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/en/next/ [...]
+"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/en/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar  [...]
 "/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.incubator.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.incubator.apache.org/blog/atom.x [...]
               (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),
@@ -76,23 +76,23 @@
                 };
               }
             });
-        </script></nav></div><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/functions-quickstart.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial will walk you through running a <a href="/docs/en/next/reference-ter [...]
+        </script></nav></div><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/functions-quickstart.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial walks you through running a <a href="/docs/en/next/reference-termino [...]
 <blockquote>
-<p>In local run mode, your Pulsar Function will communicate with your Pulsar cluster but will run outside of the cluster.</p>
+<p>In local run mode, Pulsar Functions communicate with Pulsar cluster, but run outside of the cluster.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" 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>In order to follow along with this tutorial, you'll need to have <a href="https://maven.apache.org/download.cgi">Maven</a> installed on your machine.</p>
+<p>Install <a href="https://maven.apache.org/download.cgi">Maven</a> on your machine.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-standalone-pulsar-cluster"></a><a href="#run-a-standalone-pulsar-cluster" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<p>In order to run our Pulsar Functions, we'll need to run a Pulsar cluster locally first. The easiest way to do that is to run Pulsar in <a href="/docs/en/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster:</p>
+<p>In order to run Pulsar Functions, you need to run a Pulsar cluster locally first. The easiest way is to run Pulsar in <a href="/docs/en/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster.</p>
 <pre><code class="hljs css language-bash">$ wget https://archive.apache.org/dist/pulsar/pulsar-2.3.2/apache-pulsar-2.3.2-bin.tar.gz
 $ tar xvfz apache-pulsar-2.3.2-bin.tar.gz
 $ <span class="hljs-built_in">cd</span> apache-pulsar-2.3.2
 $ bin/pulsar standalone \
   --advertised-address 127.0.0.1
 </code></pre>
-<p>When running Pulsar in standalone mode, the <code>public</code> tenant and <code>default</code> namespace will be created automatically for you. That tenant and namespace will be used throughout this tutorial.</p>
+<p>When running Pulsar in standalone mode, the <code>public</code> tenant and the <code>default</code> namespace are created automatically. The tenant and namespace are used throughout this tutorial.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-local-run-mode"></a><a href="#run-a-pulsar-function-in-local-run-mode" 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  [...]
-<p>Let's start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes that new string to another Pulsar topic. Here's the code for the function:</p>
+<p>You can start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes the new string to another Pulsar topic. The following is the code for the function.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.apache.pulsar.functions.api.examples;
 
 <span class="hljs-keyword">import</span> java.util.function.Function;
@@ -104,7 +104,7 @@ $ bin/pulsar standalone \
     }
 }
 </code></pre>
-<p>A JAR file containing this and several other functions (written in Java) is included with the binary distribution you downloaded above (in the <code>examples</code> folder). To run the function in local mode, i.e. on our laptop but outside our Pulsar cluster:</p>
+<p>A JAR file containing this function and several other functions (written in Java) is included with the binary distribution you have downloaded (in the <code>examples</code> folder). Run the function in local mode on your laptop but outside your Pulsar cluster with the following commands.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -113,38 +113,37 @@ $ bin/pulsar standalone \
   --name exclamation
 </code></pre>
 <blockquote>
-<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics-allowed"></a><a href="#multiple-input-topics-allowed" 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  [...]
-<p>In the example above, a single topic was specified using the <code>--inputs</code> flag. You can also specify multiple input topics as a comma-separated list using the same flag. Here's an example:</p>
+<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics"></a><a href="#multiple-input-topics" 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 [...]
+<p>In the example above, a single topic is specified using the <code>--inputs</code> flag. You can also specify multiple input topics with a comma-separated list using the same flag.</p>
 <pre><code class="hljs css language-bash">--inputs topic1,topic2
 </code></pre>
 </blockquote>
-<p>We can open up another shell and use the <a href="/docs/en/next/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool to listen for messages on the output topic:</p>
+<p>You can open up another shell and use the <a href="/docs/en/next/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool to listen for messages on the output topic.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-client consume persistent://public/default/exclamation-output \
   --subscription-name my-subscription \
   --num-messages 0
 </code></pre>
 <blockquote>
-<p>Setting the <code>--num-messages</code> flag to 0 means that the consumer will listen on the topic indefinitely (rather than only accepting a certain number of messages).</p>
+<p>Setting the <code>--num-messages</code> flag to <code>0</code> means that consumers listen on the topic indefinitely, rather than only accepting a certain number of messages.</p>
 </blockquote>
-<p>With a listener up and running, we can open up another shell and produce a message on the input topic that we specified:</p>
+<p>With a listener up and running, you can open up another shell and produce a message on the input topic that you specify.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-client produce persistent://public/default/exclamation-input \
   --num-produce 1 \
   --messages <span class="hljs-string">"Hello world"</span>
 </code></pre>
-<p>In the output, you should see the following:</p>
+<p>When the message has been successfully processed by the exclamation function, you will see the following output. To shut down the function, press <strong>Ctrl+C</strong>.</p>
 <pre><code class="hljs"><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span> <span class="hljs-comment">got</span> <span class="hljs-comment">message</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span>
 <span class="hljs-comment">Hello</span> <span class="hljs-comment">world!</span>
 </code></pre>
-<p>Success! As you can see, the message has been successfully processed by the exclamation function. To shut down the function, simply hit <strong>Ctrl+C</strong>.</p>
-<p>Here's what happened:</p>
+<h3><a class="anchor" aria-hidden="true" id="process-explanation"></a><a href="#process-explanation" 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.2 [...]
 <ul>
-<li>The <code>Hello world</code> message that we published to the input topic (<code>persistent://public/default/exclamation-input</code>) was passed to the exclamation function that we ran on our machine</li>
-<li>The exclamation function processed the message (providing a result of <code>Hello world!</code>) and published the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
-<li>If our exclamation function <em>hadn't</em> been running, Pulsar would have durably stored the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumed and acknowledged the message</li>
+<li>The <code>Hello world</code> message you publish to the input topic (<code>persistent://public/default/exclamation-input</code>) is passed to the exclamation function.</li>
+<li>The exclamation function processes the message (providing a result of <code>Hello world!</code>) and publishes the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
+<li>If the exclamation function <em>does not</em> run, Pulsar will durably store the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumes and acknowledges the message.</li>
 </ul>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-cluster-mode"></a><a href="#run-a-pulsar-function-in-cluster-mode" 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 [...]
-<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and experimentation, but if you want to use Pulsar Functions in a real Pulsar deployment, you'll want to run them in <strong>cluster mode</strong>. In this mode, Pulsar Functions run <em>inside</em> your Pulsar cluster and are managed using the same <a href="/docs/en/next/pulsar-admin#functions"><code>pulsar-admin functions</code></a> interface that we've been using thus far.</p>
-<p>This command, for example, would deploy the same exclamation function we ran locally above <em>in our Pulsar cluster</em> (rather than outside it):</p>
+<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and test. However, when you use Pulsar for real deployment, you run it in <strong>cluster mode</strong>. In cluster mode, Pulsar Functions run <em>inside</em> of your Pulsar cluster and are managed using the same <a href="/docs/en/next/pulsar-admin#functions"><code>pulsar-admin functions</code></a> interface.</p>
+<p>The following command deploys the same exclamation function you run locally in your Pulsar cluster, rather than outside of it.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -152,18 +151,18 @@ $ bin/pulsar standalone \
   --output persistent://public/default/exclamation-output \
   --name exclamation
 </code></pre>
-<p>You should see <code>Created successfully</code> in the output. Now, let's see a list of functions running in our cluster:</p>
+<p>You will see <code>Created successfully</code> in the output. Check the list of functions running in your cluster.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> list \
   --tenant public \
   --namespace default
 </code></pre>
-<p>We should see just the <code>exclamation</code> function listed there. We can also check the status of our deployed function using the <code>getstatus</code> command:</p>
+<p>You will see the <code>exclamation</code> function. Check the status of your deployed function using the <code>getstatus</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> getstatus \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"functionStatusList"</span>: [
     {
@@ -173,13 +172,13 @@ $ bin/pulsar standalone \
   ]
 }
 </code></pre>
-<p>As we can see, (a) the instance is currently running and (b) there is one instance, with an ID of 0, running. We can get other information about the function (topics, tenant, namespace, etc.) using the <code>get</code> command instead of <code>getstatus</code>:</p>
+<p>As you can see, the instance is currently running, and an instance with the ID of <code>0</code> is running. With the <code>get</code> command, you can get other information about the function, for example, topics, tenant, namespace, and so on.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> get \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -193,7 +192,7 @@ $ bin/pulsar standalone \
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">1</span>
 }
 </code></pre>
-<p>As we can see, the parallelism of the function is 1, meaning that only one instance of the function is running in our cluster. Let's update our function to a parallelism of 3 using the <code>update</code> command:</p>
+<p>As you can see, only one instance of the function is running in your cluster. Update the parallel functions to <code>3</code> using the <code>update</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> update \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -204,7 +203,7 @@ $ bin/pulsar standalone \
   --name exclamation \
   --parallelism 3
 </code></pre>
-<p>You should see <code>Updated successfully</code> in the output. If you run the <code>get</code> command from above for the function, you can see that the parallelism has increased to 3, meaning that there are now three instances of the function running in our cluster:</p>
+<p>You will see <code>Updated successfully</code> in the output. If you enter the <code>get</code> command, you see that the parallel functions are increased to <code>3</code>, meaning that three instances of the function are running in your cluster.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -218,28 +217,26 @@ $ bin/pulsar standalone \
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">3</span>
 }
 </code></pre>
-<p>Finally, we can shut down our running function using the <code>delete</code> command:</p>
+<p>Shut down the running function with the <code>delete</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> delete \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
-<h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" 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.5 [...]
-<blockquote>
-<p>In order to write and run the <a href="/docs/en/next/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>When you see <code>Deleted successfully</code> in the output, you've successfully run, updated, and shut down functions running in cluster mode.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-new-function"></a><a href="#write-and-run-a-new-function" 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 [...]
+<p>In order to write and run <a href="/docs/en/next/functions-api#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
-</blockquote>
-<p>In the above examples, we ran and managed a pre-written Pulsar Function and saw how it worked. To really get our hands dirty, let's write and our own function from scratch, using the Python API. This simple function will also take a string as input but it will reverse the string and publish the resulting, reversed string to the specified topic.</p>
-<p>First, create a new Python file:</p>
+<p>In the examples above, you run and manage pre-written Pulsar Functions and learn how they work. You can also write your own functions with Python API. In the following example, the function takes a string as input, reverses the string, and publishes the reversed string to the specified topic.</p>
+<p>First, create a new Python file.</p>
 <pre><code class="hljs css language-bash">$ touch reverse.py
 </code></pre>
-<p>In that file, add the following:</p>
+<p>Add the following information in the Python file.</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
-<p>Here, the <code>process</code> method defines the processing logic of the Pulsar Function. It simply uses some Python slice magic to reverse each incoming string. Now, we can deploy the function using <code>create</code>:</p>
+<p>The <code>process</code> method defines the processing logic of Pulsar Functions. It uses Python slice magic to reverse each incoming string. You can deploy the function using the <code>create</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --py reverse.py \
   --classname reverse \
@@ -249,30 +246,81 @@ $ bin/pulsar standalone \
   --namespace default \
   --name reverse
 </code></pre>
-<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, we can <strong>trigger</strong> the function using the <a href="/docs/en/next/pulsar-admin#trigger"><code>trigger</code></a> command. This command will send a message that we specify to the function and also give us the function's output. Here's an example:</p>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, you can <strong>trigger</strong> the function using the <a href="/docs/en/next/pulsar-admin#trigger"><code>trigger</code></a> command. This command sends a message that you specify to the function and returns the function output. The following is an example.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger \
   --name reverse \
   --tenant public \
   --namespace default \
   --trigger-value <span class="hljs-string">"sdrawrof won si tub sdrawkcab saw gnirts sihT"</span>
 </code></pre>
-<p>You should get this output:</p>
+<p>You will get the following output.</p>
 <pre><code class="hljs">This <span class="hljs-built_in">string</span> was backwards <span class="hljs-keyword">but</span> <span class="hljs-keyword">is</span> now forwards
 </code></pre>
-<p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
-<h2><a class="anchor" aria-hidden="true" id="packaging-python-dependencies"></a><a href="#packaging-python-dependencies" 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  [...]
-<p>For python functions requiring dependencies to be deployable in pulsar worker instances in an offline manner, we need to package the artifacts as below.</p>
-<h4><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Following programs are required to be installed on the client machine</p>
-<pre><code class="hljs">pip <span class="hljs-string">\\</span> rquired <span class="hljs-keyword">for</span> getting python dependencies
-zip <span class="hljs-string">\\</span> <span class="hljs-keyword">for</span> building zip archives
+<p>You have created a new Pulsar Function, deployed it in your Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a>, and triggered the Function.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-go-function"></a><a href="#write-and-run-a-go-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Go function depends on <code>pulsar-client-go</code>. Make sure that you have built <code>pulsar-client-go</code> before using Go function.</p>
+<p>To write and run a Go function, complete the following steps.</p>
+<ol>
+<li>Create a new Go file.</li>
+</ol>
+<pre><code class="hljs">touch helloFunc<span class="hljs-selector-class">.go</span>
+</code></pre>
+<ol start="2">
+<li>Append a byte for messages from the input topic.<br>
+The following is a <code>helloFunc.go</code> example. Each message from the input topic is appended with a <code>110</code> byte, and then delivered to the output topic.</li>
+</ol>
+<pre><code class="hljs"><span class="hljs-keyword">package</span> main
+
+<span class="hljs-keyword">import</span> (
+    <span class="hljs-string">"context"</span>
+
+    <span class="hljs-string">"github.com/apache/pulsar/pulsar-function-go/pf"</span>
+)
+
+<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">HandleResponse</span><span class="hljs-params">(ctx context.Context, in []<span class="hljs-keyword">byte</span>)</span> <span class="hljs-params">([]<span class="hljs-keyword">byte</span>, error)</span></span> {
+    res := <span class="hljs-built_in">append</span>(in, <span class="hljs-number">110</span>)
+    <span class="hljs-keyword">return</span> res, <span class="hljs-literal">nil</span>
+}
+
+<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
+    pf.Start(HandleResponse)
+}
 </code></pre>
-<h4><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
-<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the python function</p>
+<ol start="3">
+<li>Compile code.</li>
+</ol>
+<pre><code class="hljs"><span class="hljs-keyword">go</span> build -o examplepulsar helloFunc.<span class="hljs-keyword">go</span>
+</code></pre>
+<ol start="4">
+<li>Run Go function.</li>
+</ol>
+<pre><code class="hljs">$ bin/pulsar-admin functions create \
+  -<span class="ruby">-go examplepulsar \
+</span>  -<span class="ruby">-inputs <span class="hljs-symbol">persistent:</span>/<span class="hljs-regexp">/public/default</span><span class="hljs-regexp">/backwards \
+</span></span>  -<span class="ruby"><span class="hljs-regexp">-output persistent:/</span><span class="hljs-regexp">/public/default</span><span class="hljs-regexp">/forwards \
+</span></span>  -<span class="ruby"><span class="hljs-regexp">-tenant public \
+</span></span>  -<span class="ruby"><span class="hljs-regexp">-namespace default \
+</span></span>  -<span class="ruby"><span class="hljs-regexp">-name gofunc
+</span></span></code></pre>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Start a producer and produce messages to the <code>backwards</code> input topic. Start a consumer and consume messages from the <code>forwards</code> output topic, you will see <code>110</code> is appended to all messages.</p>
+<p>The <code>--classname</code> parameter is not specified when running Go function, because there is no <code>Class</code> concept in Go, which is different from Java and Python.</p>
+<blockquote>
+<p>Note<br>
+When you use the <code>--go</code> command to specify an executable file, make sure you have executable permissions.</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="package-python-dependencies"></a><a href="#package-python-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>When you deploy Python functions in a cluster offline, you need to package the required dependencies in a ZIP file before deployment.</p>
+<h3><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>The following programs are required to be installed on the client machine.</p>
+<pre><code class="hljs">pip \\ <span class="hljs-keyword">required</span> <span class="hljs-keyword">for</span> getting python dependencies
+<span class="hljs-built_in">zip</span> \\ <span class="hljs-keyword">for</span> building <span class="hljs-built_in">zip</span> archives
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
+<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the Python function.</p>
 <pre><code class="hljs">sh==<span class="hljs-number">1.12</span><span class="hljs-number">.14</span>
 </code></pre>
-<p>Prepare the pulsar function in folder called <strong>src</strong>.</p>
-<p>Run the following command to gather the python dependencies in the folder caller <strong>deps</strong></p>
+<p>Prepare the Pulsar Function in the <strong>src</strong> folder.</p>
+<p>Run the following command to gather Python dependencies in the <strong>deps</strong> folder.</p>
 <pre><code class="hljs">pip download \
 -<span class="ruby">-only-binary <span class="hljs-symbol">:all</span>: \
 </span>-<span class="ruby">-platform manylinux1_x86_64 \
@@ -281,15 +329,18 @@ zip <span class="hljs-string">\\</span> <span class="hljs-keyword">for</span> bu
 </span>-<span class="ruby">-abi cp27m -r requirements.txt -d deps
 </span>
 </code></pre>
-<p>Sample ouptut</p>
+<p>Sample output</p>
 <pre><code class="hljs">Collecting sh==<span class="hljs-number">1.12</span><span class="hljs-number">.14</span> (<span class="hljs-built_in">from</span> -r requirements.txt (<span class="hljs-built_in">line</span> <span class="hljs-number">1</span>))
   Using cached <span class="hljs-keyword">https</span>://<span class="hljs-built_in">files</span>.pythonhosted.org/packages/<span class="hljs-number">4</span><span class="hljs-keyword">a</span>/<span class="hljs-number">22</span>/<span class="hljs-number">17</span>b22ef5b049f12080f5815c41bf94de3c229217609e469001a8f80c1b3d/sh<span class="hljs-number">-1.12</span><span class="hljs-number">.14</span>-py2.py3-<span class="hljs-literal">none</span>-<span class="hljs-keyword">any</span>.whl
   Saved ./deps/sh<span class="hljs-number">-1.12</span><span class="hljs-number">.14</span>-py2.py3-<span class="hljs-literal">none</span>-<span class="hljs-keyword">any</span>.whl
 Successfully downloaded sh
 </code></pre>
-<p><strong>Note</strong> pulsar-client is not needed as a dependency as it already installed in the worker node.</p>
-<h4><a class="anchor" aria-hidden="true" id="packaging"></a><a href="#packaging" 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>Create a destination folder with the desired pacaking name eg : <strong>exclamation</strong>, copy <strong>src</strong> and <strong>deps</strong> folder into it and finally compress the folder into a zip archive.</p>
+<blockquote>
+<p>Note<br>
+<code>pulsar-client</code> is not needed as a dependency as it has already installed in the worker node.</p>
+</blockquote>
+<h4><a class="anchor" aria-hidden="true" id="package"></a><a href="#package" 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>Create a destination folder with the desired package name, for example, <strong>exclamation</strong>. Copy the <strong>src</strong> and <strong>deps</strong> folders into it, and compress the folder into a ZIP archive.</p>
 <p>Sample sequence</p>
 <pre><code class="hljs">cp -R deps exclamation/
 cp -R src exclamation/
@@ -303,12 +354,8 @@ drwxr-xr-x   <span class="hljs-number">3</span> a.ahmed  staff   <span class="hl
 
 zip -r exclamation.zip exclamation
 </code></pre>
-<p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
-<ul>
-<li><a href="/docs/en/next/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/next/functions-deploying">Deploying Pulsar Functions</a></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/next/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar clus [...]
+<p>After package all the required dependencies into the <strong>exclamation.zip</strong> file, you can deploy functions in a Pulsar worker. The Pulsar worker does not need internet connectivity to download packages, because they are all included in the ZIP file.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/next/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar clus [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/fr/next/admin-api-overview.html b/content/docs/fr/next/admin-api-overview.html
index 6aa6533..3932803 100644
--- a/content/docs/fr/next/admin-api-overview.html
+++ b/content/docs/fr/next/admin-api-overview.html
@@ -137,6 +137,24 @@ config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
 
 PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
 </code></pre>
+<p>If you have multiple brokers to use, you can use multi-host like Pulsar service. For example,</p>
+<pre><code class="hljs css language-java">URL url = <span class="hljs-keyword">new</span> URL(<span class="hljs-string">"http://localhost:8080,localhost:8081,localhost:8082"</span>);
+<span class="hljs-comment">// Pass auth-plugin class fully-qualified name if Pulsar-security is enabled.</span>
+String authPluginClassName = <span class="hljs-string">"com.org.MyAuthPluginClass"</span>; 
+<span class="hljs-comment">// Pass auth-param if auth-plugin class requires it</span>
+String authParams = <span class="hljs-string">"param1=value1"</span>;
+<span class="hljs-keyword">boolean</span> useTls = <span class="hljs-keyword">false</span>;
+<span class="hljs-keyword">boolean</span> tlsAllowInsecureConnection = <span class="hljs-keyword">false</span>;
+String tlsTrustCertsFilePath = <span class="hljs-keyword">null</span>;
+
+ClientConfiguration config = <span class="hljs-keyword">new</span> ClientConfiguration();
+config.setAuthentication(authPluginClassName, authParams);
+config.setUseTls(useTls);
+config.setTlsAllowInsecureConnection(tlsAllowInsecureConnection);
+config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
+
+PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
+</code></pre>
 </span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/fr/next/client-libraries-websocket"><span class="arrow-prev">← </span><span class="function-name-prevnext">WebSocket</span></a><a class="docs-next button" href="/docs/fr/next/admin-api-clusters"><span>Clusters</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#admin-setup">Admin setup</a><ul class="toc-headings"><li><a hr [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
diff --git a/content/docs/fr/next/admin-api-overview/index.html b/content/docs/fr/next/admin-api-overview/index.html
index 6aa6533..3932803 100644
--- a/content/docs/fr/next/admin-api-overview/index.html
+++ b/content/docs/fr/next/admin-api-overview/index.html
@@ -137,6 +137,24 @@ config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
 
 PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
 </code></pre>
+<p>If you have multiple brokers to use, you can use multi-host like Pulsar service. For example,</p>
+<pre><code class="hljs css language-java">URL url = <span class="hljs-keyword">new</span> URL(<span class="hljs-string">"http://localhost:8080,localhost:8081,localhost:8082"</span>);
+<span class="hljs-comment">// Pass auth-plugin class fully-qualified name if Pulsar-security is enabled.</span>
+String authPluginClassName = <span class="hljs-string">"com.org.MyAuthPluginClass"</span>; 
+<span class="hljs-comment">// Pass auth-param if auth-plugin class requires it</span>
+String authParams = <span class="hljs-string">"param1=value1"</span>;
+<span class="hljs-keyword">boolean</span> useTls = <span class="hljs-keyword">false</span>;
+<span class="hljs-keyword">boolean</span> tlsAllowInsecureConnection = <span class="hljs-keyword">false</span>;
+String tlsTrustCertsFilePath = <span class="hljs-keyword">null</span>;
+
+ClientConfiguration config = <span class="hljs-keyword">new</span> ClientConfiguration();
+config.setAuthentication(authPluginClassName, authParams);
+config.setUseTls(useTls);
+config.setTlsAllowInsecureConnection(tlsAllowInsecureConnection);
+config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
+
+PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
+</code></pre>
 </span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/fr/next/client-libraries-websocket"><span class="arrow-prev">← </span><span class="function-name-prevnext">WebSocket</span></a><a class="docs-next button" href="/docs/fr/next/admin-api-clusters"><span>Clusters</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#admin-setup">Admin setup</a><ul class="toc-headings"><li><a hr [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
diff --git a/content/docs/fr/next/client-libraries-java.html b/content/docs/fr/next/client-libraries-java.html
index 82a8115..291cfd8 100644
--- a/content/docs/fr/next/client-libraries-java.html
+++ b/content/docs/fr/next/client-libraries-java.html
@@ -115,6 +115,9 @@ dependencies {
 <p>Les URLs du protocole de Pulsar sont assignées à des clusters spécifiques, utilisent le schéma <code>pulsar</code> et ont comme port par défaut 6650. Voici un exemple pour <code>localhost</code>:</p>
 <pre><code class="hljs css language-http">pulsar://localhost:6650
 </code></pre>
+<p>If you have more than one broker, the URL may look like this:</p>
+<pre><code class="hljs css language-http">pulsar://localhost:6550,localhost:6651,localhost:6652
+</code></pre>
 <p>Une URL pour un cluster Pulsar de production peut ressembler à ceci :</p>
 <pre><code class="hljs css language-http">pulsar://pulsar.us-west.example.com:6650
 </code></pre>
@@ -128,6 +131,11 @@ dependencies {
         .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650"</span>)
         .build();
 </code></pre>
+<p>If you have multiple brokers, you can initiate a PulsarClient like this:</p>
+<pre><code class="hljs css language-java">PulsarClient client = PulsarClient.builder()
+        .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650,localhost:6651,localhost:6652"</span>)
+        .build();
+</code></pre>
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="url-par-defaut-pour-les-clusters-en-mode-standalone"></a><a href="#url-par-defaut-pour-les-clusters-en-mode-standalone" 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  [...]
 <p>Si vous exécutez un cluster en mode <a href="/docs/fr/next/standalone">standalone</a>, le broker sera disponible à l'URL <code>pulsar://localhost:6650</code> par défaut.</p>
@@ -173,7 +181,7 @@ Les opérations de fermeture peuvent également être asynchrones :
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="configuration-des-producteurs"></a><a href="#configuration-des-producteurs" 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  [...]
 <p>Si vous instanciez un objet <code>Producer</code> en spécifiant seulement un nom detopic, comme dans l'exemple ci-dessus, le producteur utilisera la configuration par défaut. Pour utiliser une configuration différente de celle par défaut, il existe une variété de paramètres configurables que vous pouvez définir. Pour une liste complète, voir la javadoc pour la classe <a href="https://pulsar.incubator.apache.org/api/client/org/apache/pulsar/client/api/ProducerBuilder">ProducerBuilder</a>
- . Voici un exemple :</p>
+ . Here's an example:</p>
 <pre><code class="hljs css language-java">Producer&lt;<span class="hljs-keyword">byte</span>[]&gt; producer = client.newProducer()
     .topic(<span class="hljs-string">"my-topic"</span>)
     .batchingMaxPublishDelay(<span class="hljs-number">10</span>, TimeUnit.MILLISECONDS)
diff --git a/content/docs/fr/next/client-libraries-java/index.html b/content/docs/fr/next/client-libraries-java/index.html
index 82a8115..291cfd8 100644
--- a/content/docs/fr/next/client-libraries-java/index.html
+++ b/content/docs/fr/next/client-libraries-java/index.html
@@ -115,6 +115,9 @@ dependencies {
 <p>Les URLs du protocole de Pulsar sont assignées à des clusters spécifiques, utilisent le schéma <code>pulsar</code> et ont comme port par défaut 6650. Voici un exemple pour <code>localhost</code>:</p>
 <pre><code class="hljs css language-http">pulsar://localhost:6650
 </code></pre>
+<p>If you have more than one broker, the URL may look like this:</p>
+<pre><code class="hljs css language-http">pulsar://localhost:6550,localhost:6651,localhost:6652
+</code></pre>
 <p>Une URL pour un cluster Pulsar de production peut ressembler à ceci :</p>
 <pre><code class="hljs css language-http">pulsar://pulsar.us-west.example.com:6650
 </code></pre>
@@ -128,6 +131,11 @@ dependencies {
         .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650"</span>)
         .build();
 </code></pre>
+<p>If you have multiple brokers, you can initiate a PulsarClient like this:</p>
+<pre><code class="hljs css language-java">PulsarClient client = PulsarClient.builder()
+        .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650,localhost:6651,localhost:6652"</span>)
+        .build();
+</code></pre>
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="url-par-defaut-pour-les-clusters-en-mode-standalone"></a><a href="#url-par-defaut-pour-les-clusters-en-mode-standalone" 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  [...]
 <p>Si vous exécutez un cluster en mode <a href="/docs/fr/next/standalone">standalone</a>, le broker sera disponible à l'URL <code>pulsar://localhost:6650</code> par défaut.</p>
@@ -173,7 +181,7 @@ Les opérations de fermeture peuvent également être asynchrones :
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="configuration-des-producteurs"></a><a href="#configuration-des-producteurs" 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  [...]
 <p>Si vous instanciez un objet <code>Producer</code> en spécifiant seulement un nom detopic, comme dans l'exemple ci-dessus, le producteur utilisera la configuration par défaut. Pour utiliser une configuration différente de celle par défaut, il existe une variété de paramètres configurables que vous pouvez définir. Pour une liste complète, voir la javadoc pour la classe <a href="https://pulsar.incubator.apache.org/api/client/org/apache/pulsar/client/api/ProducerBuilder">ProducerBuilder</a>
- . Voici un exemple :</p>
+ . Here's an example:</p>
 <pre><code class="hljs css language-java">Producer&lt;<span class="hljs-keyword">byte</span>[]&gt; producer = client.newProducer()
     .topic(<span class="hljs-string">"my-topic"</span>)
     .batchingMaxPublishDelay(<span class="hljs-number">10</span>, TimeUnit.MILLISECONDS)
diff --git a/content/docs/fr/next/cookbooks-compaction.html b/content/docs/fr/next/cookbooks-compaction.html
index 76f9960..847f8df 100644
--- a/content/docs/fr/next/cookbooks-compaction.html
+++ b/content/docs/fr/next/cookbooks-compaction.html
@@ -87,7 +87,7 @@
 <p>Compaction only works on messages that have keys (as in the stock ticker example the stock symbol serves as the key for each message). Keys can thus be thought of as the axis along which compaction is applied. Messages that don't have keys are simply ignored by compaction.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="when-should-i-use-compacted-topics-when"></a><a href="#when-should-i-use-compacted-topics-when" 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  [...]
-<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scneario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
+<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scenario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
 <ul>
 <li>They can read from the &quot;original,&quot; non-compacted topic in case they need access to &quot;historical&quot; values, i.e. the entirety of the topic's messages.</li>
 <li>They can read from the compacted topic if they only want to see the most up-to-date messages.</li>
diff --git a/content/docs/fr/next/cookbooks-compaction/index.html b/content/docs/fr/next/cookbooks-compaction/index.html
index 76f9960..847f8df 100644
--- a/content/docs/fr/next/cookbooks-compaction/index.html
+++ b/content/docs/fr/next/cookbooks-compaction/index.html
@@ -87,7 +87,7 @@
 <p>Compaction only works on messages that have keys (as in the stock ticker example the stock symbol serves as the key for each message). Keys can thus be thought of as the axis along which compaction is applied. Messages that don't have keys are simply ignored by compaction.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="when-should-i-use-compacted-topics-when"></a><a href="#when-should-i-use-compacted-topics-when" 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  [...]
-<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scneario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
+<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scenario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
 <ul>
 <li>They can read from the &quot;original,&quot; non-compacted topic in case they need access to &quot;historical&quot; values, i.e. the entirety of the topic's messages.</li>
 <li>They can read from the compacted topic if they only want to see the most up-to-date messages.</li>
diff --git a/content/docs/fr/next/deploy-bare-metal.html b/content/docs/fr/next/deploy-bare-metal.html
index e54db0e..8e8d136 100644
--- a/content/docs/fr/next/deploy-bare-metal.html
+++ b/content/docs/fr/next/deploy-bare-metal.html
@@ -111,6 +111,7 @@
 </ul>
 <blockquote>
 <p>However if you don't have enough machines, or are trying out Pulsar in cluster mode (and expand the cluster later), you can even deploy Pulsar in one node, where it will run zookeeper, bookie and broker in same machine.</p>
+<p>If you don't have a DNS server, you can use multi-host in service URL instead.</p>
 </blockquote>
 <p>Each machine in your cluster will need to have <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 8</a> or higher installed.</p>
 <p>Here's a diagram showing the basic setup:</p>
diff --git a/content/docs/fr/next/deploy-bare-metal/index.html b/content/docs/fr/next/deploy-bare-metal/index.html
index e54db0e..8e8d136 100644
--- a/content/docs/fr/next/deploy-bare-metal/index.html
+++ b/content/docs/fr/next/deploy-bare-metal/index.html
@@ -111,6 +111,7 @@
 </ul>
 <blockquote>
 <p>However if you don't have enough machines, or are trying out Pulsar in cluster mode (and expand the cluster later), you can even deploy Pulsar in one node, where it will run zookeeper, bookie and broker in same machine.</p>
+<p>If you don't have a DNS server, you can use multi-host in service URL instead.</p>
 </blockquote>
 <p>Each machine in your cluster will need to have <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 8</a> or higher installed.</p>
 <p>Here's a diagram showing the basic setup:</p>
diff --git a/content/docs/fr/next/develop-cpp.html b/content/docs/fr/next/develop-cpp.html
index 1837d75..d5ad957 100644
--- a/content/docs/fr/next/develop-cpp.html
+++ b/content/docs/fr/next/develop-cpp.html
@@ -96,7 +96,7 @@
 <h3><a class="anchor" aria-hidden="true" id="linux"></a><a href="#linux" 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.09 [...]
 <p>First, install all of the necessary dependencies:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> apt-get install cmake libssl-dev libcurl4-openssl-dev liblog4cxx-dev \</span>
-  libprotobuf-dev libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
+  libprotobuf-dev protobuf-compiler libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
 </code></pre>
 <p>Then compile and install <a href="https://github.com/google/googletest">Google Test</a>:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> libgtest-dev version is 1.18.0 or above</span>
diff --git a/content/docs/fr/next/develop-cpp/index.html b/content/docs/fr/next/develop-cpp/index.html
index 1837d75..d5ad957 100644
--- a/content/docs/fr/next/develop-cpp/index.html
+++ b/content/docs/fr/next/develop-cpp/index.html
@@ -96,7 +96,7 @@
 <h3><a class="anchor" aria-hidden="true" id="linux"></a><a href="#linux" 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.09 [...]
 <p>First, install all of the necessary dependencies:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> apt-get install cmake libssl-dev libcurl4-openssl-dev liblog4cxx-dev \</span>
-  libprotobuf-dev libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
+  libprotobuf-dev protobuf-compiler libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
 </code></pre>
 <p>Then compile and install <a href="https://github.com/google/googletest">Google Test</a>:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> libgtest-dev version is 1.18.0 or above</span>
diff --git a/content/docs/fr/next/functions-quickstart.html b/content/docs/fr/next/functions-quickstart.html
index 8c5556d..b26b5fe 100644
--- a/content/docs/fr/next/functions-quickstart.html
+++ b/content/docs/fr/next/functions-quickstart.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="fr"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/fr/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/fr/n [...]
-"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="fr"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/fr/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pul [...]
+<!DOCTYPE html><html lang="fr"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/fr/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/fr/next/ [...]
+"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="fr"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/fr/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar  [...]
 "/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.incubator.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.incubator.apache.org/blog/atom.x [...]
               (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),
@@ -76,23 +76,23 @@
                 };
               }
             });
-        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial will walk you through running a <a href="/docs/fr/next/reference-terminology#standalone">standalone</a> Puls [...]
+        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial walks you through running a <a href="/docs/fr/next/reference-terminology#standalone">standalone</a> Pulsar < [...]
 <blockquote>
-<p>In local run mode, your Pulsar Function will communicate with your Pulsar cluster but will run outside of the cluster.</p>
+<p>In local run mode, Pulsar Functions communicate with Pulsar cluster, but run outside of the cluster.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" 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>In order to follow along with this tutorial, you'll need to have <a href="https://maven.apache.org/download.cgi">Maven</a> installed on your machine.</p>
+<p>Install <a href="https://maven.apache.org/download.cgi">Maven</a> on your machine.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-standalone-pulsar-cluster"></a><a href="#run-a-standalone-pulsar-cluster" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<p>In order to run our Pulsar Functions, we'll need to run a Pulsar cluster locally first. The easiest way to do that is to run Pulsar in <a href="/docs/fr/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster:</p>
+<p>In order to run Pulsar Functions, you need to run a Pulsar cluster locally first. The easiest way is to run Pulsar in <a href="/docs/fr/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster.</p>
 <pre><code class="hljs css language-bash">$ wget https://archive.apache.org/dist/pulsar/pulsar-2.3.2/apache-pulsar-2.3.2-bin.tar.gz
 $ tar xvfz apache-pulsar-2.3.2-bin.tar.gz
 $ <span class="hljs-built_in">cd</span> apache-pulsar-2.3.2
 $ bin/pulsar standalone \
   --advertised-address 127.0.0.1
 </code></pre>
-<p>When running Pulsar in standalone mode, the <code>public</code> tenant and <code>default</code> namespace will be created automatically for you. That tenant and namespace will be used throughout this tutorial.</p>
+<p>When running Pulsar in standalone mode, the <code>public</code> tenant and the <code>default</code> namespace are created automatically. The tenant and namespace are used throughout this tutorial.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-local-run-mode"></a><a href="#run-a-pulsar-function-in-local-run-mode" 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  [...]
-<p>Let's start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes that new string to another Pulsar topic. Here's the code for the function:</p>
+<p>You can start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes the new string to another Pulsar topic. The following is the code for the function.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.apache.pulsar.functions.api.examples;
 
 <span class="hljs-keyword">import</span> java.util.function.Function;
@@ -104,7 +104,7 @@ $ bin/pulsar standalone \
     }
 }
 </code></pre>
-<p>A JAR file containing this and several other functions (written in Java) is included with the binary distribution you downloaded above (in the <code>examples</code> folder). To run the function in local mode, i.e. on our laptop but outside our Pulsar cluster:</p>
+<p>A JAR file containing this function and several other functions (written in Java) is included with the binary distribution you have downloaded (in the <code>examples</code> folder). Run the function in local mode on your laptop but outside your Pulsar cluster with the following commands.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -113,13 +113,13 @@ $ bin/pulsar standalone \
   --name exclamation
 </code></pre>
 <blockquote>
-<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics-allowed"></a><a href="#multiple-input-topics-allowed" 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  [...]
-<p>In the example above, a single topic was specified using the <code>--inputs</code> flag. You can also specify multiple input topics as a comma-separated list using the same flag. Here's an example:</p>
+<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics"></a><a href="#multiple-input-topics" 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 [...]
+<p>In the example above, a single topic is specified using the <code>--inputs</code> flag. You can also specify multiple input topics with a comma-separated list using the same flag.</p>
 <pre><code class="hljs css language-bash"></code></pre>
 </blockquote>
 <p>--inputs topic1,topic2</p>
 <pre><code class="hljs">
-We can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic:
+You can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic.
 
 <span class="hljs-code">```bash
 $ bin/pulsar-client consume persistent://public/default/exclamation-output \
@@ -127,27 +127,26 @@ $ bin/pulsar-client consume persistent://public/default/exclamation-output \
   --num-messages 0
 </span></code></pre>
 <blockquote>
-<p>Setting the <code>--num-messages</code> flag to 0 means that the consumer will listen on the topic indefinitely (rather than only accepting a certain number of messages).</p>
+<p>Setting the <code>--num-messages</code> flag to <code>0</code> means that consumers listen on the topic indefinitely, rather than only accepting a certain number of messages.</p>
 </blockquote>
-<p>With a listener up and running, we can open up another shell and produce a message on the input topic that we specified:</p>
+<p>With a listener up and running, you can open up another shell and produce a message on the input topic that you specify.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-client produce persistent://public/default/exclamation-input \
   --num-produce 1 \
   --messages <span class="hljs-string">"Hello world"</span>
 </code></pre>
-<p>In the output, you should see the following:</p>
+<p>When the message has been successfully processed by the exclamation function, you will see the following output. To shut down the function, press <strong>Ctrl+C</strong>.</p>
 <pre><code class="hljs">----- got message -----
 Hello world!
 </code></pre>
-<p>Success! As you can see, the message has been successfully processed by the exclamation function. To shut down the function, simply hit <strong>Ctrl+C</strong>.</p>
-<p>Here's what happened:</p>
+<h3><a class="anchor" aria-hidden="true" id="process-explanation"></a><a href="#process-explanation" 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.2 [...]
 <ul>
-<li>The <code>Hello world</code> message that we published to the input topic (<code>persistent://public/default/exclamation-input</code>) was passed to the exclamation function that we ran on our machine</li>
-<li>The exclamation function processed the message (providing a result of <code>Hello world!</code>) and published the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
-<li>If our exclamation function <em>hadn't</em> been running, Pulsar would have durably stored the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumed and acknowledged the message</li>
+<li>The <code>Hello world</code> message you publish to the input topic (<code>persistent://public/default/exclamation-input</code>) is passed to the exclamation function.</li>
+<li>The exclamation function processes the message (providing a result of <code>Hello world!</code>) and publishes the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
+<li>If the exclamation function <em>does not</em> run, Pulsar will durably store the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumes and acknowledges the message.</li>
 </ul>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-cluster-mode"></a><a href="#run-a-pulsar-function-in-cluster-mode" 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 [...]
-<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and experimentation, but if you want to use Pulsar Functions in a real Pulsar deployment, you'll want to run them in <strong>cluster mode</strong>. In this mode, Pulsar Functions run <em>inside</em> your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface that we've been using thus far.</p>
-<p>This command, for example, would deploy the same exclamation function we ran locally above <em>in our Pulsar cluster</em> (rather than outside it):</p>
+<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and test. However, when you use Pulsar for real deployment, you run it in <strong>cluster mode</strong>. In cluster mode, Pulsar Functions run <em>inside</em> of your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface.</p>
+<p>The following command deploys the same exclamation function you run locally in your Pulsar cluster, rather than outside of it.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -155,18 +154,18 @@ Hello world!
   --output persistent://public/default/exclamation-output \
   --name exclamation
 </code></pre>
-<p>You should see <code>Created successfully</code> in the output. Now, let's see a list of functions running in our cluster:</p>
+<p>You will see <code>Created successfully</code> in the output. Check the list of functions running in your cluster.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> list \
   --tenant public \
   --namespace default
 </code></pre>
-<p>We should see just the <code>exclamation</code> function listed there. We can also check the status of our deployed function using the <code>getstatus</code> command:</p>
+<p>You will see the <code>exclamation</code> function. Check the status of your deployed function using the <code>getstatus</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> getstatus \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"functionStatusList"</span>: [
     {
@@ -176,13 +175,13 @@ Hello world!
   ]
 }
 </code></pre>
-<p>As we can see, (a) the instance is currently running and (b) there is one instance, with an ID of 0, running. We can get other information about the function (topics, tenant, namespace, etc.) using the <code>get</code> command instead of <code>getstatus</code>:</p>
+<p>As you can see, the instance is currently running, and an instance with the ID of <code>0</code> is running. With the <code>get</code> command, you can get other information about the function, for example, topics, tenant, namespace, and so on.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> get \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -196,7 +195,7 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">1</span>
 }
 </code></pre>
-<p>As we can see, the parallelism of the function is 1, meaning that only one instance of the function is running in our cluster. Let's update our function to a parallelism of 3 using the <code>update</code> command:</p>
+<p>As you can see, only one instance of the function is running in your cluster. Update the parallel functions to <code>3</code> using the <code>update</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> update \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -207,7 +206,7 @@ Hello world!
   --name exclamation \
   --parallelism 3
 </code></pre>
-<p>You should see <code>Updated successfully</code> in the output. If you run the <code>get</code> command from above for the function, you can see that the parallelism has increased to 3, meaning that there are now three instances of the function running in our cluster:</p>
+<p>You will see <code>Updated successfully</code> in the output. If you enter the <code>get</code> command, you see that the parallel functions are increased to <code>3</code>, meaning that three instances of the function are running in your cluster.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -221,32 +220,26 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">3</span>
 }
 </code></pre>
-<p>Finally, we can shut down our running function using the <code>delete</code> command:</p>
+<p>Shut down the running function with the <code>delete</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> delete \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
-<h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" 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.5 [...]
-<blockquote>
-<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
-<pre><code class="hljs css language-bash"></code></pre>
-</blockquote>
-<p>$ pip install pulsar-client</p>
-<pre><code class="hljs">
-In <span class="hljs-keyword">the</span> <span class="hljs-keyword">above</span> examples, we ran <span class="hljs-keyword">and</span> managed a pre-written Pulsar Function <span class="hljs-keyword">and</span> saw how <span class="hljs-keyword">it</span> worked. To really <span class="hljs-keyword">get</span> our hands dirty, let's <span class="hljs-built_in">write</span> <span class="hljs-keyword">and</span> our own function <span class="hljs-keyword">from</span> scratch, using <span  [...]
-
-First, create a new Python <span class="hljs-built_in">file</span>:
-
-```bash
-$ touch <span class="hljs-built_in">reverse</span>.py
+<p>When you see <code>Deleted successfully</code> in the output, you've successfully run, updated, and shut down functions running in cluster mode.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-new-function"></a><a href="#write-and-run-a-new-function" 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 [...]
+<p>In order to write and run <a href="functions-api.md#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
+<pre><code class="hljs css language-bash">$ pip install pulsar-client
+</code></pre>
+<p>In the examples above, you run and manage pre-written Pulsar Functions and learn how they work. You can also write your own functions with Python API. In the following example, the function takes a string as input, reverses the string, and publishes the reversed string to the specified topic.</p>
+<p>First, create a new Python file.</p>
+<pre><code class="hljs css language-bash">$ touch reverse.py
 </code></pre>
-<p>In that file, add the following:</p>
+<p>Add the following information in the Python file.</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
-<p>Here, the <code>process</code> method defines the processing logic of the Pulsar Function. It simply uses some Python slice magic to reverse each incoming string. Now, we can deploy the function using <code>create</code>:</p>
+<p>The <code>process</code> method defines the processing logic of Pulsar Functions. It uses Python slice magic to reverse each incoming string. You can deploy the function using the <code>create</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --py reverse.py \
   --classname reverse \
@@ -256,30 +249,74 @@ $ touch <span class="hljs-built_in">reverse</span>.py
   --namespace default \
   --name reverse
 </code></pre>
-<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, we can <strong>trigger</strong> the function using the <a href="/docs/fr/next/pulsar-admin#trigger"><code>trigger</code></a> command. This command will send a message that we specify to the function and also give us the function's output. Here's an example:</p>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, you can <strong>trigger</strong> the function using the <a href="reference-pulsar-admin.md#trigger"><code>trigger</code></a> command. This command sends a message that you specify to the function and returns the function output. The following is an example.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger \
   --name reverse \
   --tenant public \
   --namespace default \
   --trigger-value <span class="hljs-string">"sdrawrof won si tub sdrawkcab saw gnirts sihT"</span>
 </code></pre>
-<p>You should get this output:</p>
+<p>You will get the following output.</p>
 <pre><code class="hljs">This string was backwards but is now forwards
 </code></pre>
-<p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
-<h2><a class="anchor" aria-hidden="true" id="packaging-python-dependencies"></a><a href="#packaging-python-dependencies" 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  [...]
-<p>For python functions requiring dependencies to be deployable in pulsar worker instances in an offline manner, we need to package the artifacts as below.</p>
-<h4><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Following programs are required to be installed on the client machine</p>
-<pre><code class="hljs">pip \\ rquired for getting python dependencies
+<p>You have created a new Pulsar Function, deployed it in your Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a>, and triggered the Function.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-go-function"></a><a href="#write-and-run-a-go-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Go function depends on <code>pulsar-client-go</code>. Make sure that you have built <code>pulsar-client-go</code> before using Go function.</p>
+<p>To write and run a Go function, complete the following steps.</p>
+<ol>
+<li><p>Create a new Go file.</p>
+<p>touch helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Append a byte for messages from the input topic.<br>
+The following is a <code>helloFunc.go</code> example. Each message from the input topic is appended with a <code>110</code> byte, and then delivered to the output topic.</p>
+<p>package main</p>
+<p>import (
+&quot;context&quot;</p>
+<pre><code class="hljs"> &quot;github.com/apache/pulsar/pulsar-function-go/pf&quot;
+</code></pre>
+<p>)</p>
+<p>func HandleResponse(ctx context.Context, in []byte) ([]byte, error) {
+res := append(in, 110)
+return res, nil
+}</p>
+<p>func main() {
+pf.Start(HandleResponse)
+}</p></li>
+</ol>
+<ol>
+<li><p>Compile code.</p>
+<p>go build -o examplepulsar helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Run Go function.</p>
+<p>$ bin/pulsar-admin functions create <br>
+--go examplepulsar <br>
+--inputs <a href="persistent://public/default/backwards">persistent://public/default/backwards</a> <br>
+--output <a href="persistent://public/default/forwards">persistent://public/default/forwards</a> <br>
+--tenant public <br>
+--namespace default <br>
+--name gofunc</p></li>
+</ol>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Start a producer and produce messages to the <code>backwards</code> input topic. Start a consumer and consume messages from the <code>forwards</code> output topic, you will see <code>110</code> is appended to all messages.</p>
+<p>The <code>--classname</code> parameter is not specified when running Go function, because there is no <code>Class</code> concept in Go, which is different from Java and Python.</p>
+<blockquote>
+<p>Note<br>
+When you use the <code>--go</code> command to specify an executable file, make sure you have executable permissions.</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="package-python-dependencies"></a><a href="#package-python-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>When you deploy Python functions in a cluster offline, you need to package the required dependencies in a ZIP file before deployment.</p>
+<h3><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>The following programs are required to be installed on the client machine.</p>
+<pre><code class="hljs">pip \\ required for getting python dependencies
 zip \\ for building zip archives
 </code></pre>
-<h4><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
-<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the python function</p>
+<h3><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
+<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the Python function.</p>
 <pre><code class="hljs">sh==1.12.14
 </code></pre>
-<p>Prepare the pulsar function in folder called <strong>src</strong>.</p>
-<p>Run the following command to gather the python dependencies in the folder caller <strong>deps</strong></p>
+<p>Prepare the Pulsar Function in the <strong>src</strong> folder.</p>
+<p>Run the following command to gather Python dependencies in the <strong>deps</strong> folder.</p>
 <pre><code class="hljs">pip download \
 --only-binary :all: \
 --platform manylinux1_x86_64 \
@@ -287,15 +324,18 @@ zip \\ for building zip archives
 --implementation cp \
 --abi cp27m -r requirements.txt -d deps
 </code></pre>
-<p>Sample ouptut</p>
+<p>Sample output</p>
 <pre><code class="hljs">Collecting sh==1.12.14 (from -r requirements.txt (line 1))
   Using cached https://files.pythonhosted.org/packages/4a/22/17b22ef5b049f12080f5815c41bf94de3c229217609e469001a8f80c1b3d/sh-1.12.14-py2.py3-none-any.whl
   Saved ./deps/sh-1.12.14-py2.py3-none-any.whl
 Successfully downloaded sh
 </code></pre>
-<p><strong>Note</strong> pulsar-client is not needed as a dependency as it already installed in the worker node.</p>
-<h4><a class="anchor" aria-hidden="true" id="packaging"></a><a href="#packaging" 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>Create a destination folder with the desired pacaking name eg : <strong>exclamation</strong>, copy <strong>src</strong> and <strong>deps</strong> folder into it and finally compress the folder into a zip archive.</p>
+<blockquote>
+<p>Note<br>
+<code>pulsar-client</code> is not needed as a dependency as it has already installed in the worker node.</p>
+</blockquote>
+<h4><a class="anchor" aria-hidden="true" id="package"></a><a href="#package" 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>Create a destination folder with the desired package name, for example, <strong>exclamation</strong>. Copy the <strong>src</strong> and <strong>deps</strong> folders into it, and compress the folder into a ZIP archive.</p>
 <p>Sample sequence</p>
 <pre><code class="hljs">cp -R deps exclamation/
 cp -R src exclamation/
@@ -309,12 +349,8 @@ drwxr-xr-x   3 a.ahmed  staff   96 Nov  6 17:51 src
 
 zip -r exclamation.zip exclamation
 </code></pre>
-<p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
-<ul>
-<li><a href="/docs/fr/next/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/fr/next/functions-deploying">Deploying Pulsar Functions</a></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/fr/next/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/fr/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar clus [...]
+<p>After package all the required dependencies into the <strong>exclamation.zip</strong> file, you can deploy functions in a Pulsar worker. The Pulsar worker does not need internet connectivity to download packages, because they are all included in the ZIP file.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/fr/next/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/fr/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar clus [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/fr/next/functions-quickstart/index.html b/content/docs/fr/next/functions-quickstart/index.html
index 8c5556d..b26b5fe 100644
--- a/content/docs/fr/next/functions-quickstart/index.html
+++ b/content/docs/fr/next/functions-quickstart/index.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="fr"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/fr/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/fr/n [...]
-"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="fr"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/fr/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pul [...]
+<!DOCTYPE html><html lang="fr"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/fr/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/fr/next/ [...]
+"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="fr"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/fr/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar  [...]
 "/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.incubator.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.incubator.apache.org/blog/atom.x [...]
               (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),
@@ -76,23 +76,23 @@
                 };
               }
             });
-        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial will walk you through running a <a href="/docs/fr/next/reference-terminology#standalone">standalone</a> Puls [...]
+        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial walks you through running a <a href="/docs/fr/next/reference-terminology#standalone">standalone</a> Pulsar < [...]
 <blockquote>
-<p>In local run mode, your Pulsar Function will communicate with your Pulsar cluster but will run outside of the cluster.</p>
+<p>In local run mode, Pulsar Functions communicate with Pulsar cluster, but run outside of the cluster.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" 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>In order to follow along with this tutorial, you'll need to have <a href="https://maven.apache.org/download.cgi">Maven</a> installed on your machine.</p>
+<p>Install <a href="https://maven.apache.org/download.cgi">Maven</a> on your machine.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-standalone-pulsar-cluster"></a><a href="#run-a-standalone-pulsar-cluster" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<p>In order to run our Pulsar Functions, we'll need to run a Pulsar cluster locally first. The easiest way to do that is to run Pulsar in <a href="/docs/fr/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster:</p>
+<p>In order to run Pulsar Functions, you need to run a Pulsar cluster locally first. The easiest way is to run Pulsar in <a href="/docs/fr/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster.</p>
 <pre><code class="hljs css language-bash">$ wget https://archive.apache.org/dist/pulsar/pulsar-2.3.2/apache-pulsar-2.3.2-bin.tar.gz
 $ tar xvfz apache-pulsar-2.3.2-bin.tar.gz
 $ <span class="hljs-built_in">cd</span> apache-pulsar-2.3.2
 $ bin/pulsar standalone \
   --advertised-address 127.0.0.1
 </code></pre>
-<p>When running Pulsar in standalone mode, the <code>public</code> tenant and <code>default</code> namespace will be created automatically for you. That tenant and namespace will be used throughout this tutorial.</p>
+<p>When running Pulsar in standalone mode, the <code>public</code> tenant and the <code>default</code> namespace are created automatically. The tenant and namespace are used throughout this tutorial.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-local-run-mode"></a><a href="#run-a-pulsar-function-in-local-run-mode" 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  [...]
-<p>Let's start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes that new string to another Pulsar topic. Here's the code for the function:</p>
+<p>You can start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes the new string to another Pulsar topic. The following is the code for the function.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.apache.pulsar.functions.api.examples;
 
 <span class="hljs-keyword">import</span> java.util.function.Function;
@@ -104,7 +104,7 @@ $ bin/pulsar standalone \
     }
 }
 </code></pre>
-<p>A JAR file containing this and several other functions (written in Java) is included with the binary distribution you downloaded above (in the <code>examples</code> folder). To run the function in local mode, i.e. on our laptop but outside our Pulsar cluster:</p>
+<p>A JAR file containing this function and several other functions (written in Java) is included with the binary distribution you have downloaded (in the <code>examples</code> folder). Run the function in local mode on your laptop but outside your Pulsar cluster with the following commands.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -113,13 +113,13 @@ $ bin/pulsar standalone \
   --name exclamation
 </code></pre>
 <blockquote>
-<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics-allowed"></a><a href="#multiple-input-topics-allowed" 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  [...]
-<p>In the example above, a single topic was specified using the <code>--inputs</code> flag. You can also specify multiple input topics as a comma-separated list using the same flag. Here's an example:</p>
+<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics"></a><a href="#multiple-input-topics" 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 [...]
+<p>In the example above, a single topic is specified using the <code>--inputs</code> flag. You can also specify multiple input topics with a comma-separated list using the same flag.</p>
 <pre><code class="hljs css language-bash"></code></pre>
 </blockquote>
 <p>--inputs topic1,topic2</p>
 <pre><code class="hljs">
-We can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic:
+You can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic.
 
 <span class="hljs-code">```bash
 $ bin/pulsar-client consume persistent://public/default/exclamation-output \
@@ -127,27 +127,26 @@ $ bin/pulsar-client consume persistent://public/default/exclamation-output \
   --num-messages 0
 </span></code></pre>
 <blockquote>
-<p>Setting the <code>--num-messages</code> flag to 0 means that the consumer will listen on the topic indefinitely (rather than only accepting a certain number of messages).</p>
+<p>Setting the <code>--num-messages</code> flag to <code>0</code> means that consumers listen on the topic indefinitely, rather than only accepting a certain number of messages.</p>
 </blockquote>
-<p>With a listener up and running, we can open up another shell and produce a message on the input topic that we specified:</p>
+<p>With a listener up and running, you can open up another shell and produce a message on the input topic that you specify.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-client produce persistent://public/default/exclamation-input \
   --num-produce 1 \
   --messages <span class="hljs-string">"Hello world"</span>
 </code></pre>
-<p>In the output, you should see the following:</p>
+<p>When the message has been successfully processed by the exclamation function, you will see the following output. To shut down the function, press <strong>Ctrl+C</strong>.</p>
 <pre><code class="hljs">----- got message -----
 Hello world!
 </code></pre>
-<p>Success! As you can see, the message has been successfully processed by the exclamation function. To shut down the function, simply hit <strong>Ctrl+C</strong>.</p>
-<p>Here's what happened:</p>
+<h3><a class="anchor" aria-hidden="true" id="process-explanation"></a><a href="#process-explanation" 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.2 [...]
 <ul>
-<li>The <code>Hello world</code> message that we published to the input topic (<code>persistent://public/default/exclamation-input</code>) was passed to the exclamation function that we ran on our machine</li>
-<li>The exclamation function processed the message (providing a result of <code>Hello world!</code>) and published the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
-<li>If our exclamation function <em>hadn't</em> been running, Pulsar would have durably stored the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumed and acknowledged the message</li>
+<li>The <code>Hello world</code> message you publish to the input topic (<code>persistent://public/default/exclamation-input</code>) is passed to the exclamation function.</li>
+<li>The exclamation function processes the message (providing a result of <code>Hello world!</code>) and publishes the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
+<li>If the exclamation function <em>does not</em> run, Pulsar will durably store the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumes and acknowledges the message.</li>
 </ul>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-cluster-mode"></a><a href="#run-a-pulsar-function-in-cluster-mode" 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 [...]
-<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and experimentation, but if you want to use Pulsar Functions in a real Pulsar deployment, you'll want to run them in <strong>cluster mode</strong>. In this mode, Pulsar Functions run <em>inside</em> your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface that we've been using thus far.</p>
-<p>This command, for example, would deploy the same exclamation function we ran locally above <em>in our Pulsar cluster</em> (rather than outside it):</p>
+<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and test. However, when you use Pulsar for real deployment, you run it in <strong>cluster mode</strong>. In cluster mode, Pulsar Functions run <em>inside</em> of your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface.</p>
+<p>The following command deploys the same exclamation function you run locally in your Pulsar cluster, rather than outside of it.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -155,18 +154,18 @@ Hello world!
   --output persistent://public/default/exclamation-output \
   --name exclamation
 </code></pre>
-<p>You should see <code>Created successfully</code> in the output. Now, let's see a list of functions running in our cluster:</p>
+<p>You will see <code>Created successfully</code> in the output. Check the list of functions running in your cluster.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> list \
   --tenant public \
   --namespace default
 </code></pre>
-<p>We should see just the <code>exclamation</code> function listed there. We can also check the status of our deployed function using the <code>getstatus</code> command:</p>
+<p>You will see the <code>exclamation</code> function. Check the status of your deployed function using the <code>getstatus</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> getstatus \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"functionStatusList"</span>: [
     {
@@ -176,13 +175,13 @@ Hello world!
   ]
 }
 </code></pre>
-<p>As we can see, (a) the instance is currently running and (b) there is one instance, with an ID of 0, running. We can get other information about the function (topics, tenant, namespace, etc.) using the <code>get</code> command instead of <code>getstatus</code>:</p>
+<p>As you can see, the instance is currently running, and an instance with the ID of <code>0</code> is running. With the <code>get</code> command, you can get other information about the function, for example, topics, tenant, namespace, and so on.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> get \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -196,7 +195,7 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">1</span>
 }
 </code></pre>
-<p>As we can see, the parallelism of the function is 1, meaning that only one instance of the function is running in our cluster. Let's update our function to a parallelism of 3 using the <code>update</code> command:</p>
+<p>As you can see, only one instance of the function is running in your cluster. Update the parallel functions to <code>3</code> using the <code>update</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> update \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -207,7 +206,7 @@ Hello world!
   --name exclamation \
   --parallelism 3
 </code></pre>
-<p>You should see <code>Updated successfully</code> in the output. If you run the <code>get</code> command from above for the function, you can see that the parallelism has increased to 3, meaning that there are now three instances of the function running in our cluster:</p>
+<p>You will see <code>Updated successfully</code> in the output. If you enter the <code>get</code> command, you see that the parallel functions are increased to <code>3</code>, meaning that three instances of the function are running in your cluster.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -221,32 +220,26 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">3</span>
 }
 </code></pre>
-<p>Finally, we can shut down our running function using the <code>delete</code> command:</p>
+<p>Shut down the running function with the <code>delete</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> delete \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
-<h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" 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.5 [...]
-<blockquote>
-<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
-<pre><code class="hljs css language-bash"></code></pre>
-</blockquote>
-<p>$ pip install pulsar-client</p>
-<pre><code class="hljs">
-In <span class="hljs-keyword">the</span> <span class="hljs-keyword">above</span> examples, we ran <span class="hljs-keyword">and</span> managed a pre-written Pulsar Function <span class="hljs-keyword">and</span> saw how <span class="hljs-keyword">it</span> worked. To really <span class="hljs-keyword">get</span> our hands dirty, let's <span class="hljs-built_in">write</span> <span class="hljs-keyword">and</span> our own function <span class="hljs-keyword">from</span> scratch, using <span  [...]
-
-First, create a new Python <span class="hljs-built_in">file</span>:
-
-```bash
-$ touch <span class="hljs-built_in">reverse</span>.py
+<p>When you see <code>Deleted successfully</code> in the output, you've successfully run, updated, and shut down functions running in cluster mode.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-new-function"></a><a href="#write-and-run-a-new-function" 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 [...]
+<p>In order to write and run <a href="functions-api.md#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
+<pre><code class="hljs css language-bash">$ pip install pulsar-client
+</code></pre>
+<p>In the examples above, you run and manage pre-written Pulsar Functions and learn how they work. You can also write your own functions with Python API. In the following example, the function takes a string as input, reverses the string, and publishes the reversed string to the specified topic.</p>
+<p>First, create a new Python file.</p>
+<pre><code class="hljs css language-bash">$ touch reverse.py
 </code></pre>
-<p>In that file, add the following:</p>
+<p>Add the following information in the Python file.</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
-<p>Here, the <code>process</code> method defines the processing logic of the Pulsar Function. It simply uses some Python slice magic to reverse each incoming string. Now, we can deploy the function using <code>create</code>:</p>
+<p>The <code>process</code> method defines the processing logic of Pulsar Functions. It uses Python slice magic to reverse each incoming string. You can deploy the function using the <code>create</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --py reverse.py \
   --classname reverse \
@@ -256,30 +249,74 @@ $ touch <span class="hljs-built_in">reverse</span>.py
   --namespace default \
   --name reverse
 </code></pre>
-<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, we can <strong>trigger</strong> the function using the <a href="/docs/fr/next/pulsar-admin#trigger"><code>trigger</code></a> command. This command will send a message that we specify to the function and also give us the function's output. Here's an example:</p>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, you can <strong>trigger</strong> the function using the <a href="reference-pulsar-admin.md#trigger"><code>trigger</code></a> command. This command sends a message that you specify to the function and returns the function output. The following is an example.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger \
   --name reverse \
   --tenant public \
   --namespace default \
   --trigger-value <span class="hljs-string">"sdrawrof won si tub sdrawkcab saw gnirts sihT"</span>
 </code></pre>
-<p>You should get this output:</p>
+<p>You will get the following output.</p>
 <pre><code class="hljs">This string was backwards but is now forwards
 </code></pre>
-<p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
-<h2><a class="anchor" aria-hidden="true" id="packaging-python-dependencies"></a><a href="#packaging-python-dependencies" 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  [...]
-<p>For python functions requiring dependencies to be deployable in pulsar worker instances in an offline manner, we need to package the artifacts as below.</p>
-<h4><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Following programs are required to be installed on the client machine</p>
-<pre><code class="hljs">pip \\ rquired for getting python dependencies
+<p>You have created a new Pulsar Function, deployed it in your Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a>, and triggered the Function.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-go-function"></a><a href="#write-and-run-a-go-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Go function depends on <code>pulsar-client-go</code>. Make sure that you have built <code>pulsar-client-go</code> before using Go function.</p>
+<p>To write and run a Go function, complete the following steps.</p>
+<ol>
+<li><p>Create a new Go file.</p>
+<p>touch helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Append a byte for messages from the input topic.<br>
+The following is a <code>helloFunc.go</code> example. Each message from the input topic is appended with a <code>110</code> byte, and then delivered to the output topic.</p>
+<p>package main</p>
+<p>import (
+&quot;context&quot;</p>
+<pre><code class="hljs"> &quot;github.com/apache/pulsar/pulsar-function-go/pf&quot;
+</code></pre>
+<p>)</p>
+<p>func HandleResponse(ctx context.Context, in []byte) ([]byte, error) {
+res := append(in, 110)
+return res, nil
+}</p>
+<p>func main() {
+pf.Start(HandleResponse)
+}</p></li>
+</ol>
+<ol>
+<li><p>Compile code.</p>
+<p>go build -o examplepulsar helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Run Go function.</p>
+<p>$ bin/pulsar-admin functions create <br>
+--go examplepulsar <br>
+--inputs <a href="persistent://public/default/backwards">persistent://public/default/backwards</a> <br>
+--output <a href="persistent://public/default/forwards">persistent://public/default/forwards</a> <br>
+--tenant public <br>
+--namespace default <br>
+--name gofunc</p></li>
+</ol>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Start a producer and produce messages to the <code>backwards</code> input topic. Start a consumer and consume messages from the <code>forwards</code> output topic, you will see <code>110</code> is appended to all messages.</p>
+<p>The <code>--classname</code> parameter is not specified when running Go function, because there is no <code>Class</code> concept in Go, which is different from Java and Python.</p>
+<blockquote>
+<p>Note<br>
+When you use the <code>--go</code> command to specify an executable file, make sure you have executable permissions.</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="package-python-dependencies"></a><a href="#package-python-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>When you deploy Python functions in a cluster offline, you need to package the required dependencies in a ZIP file before deployment.</p>
+<h3><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>The following programs are required to be installed on the client machine.</p>
+<pre><code class="hljs">pip \\ required for getting python dependencies
 zip \\ for building zip archives
 </code></pre>
-<h4><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
-<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the python function</p>
+<h3><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
+<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the Python function.</p>
 <pre><code class="hljs">sh==1.12.14
 </code></pre>
-<p>Prepare the pulsar function in folder called <strong>src</strong>.</p>
-<p>Run the following command to gather the python dependencies in the folder caller <strong>deps</strong></p>
+<p>Prepare the Pulsar Function in the <strong>src</strong> folder.</p>
+<p>Run the following command to gather Python dependencies in the <strong>deps</strong> folder.</p>
 <pre><code class="hljs">pip download \
 --only-binary :all: \
 --platform manylinux1_x86_64 \
@@ -287,15 +324,18 @@ zip \\ for building zip archives
 --implementation cp \
 --abi cp27m -r requirements.txt -d deps
 </code></pre>
-<p>Sample ouptut</p>
+<p>Sample output</p>
 <pre><code class="hljs">Collecting sh==1.12.14 (from -r requirements.txt (line 1))
   Using cached https://files.pythonhosted.org/packages/4a/22/17b22ef5b049f12080f5815c41bf94de3c229217609e469001a8f80c1b3d/sh-1.12.14-py2.py3-none-any.whl
   Saved ./deps/sh-1.12.14-py2.py3-none-any.whl
 Successfully downloaded sh
 </code></pre>
-<p><strong>Note</strong> pulsar-client is not needed as a dependency as it already installed in the worker node.</p>
-<h4><a class="anchor" aria-hidden="true" id="packaging"></a><a href="#packaging" 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>Create a destination folder with the desired pacaking name eg : <strong>exclamation</strong>, copy <strong>src</strong> and <strong>deps</strong> folder into it and finally compress the folder into a zip archive.</p>
+<blockquote>
+<p>Note<br>
+<code>pulsar-client</code> is not needed as a dependency as it has already installed in the worker node.</p>
+</blockquote>
+<h4><a class="anchor" aria-hidden="true" id="package"></a><a href="#package" 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>Create a destination folder with the desired package name, for example, <strong>exclamation</strong>. Copy the <strong>src</strong> and <strong>deps</strong> folders into it, and compress the folder into a ZIP archive.</p>
 <p>Sample sequence</p>
 <pre><code class="hljs">cp -R deps exclamation/
 cp -R src exclamation/
@@ -309,12 +349,8 @@ drwxr-xr-x   3 a.ahmed  staff   96 Nov  6 17:51 src
 
 zip -r exclamation.zip exclamation
 </code></pre>
-<p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
-<ul>
-<li><a href="/docs/fr/next/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/fr/next/functions-deploying">Deploying Pulsar Functions</a></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/fr/next/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/fr/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar clus [...]
+<p>After package all the required dependencies into the <strong>exclamation.zip</strong> file, you can deploy functions in a Pulsar worker. The Pulsar worker does not need internet connectivity to download packages, because they are all included in the ZIP file.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/fr/next/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/fr/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar clus [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/ja/next/admin-api-overview.html b/content/docs/ja/next/admin-api-overview.html
index d03dbd4..6f1ba71 100644
--- a/content/docs/ja/next/admin-api-overview.html
+++ b/content/docs/ja/next/admin-api-overview.html
@@ -137,6 +137,24 @@ config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
 
 PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
 </code></pre>
+<p>If you have multiple brokers to use, you can use multi-host like Pulsar service. For example,</p>
+<pre><code class="hljs css language-java">URL url = <span class="hljs-keyword">new</span> URL(<span class="hljs-string">"http://localhost:8080,localhost:8081,localhost:8082"</span>);
+<span class="hljs-comment">// Pass auth-plugin class fully-qualified name if Pulsar-security is enabled.</span>
+String authPluginClassName = <span class="hljs-string">"com.org.MyAuthPluginClass"</span>; 
+<span class="hljs-comment">// Pass auth-param if auth-plugin class requires it</span>
+String authParams = <span class="hljs-string">"param1=value1"</span>;
+<span class="hljs-keyword">boolean</span> useTls = <span class="hljs-keyword">false</span>;
+<span class="hljs-keyword">boolean</span> tlsAllowInsecureConnection = <span class="hljs-keyword">false</span>;
+String tlsTrustCertsFilePath = <span class="hljs-keyword">null</span>;
+
+ClientConfiguration config = <span class="hljs-keyword">new</span> ClientConfiguration();
+config.setAuthentication(authPluginClassName, authParams);
+config.setUseTls(useTls);
+config.setTlsAllowInsecureConnection(tlsAllowInsecureConnection);
+config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
+
+PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
+</code></pre>
 </span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/ja/next/client-libraries-websocket"><span class="arrow-prev">← </span><span class="function-name-prevnext">WebSocket</span></a><a class="docs-next button" href="/docs/ja/next/admin-api-clusters"><span>Clusters</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#admin-setup">Admin setup</a><ul class="toc-headings"><li><a hr [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
diff --git a/content/docs/ja/next/admin-api-overview/index.html b/content/docs/ja/next/admin-api-overview/index.html
index d03dbd4..6f1ba71 100644
--- a/content/docs/ja/next/admin-api-overview/index.html
+++ b/content/docs/ja/next/admin-api-overview/index.html
@@ -137,6 +137,24 @@ config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
 
 PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
 </code></pre>
+<p>If you have multiple brokers to use, you can use multi-host like Pulsar service. For example,</p>
+<pre><code class="hljs css language-java">URL url = <span class="hljs-keyword">new</span> URL(<span class="hljs-string">"http://localhost:8080,localhost:8081,localhost:8082"</span>);
+<span class="hljs-comment">// Pass auth-plugin class fully-qualified name if Pulsar-security is enabled.</span>
+String authPluginClassName = <span class="hljs-string">"com.org.MyAuthPluginClass"</span>; 
+<span class="hljs-comment">// Pass auth-param if auth-plugin class requires it</span>
+String authParams = <span class="hljs-string">"param1=value1"</span>;
+<span class="hljs-keyword">boolean</span> useTls = <span class="hljs-keyword">false</span>;
+<span class="hljs-keyword">boolean</span> tlsAllowInsecureConnection = <span class="hljs-keyword">false</span>;
+String tlsTrustCertsFilePath = <span class="hljs-keyword">null</span>;
+
+ClientConfiguration config = <span class="hljs-keyword">new</span> ClientConfiguration();
+config.setAuthentication(authPluginClassName, authParams);
+config.setUseTls(useTls);
+config.setTlsAllowInsecureConnection(tlsAllowInsecureConnection);
+config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
+
+PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
+</code></pre>
 </span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/ja/next/client-libraries-websocket"><span class="arrow-prev">← </span><span class="function-name-prevnext">WebSocket</span></a><a class="docs-next button" href="/docs/ja/next/admin-api-clusters"><span>Clusters</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#admin-setup">Admin setup</a><ul class="toc-headings"><li><a hr [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
diff --git a/content/docs/ja/next/client-libraries-java.html b/content/docs/ja/next/client-libraries-java.html
index 0bf4916..bee5b6e 100644
--- a/content/docs/ja/next/client-libraries-java.html
+++ b/content/docs/ja/next/client-libraries-java.html
@@ -115,6 +115,9 @@ dependencies {
 <p>Pulsar protocol URLs are assigned to specific clusters, use the <code>pulsar</code> scheme and have a default port of 6650. Here's an example for <code>localhost</code>:</p>
 <pre><code class="hljs css language-http">pulsar://localhost:6650
 </code></pre>
+<p>If you have more than one broker, the URL may look like this:</p>
+<pre><code class="hljs css language-http">pulsar://localhost:6550,localhost:6651,localhost:6652
+</code></pre>
 <p>A URL for a production Pulsar cluster may look something like this:</p>
 <pre><code class="hljs css language-http">pulsar://pulsar.us-west.example.com:6650
 </code></pre>
@@ -128,6 +131,11 @@ dependencies {
         .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650"</span>)
         .build();
 </code></pre>
+<p>If you have multiple brokers, you can initiate a PulsarClient like this:</p>
+<pre><code class="hljs css language-java">PulsarClient client = PulsarClient.builder()
+        .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650,localhost:6651,localhost:6652"</span>)
+        .build();
+</code></pre>
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="default-broker-urls-for-standalone-clusters"></a><a href="#default-broker-urls-for-standalone-clusters" 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-1v1h [...]
 <p>If you're running a cluster in <a href="/docs/ja/next/standalone">standalone mode</a>, the broker will be available at the <code>pulsar://localhost:6650</code> URL by default.</p>
diff --git a/content/docs/ja/next/client-libraries-java/index.html b/content/docs/ja/next/client-libraries-java/index.html
index 0bf4916..bee5b6e 100644
--- a/content/docs/ja/next/client-libraries-java/index.html
+++ b/content/docs/ja/next/client-libraries-java/index.html
@@ -115,6 +115,9 @@ dependencies {
 <p>Pulsar protocol URLs are assigned to specific clusters, use the <code>pulsar</code> scheme and have a default port of 6650. Here's an example for <code>localhost</code>:</p>
 <pre><code class="hljs css language-http">pulsar://localhost:6650
 </code></pre>
+<p>If you have more than one broker, the URL may look like this:</p>
+<pre><code class="hljs css language-http">pulsar://localhost:6550,localhost:6651,localhost:6652
+</code></pre>
 <p>A URL for a production Pulsar cluster may look something like this:</p>
 <pre><code class="hljs css language-http">pulsar://pulsar.us-west.example.com:6650
 </code></pre>
@@ -128,6 +131,11 @@ dependencies {
         .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650"</span>)
         .build();
 </code></pre>
+<p>If you have multiple brokers, you can initiate a PulsarClient like this:</p>
+<pre><code class="hljs css language-java">PulsarClient client = PulsarClient.builder()
+        .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650,localhost:6651,localhost:6652"</span>)
+        .build();
+</code></pre>
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="default-broker-urls-for-standalone-clusters"></a><a href="#default-broker-urls-for-standalone-clusters" 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-1v1h [...]
 <p>If you're running a cluster in <a href="/docs/ja/next/standalone">standalone mode</a>, the broker will be available at the <code>pulsar://localhost:6650</code> URL by default.</p>
diff --git a/content/docs/ja/next/cookbooks-compaction.html b/content/docs/ja/next/cookbooks-compaction.html
index 5222e39..1940116 100644
--- a/content/docs/ja/next/cookbooks-compaction.html
+++ b/content/docs/ja/next/cookbooks-compaction.html
@@ -87,7 +87,7 @@
 <p>Compaction only works on messages that have keys (as in the stock ticker example the stock symbol serves as the key for each message). Keys can thus be thought of as the axis along which compaction is applied. Messages that don't have keys are simply ignored by compaction.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="when-should-i-use-compacted-topics-when"></a><a href="#when-should-i-use-compacted-topics-when" 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  [...]
-<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scneario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
+<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scenario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
 <ul>
 <li>They can read from the &quot;original,&quot; non-compacted topic in case they need access to &quot;historical&quot; values, i.e. the entirety of the topic's messages.</li>
 <li>They can read from the compacted topic if they only want to see the most up-to-date messages.</li>
diff --git a/content/docs/ja/next/cookbooks-compaction/index.html b/content/docs/ja/next/cookbooks-compaction/index.html
index 5222e39..1940116 100644
--- a/content/docs/ja/next/cookbooks-compaction/index.html
+++ b/content/docs/ja/next/cookbooks-compaction/index.html
@@ -87,7 +87,7 @@
 <p>Compaction only works on messages that have keys (as in the stock ticker example the stock symbol serves as the key for each message). Keys can thus be thought of as the axis along which compaction is applied. Messages that don't have keys are simply ignored by compaction.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="when-should-i-use-compacted-topics-when"></a><a href="#when-should-i-use-compacted-topics-when" 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  [...]
-<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scneario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
+<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scenario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
 <ul>
 <li>They can read from the &quot;original,&quot; non-compacted topic in case they need access to &quot;historical&quot; values, i.e. the entirety of the topic's messages.</li>
 <li>They can read from the compacted topic if they only want to see the most up-to-date messages.</li>
diff --git a/content/docs/ja/next/deploy-bare-metal.html b/content/docs/ja/next/deploy-bare-metal.html
index bb4e0ed..54c80cf 100644
--- a/content/docs/ja/next/deploy-bare-metal.html
+++ b/content/docs/ja/next/deploy-bare-metal.html
@@ -111,6 +111,7 @@
 </ul>
 <blockquote>
 <p>However if you don't have enough machines, or are trying out Pulsar in cluster mode (and expand the cluster later), you can even deploy Pulsar in one node, where it will run zookeeper, bookie and broker in same machine.</p>
+<p>If you don't have a DNS server, you can use multi-host in service URL instead.</p>
 </blockquote>
 <p>Each machine in your cluster will need to have <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 8</a> or higher installed.</p>
 <p>Here's a diagram showing the basic setup:</p>
diff --git a/content/docs/ja/next/deploy-bare-metal/index.html b/content/docs/ja/next/deploy-bare-metal/index.html
index bb4e0ed..54c80cf 100644
--- a/content/docs/ja/next/deploy-bare-metal/index.html
+++ b/content/docs/ja/next/deploy-bare-metal/index.html
@@ -111,6 +111,7 @@
 </ul>
 <blockquote>
 <p>However if you don't have enough machines, or are trying out Pulsar in cluster mode (and expand the cluster later), you can even deploy Pulsar in one node, where it will run zookeeper, bookie and broker in same machine.</p>
+<p>If you don't have a DNS server, you can use multi-host in service URL instead.</p>
 </blockquote>
 <p>Each machine in your cluster will need to have <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 8</a> or higher installed.</p>
 <p>Here's a diagram showing the basic setup:</p>
diff --git a/content/docs/ja/next/develop-cpp.html b/content/docs/ja/next/develop-cpp.html
index 7bbfa5a..e277232 100644
--- a/content/docs/ja/next/develop-cpp.html
+++ b/content/docs/ja/next/develop-cpp.html
@@ -96,7 +96,7 @@
 <h3><a class="anchor" aria-hidden="true" id="linux"></a><a href="#linux" 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.09 [...]
 <p>First, install all of the necessary dependencies:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> apt-get install cmake libssl-dev libcurl4-openssl-dev liblog4cxx-dev \</span>
-  libprotobuf-dev libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
+  libprotobuf-dev protobuf-compiler libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
 </code></pre>
 <p>Then compile and install <a href="https://github.com/google/googletest">Google Test</a>:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> libgtest-dev version is 1.18.0 or above</span>
diff --git a/content/docs/ja/next/develop-cpp/index.html b/content/docs/ja/next/develop-cpp/index.html
index 7bbfa5a..e277232 100644
--- a/content/docs/ja/next/develop-cpp/index.html
+++ b/content/docs/ja/next/develop-cpp/index.html
@@ -96,7 +96,7 @@
 <h3><a class="anchor" aria-hidden="true" id="linux"></a><a href="#linux" 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.09 [...]
 <p>First, install all of the necessary dependencies:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> apt-get install cmake libssl-dev libcurl4-openssl-dev liblog4cxx-dev \</span>
-  libprotobuf-dev libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
+  libprotobuf-dev protobuf-compiler libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
 </code></pre>
 <p>Then compile and install <a href="https://github.com/google/googletest">Google Test</a>:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> libgtest-dev version is 1.18.0 or above</span>
diff --git a/content/docs/ja/next/functions-quickstart.html b/content/docs/ja/next/functions-quickstart.html
index 5007b79..d0b7368 100644
--- a/content/docs/ja/next/functions-quickstart.html
+++ b/content/docs/ja/next/functions-quickstart.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/ja/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/ja/n [...]
-"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="ja"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/ja/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pul [...]
+<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/ja/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/ja/next/ [...]
+"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="ja"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/ja/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar  [...]
 "/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.incubator.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.incubator.apache.org/blog/atom.x [...]
               (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),
@@ -76,23 +76,23 @@
                 };
               }
             });
-        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial will walk you through running a <a href="/docs/ja/next/reference-terminology#standalone">standalone</a> Puls [...]
+        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial walks you through running a <a href="/docs/ja/next/reference-terminology#standalone">standalone</a> Pulsar < [...]
 <blockquote>
-<p>In local run mode, your Pulsar Function will communicate with your Pulsar cluster but will run outside of the cluster.</p>
+<p>In local run mode, Pulsar Functions communicate with Pulsar cluster, but run outside of the cluster.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" 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>In order to follow along with this tutorial, you'll need to have <a href="https://maven.apache.org/download.cgi">Maven</a> installed on your machine.</p>
+<p>Install <a href="https://maven.apache.org/download.cgi">Maven</a> on your machine.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-standalone-pulsar-cluster"></a><a href="#run-a-standalone-pulsar-cluster" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<p>In order to run our Pulsar Functions, we'll need to run a Pulsar cluster locally first. The easiest way to do that is to run Pulsar in <a href="/docs/ja/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster:</p>
+<p>In order to run Pulsar Functions, you need to run a Pulsar cluster locally first. The easiest way is to run Pulsar in <a href="/docs/ja/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster.</p>
 <pre><code class="hljs css language-bash">$ wget https://archive.apache.org/dist/pulsar/pulsar-2.3.2/apache-pulsar-2.3.2-bin.tar.gz
 $ tar xvfz apache-pulsar-2.3.2-bin.tar.gz
 $ <span class="hljs-built_in">cd</span> apache-pulsar-2.3.2
 $ bin/pulsar standalone \
   --advertised-address 127.0.0.1
 </code></pre>
-<p>When running Pulsar in standalone mode, the <code>public</code> tenant and <code>default</code> namespace will be created automatically for you. That tenant and namespace will be used throughout this tutorial.</p>
+<p>When running Pulsar in standalone mode, the <code>public</code> tenant and the <code>default</code> namespace are created automatically. The tenant and namespace are used throughout this tutorial.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-local-run-mode"></a><a href="#run-a-pulsar-function-in-local-run-mode" 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  [...]
-<p>Let's start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes that new string to another Pulsar topic. Here's the code for the function:</p>
+<p>You can start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes the new string to another Pulsar topic. The following is the code for the function.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.apache.pulsar.functions.api.examples;
 
 <span class="hljs-keyword">import</span> java.util.function.Function;
@@ -104,7 +104,7 @@ $ bin/pulsar standalone \
     }
 }
 </code></pre>
-<p>A JAR file containing this and several other functions (written in Java) is included with the binary distribution you downloaded above (in the <code>examples</code> folder). To run the function in local mode, i.e. on our laptop but outside our Pulsar cluster:</p>
+<p>A JAR file containing this function and several other functions (written in Java) is included with the binary distribution you have downloaded (in the <code>examples</code> folder). Run the function in local mode on your laptop but outside your Pulsar cluster with the following commands.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -113,13 +113,13 @@ $ bin/pulsar standalone \
   --name exclamation
 </code></pre>
 <blockquote>
-<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics-allowed"></a><a href="#multiple-input-topics-allowed" 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  [...]
-<p>In the example above, a single topic was specified using the <code>--inputs</code> flag. You can also specify multiple input topics as a comma-separated list using the same flag. Here's an example:</p>
+<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics"></a><a href="#multiple-input-topics" 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 [...]
+<p>In the example above, a single topic is specified using the <code>--inputs</code> flag. You can also specify multiple input topics with a comma-separated list using the same flag.</p>
 <pre><code class="hljs css language-bash"></code></pre>
 </blockquote>
 <p>--inputs topic1,topic2</p>
 <pre><code class="hljs">
-We can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic:
+You can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic.
 
 <span class="hljs-code">```bash
 $ bin/pulsar-client consume persistent://public/default/exclamation-output \
@@ -127,27 +127,26 @@ $ bin/pulsar-client consume persistent://public/default/exclamation-output \
   --num-messages 0
 </span></code></pre>
 <blockquote>
-<p>Setting the <code>--num-messages</code> flag to 0 means that the consumer will listen on the topic indefinitely (rather than only accepting a certain number of messages).</p>
+<p>Setting the <code>--num-messages</code> flag to <code>0</code> means that consumers listen on the topic indefinitely, rather than only accepting a certain number of messages.</p>
 </blockquote>
-<p>With a listener up and running, we can open up another shell and produce a message on the input topic that we specified:</p>
+<p>With a listener up and running, you can open up another shell and produce a message on the input topic that you specify.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-client produce persistent://public/default/exclamation-input \
   --num-produce 1 \
   --messages <span class="hljs-string">"Hello world"</span>
 </code></pre>
-<p>In the output, you should see the following:</p>
+<p>When the message has been successfully processed by the exclamation function, you will see the following output. To shut down the function, press <strong>Ctrl+C</strong>.</p>
 <pre><code class="hljs">----- got message -----
 Hello world!
 </code></pre>
-<p>Success! As you can see, the message has been successfully processed by the exclamation function. To shut down the function, simply hit <strong>Ctrl+C</strong>.</p>
-<p>Here's what happened:</p>
+<h3><a class="anchor" aria-hidden="true" id="process-explanation"></a><a href="#process-explanation" 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.2 [...]
 <ul>
-<li>The <code>Hello world</code> message that we published to the input topic (<code>persistent://public/default/exclamation-input</code>) was passed to the exclamation function that we ran on our machine</li>
-<li>The exclamation function processed the message (providing a result of <code>Hello world!</code>) and published the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
-<li>If our exclamation function <em>hadn't</em> been running, Pulsar would have durably stored the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumed and acknowledged the message</li>
+<li>The <code>Hello world</code> message you publish to the input topic (<code>persistent://public/default/exclamation-input</code>) is passed to the exclamation function.</li>
+<li>The exclamation function processes the message (providing a result of <code>Hello world!</code>) and publishes the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
+<li>If the exclamation function <em>does not</em> run, Pulsar will durably store the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumes and acknowledges the message.</li>
 </ul>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-cluster-mode"></a><a href="#run-a-pulsar-function-in-cluster-mode" 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 [...]
-<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and experimentation, but if you want to use Pulsar Functions in a real Pulsar deployment, you'll want to run them in <strong>cluster mode</strong>. In this mode, Pulsar Functions run <em>inside</em> your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface that we've been using thus far.</p>
-<p>This command, for example, would deploy the same exclamation function we ran locally above <em>in our Pulsar cluster</em> (rather than outside it):</p>
+<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and test. However, when you use Pulsar for real deployment, you run it in <strong>cluster mode</strong>. In cluster mode, Pulsar Functions run <em>inside</em> of your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface.</p>
+<p>The following command deploys the same exclamation function you run locally in your Pulsar cluster, rather than outside of it.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -155,18 +154,18 @@ Hello world!
   --output persistent://public/default/exclamation-output \
   --name exclamation
 </code></pre>
-<p>You should see <code>Created successfully</code> in the output. Now, let's see a list of functions running in our cluster:</p>
+<p>You will see <code>Created successfully</code> in the output. Check the list of functions running in your cluster.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> list \
   --tenant public \
   --namespace default
 </code></pre>
-<p>We should see just the <code>exclamation</code> function listed there. We can also check the status of our deployed function using the <code>getstatus</code> command:</p>
+<p>You will see the <code>exclamation</code> function. Check the status of your deployed function using the <code>getstatus</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> getstatus \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"functionStatusList"</span>: [
     {
@@ -176,13 +175,13 @@ Hello world!
   ]
 }
 </code></pre>
-<p>As we can see, (a) the instance is currently running and (b) there is one instance, with an ID of 0, running. We can get other information about the function (topics, tenant, namespace, etc.) using the <code>get</code> command instead of <code>getstatus</code>:</p>
+<p>As you can see, the instance is currently running, and an instance with the ID of <code>0</code> is running. With the <code>get</code> command, you can get other information about the function, for example, topics, tenant, namespace, and so on.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> get \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -196,7 +195,7 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">1</span>
 }
 </code></pre>
-<p>As we can see, the parallelism of the function is 1, meaning that only one instance of the function is running in our cluster. Let's update our function to a parallelism of 3 using the <code>update</code> command:</p>
+<p>As you can see, only one instance of the function is running in your cluster. Update the parallel functions to <code>3</code> using the <code>update</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> update \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -207,7 +206,7 @@ Hello world!
   --name exclamation \
   --parallelism 3
 </code></pre>
-<p>You should see <code>Updated successfully</code> in the output. If you run the <code>get</code> command from above for the function, you can see that the parallelism has increased to 3, meaning that there are now three instances of the function running in our cluster:</p>
+<p>You will see <code>Updated successfully</code> in the output. If you enter the <code>get</code> command, you see that the parallel functions are increased to <code>3</code>, meaning that three instances of the function are running in your cluster.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -221,32 +220,26 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">3</span>
 }
 </code></pre>
-<p>Finally, we can shut down our running function using the <code>delete</code> command:</p>
+<p>Shut down the running function with the <code>delete</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> delete \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
-<h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" 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.5 [...]
-<blockquote>
-<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
-<pre><code class="hljs css language-bash"></code></pre>
-</blockquote>
-<p>$ pip install pulsar-client</p>
-<pre><code class="hljs">
-In <span class="hljs-keyword">the</span> <span class="hljs-keyword">above</span> examples, we ran <span class="hljs-keyword">and</span> managed a pre-written Pulsar Function <span class="hljs-keyword">and</span> saw how <span class="hljs-keyword">it</span> worked. To really <span class="hljs-keyword">get</span> our hands dirty, let's <span class="hljs-built_in">write</span> <span class="hljs-keyword">and</span> our own function <span class="hljs-keyword">from</span> scratch, using <span  [...]
-
-First, create a new Python <span class="hljs-built_in">file</span>:
-
-```bash
-$ touch <span class="hljs-built_in">reverse</span>.py
+<p>When you see <code>Deleted successfully</code> in the output, you've successfully run, updated, and shut down functions running in cluster mode.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-new-function"></a><a href="#write-and-run-a-new-function" 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 [...]
+<p>In order to write and run <a href="functions-api.md#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
+<pre><code class="hljs css language-bash">$ pip install pulsar-client
+</code></pre>
+<p>In the examples above, you run and manage pre-written Pulsar Functions and learn how they work. You can also write your own functions with Python API. In the following example, the function takes a string as input, reverses the string, and publishes the reversed string to the specified topic.</p>
+<p>First, create a new Python file.</p>
+<pre><code class="hljs css language-bash">$ touch reverse.py
 </code></pre>
-<p>In that file, add the following:</p>
+<p>Add the following information in the Python file.</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
-<p>Here, the <code>process</code> method defines the processing logic of the Pulsar Function. It simply uses some Python slice magic to reverse each incoming string. Now, we can deploy the function using <code>create</code>:</p>
+<p>The <code>process</code> method defines the processing logic of Pulsar Functions. It uses Python slice magic to reverse each incoming string. You can deploy the function using the <code>create</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --py reverse.py \
   --classname reverse \
@@ -256,30 +249,74 @@ $ touch <span class="hljs-built_in">reverse</span>.py
   --namespace default \
   --name reverse
 </code></pre>
-<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, we can <strong>trigger</strong> the function using the <a href="/docs/ja/next/pulsar-admin#trigger"><code>trigger</code></a> command. This command will send a message that we specify to the function and also give us the function's output. Here's an example:</p>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, you can <strong>trigger</strong> the function using the <a href="reference-pulsar-admin.md#trigger"><code>trigger</code></a> command. This command sends a message that you specify to the function and returns the function output. The following is an example.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger \
   --name reverse \
   --tenant public \
   --namespace default \
   --trigger-value <span class="hljs-string">"sdrawrof won si tub sdrawkcab saw gnirts sihT"</span>
 </code></pre>
-<p>You should get this output:</p>
+<p>You will get the following output.</p>
 <pre><code class="hljs">This string was backwards but is now forwards
 </code></pre>
-<p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
-<h2><a class="anchor" aria-hidden="true" id="packaging-python-dependencies"></a><a href="#packaging-python-dependencies" 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  [...]
-<p>For python functions requiring dependencies to be deployable in pulsar worker instances in an offline manner, we need to package the artifacts as below.</p>
-<h4><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Following programs are required to be installed on the client machine</p>
-<pre><code class="hljs">pip \\ rquired for getting python dependencies
+<p>You have created a new Pulsar Function, deployed it in your Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a>, and triggered the Function.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-go-function"></a><a href="#write-and-run-a-go-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Go function depends on <code>pulsar-client-go</code>. Make sure that you have built <code>pulsar-client-go</code> before using Go function.</p>
+<p>To write and run a Go function, complete the following steps.</p>
+<ol>
+<li><p>Create a new Go file.</p>
+<p>touch helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Append a byte for messages from the input topic.<br>
+The following is a <code>helloFunc.go</code> example. Each message from the input topic is appended with a <code>110</code> byte, and then delivered to the output topic.</p>
+<p>package main</p>
+<p>import (
+&quot;context&quot;</p>
+<pre><code class="hljs"> &quot;github.com/apache/pulsar/pulsar-function-go/pf&quot;
+</code></pre>
+<p>)</p>
+<p>func HandleResponse(ctx context.Context, in []byte) ([]byte, error) {
+res := append(in, 110)
+return res, nil
+}</p>
+<p>func main() {
+pf.Start(HandleResponse)
+}</p></li>
+</ol>
+<ol>
+<li><p>Compile code.</p>
+<p>go build -o examplepulsar helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Run Go function.</p>
+<p>$ bin/pulsar-admin functions create <br>
+--go examplepulsar <br>
+--inputs <a href="persistent://public/default/backwards">persistent://public/default/backwards</a> <br>
+--output <a href="persistent://public/default/forwards">persistent://public/default/forwards</a> <br>
+--tenant public <br>
+--namespace default <br>
+--name gofunc</p></li>
+</ol>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Start a producer and produce messages to the <code>backwards</code> input topic. Start a consumer and consume messages from the <code>forwards</code> output topic, you will see <code>110</code> is appended to all messages.</p>
+<p>The <code>--classname</code> parameter is not specified when running Go function, because there is no <code>Class</code> concept in Go, which is different from Java and Python.</p>
+<blockquote>
+<p>Note<br>
+When you use the <code>--go</code> command to specify an executable file, make sure you have executable permissions.</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="package-python-dependencies"></a><a href="#package-python-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>When you deploy Python functions in a cluster offline, you need to package the required dependencies in a ZIP file before deployment.</p>
+<h3><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>The following programs are required to be installed on the client machine.</p>
+<pre><code class="hljs">pip \\ required for getting python dependencies
 zip \\ for building zip archives
 </code></pre>
-<h4><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
-<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the python function</p>
+<h3><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
+<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the Python function.</p>
 <pre><code class="hljs">sh==1.12.14
 </code></pre>
-<p>Prepare the pulsar function in folder called <strong>src</strong>.</p>
-<p>Run the following command to gather the python dependencies in the folder caller <strong>deps</strong></p>
+<p>Prepare the Pulsar Function in the <strong>src</strong> folder.</p>
+<p>Run the following command to gather Python dependencies in the <strong>deps</strong> folder.</p>
 <pre><code class="hljs">pip download \
 --only-binary :all: \
 --platform manylinux1_x86_64 \
@@ -287,15 +324,18 @@ zip \\ for building zip archives
 --implementation cp \
 --abi cp27m -r requirements.txt -d deps
 </code></pre>
-<p>Sample ouptut</p>
+<p>Sample output</p>
 <pre><code class="hljs">Collecting sh==1.12.14 (from -r requirements.txt (line 1))
   Using cached https://files.pythonhosted.org/packages/4a/22/17b22ef5b049f12080f5815c41bf94de3c229217609e469001a8f80c1b3d/sh-1.12.14-py2.py3-none-any.whl
   Saved ./deps/sh-1.12.14-py2.py3-none-any.whl
 Successfully downloaded sh
 </code></pre>
-<p><strong>Note</strong> pulsar-client is not needed as a dependency as it already installed in the worker node.</p>
-<h4><a class="anchor" aria-hidden="true" id="packaging"></a><a href="#packaging" 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>Create a destination folder with the desired pacaking name eg : <strong>exclamation</strong>, copy <strong>src</strong> and <strong>deps</strong> folder into it and finally compress the folder into a zip archive.</p>
+<blockquote>
+<p>Note<br>
+<code>pulsar-client</code> is not needed as a dependency as it has already installed in the worker node.</p>
+</blockquote>
+<h4><a class="anchor" aria-hidden="true" id="package"></a><a href="#package" 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>Create a destination folder with the desired package name, for example, <strong>exclamation</strong>. Copy the <strong>src</strong> and <strong>deps</strong> folders into it, and compress the folder into a ZIP archive.</p>
 <p>Sample sequence</p>
 <pre><code class="hljs">cp -R deps exclamation/
 cp -R src exclamation/
@@ -309,12 +349,8 @@ drwxr-xr-x   3 a.ahmed  staff   96 Nov  6 17:51 src
 
 zip -r exclamation.zip exclamation
 </code></pre>
-<p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
-<ul>
-<li><a href="/docs/ja/next/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/ja/next/functions-deploying">Deploying Pulsar Functions</a></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/ja/next/functions-overview"><span class="arrow-prev">← </span><span>概要</span></a><a class="docs-next button" href="/docs/ja/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cluster</a [...]
+<p>After package all the required dependencies into the <strong>exclamation.zip</strong> file, you can deploy functions in a Pulsar worker. The Pulsar worker does not need internet connectivity to download packages, because they are all included in the ZIP file.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/ja/next/functions-overview"><span class="arrow-prev">← </span><span>概要</span></a><a class="docs-next button" href="/docs/ja/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cluster</a [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/ja/next/functions-quickstart/index.html b/content/docs/ja/next/functions-quickstart/index.html
index 5007b79..d0b7368 100644
--- a/content/docs/ja/next/functions-quickstart/index.html
+++ b/content/docs/ja/next/functions-quickstart/index.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/ja/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/ja/n [...]
-"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="ja"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial will walk you through running a &lt;a href=&quot;/docs/ja/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pul [...]
+<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/ja/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/ja/next/ [...]
+"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="ja"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/ja/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar  [...]
 "/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.incubator.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.incubator.apache.org/blog/atom.x [...]
               (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),
@@ -76,23 +76,23 @@
                 };
               }
             });
-        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial will walk you through running a <a href="/docs/ja/next/reference-terminology#standalone">standalone</a> Puls [...]
+        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial walks you through running a <a href="/docs/ja/next/reference-terminology#standalone">standalone</a> Pulsar < [...]
 <blockquote>
-<p>In local run mode, your Pulsar Function will communicate with your Pulsar cluster but will run outside of the cluster.</p>
+<p>In local run mode, Pulsar Functions communicate with Pulsar cluster, but run outside of the cluster.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" 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>In order to follow along with this tutorial, you'll need to have <a href="https://maven.apache.org/download.cgi">Maven</a> installed on your machine.</p>
+<p>Install <a href="https://maven.apache.org/download.cgi">Maven</a> on your machine.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-standalone-pulsar-cluster"></a><a href="#run-a-standalone-pulsar-cluster" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<p>In order to run our Pulsar Functions, we'll need to run a Pulsar cluster locally first. The easiest way to do that is to run Pulsar in <a href="/docs/ja/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster:</p>
+<p>In order to run Pulsar Functions, you need to run a Pulsar cluster locally first. The easiest way is to run Pulsar in <a href="/docs/ja/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster.</p>
 <pre><code class="hljs css language-bash">$ wget https://archive.apache.org/dist/pulsar/pulsar-2.3.2/apache-pulsar-2.3.2-bin.tar.gz
 $ tar xvfz apache-pulsar-2.3.2-bin.tar.gz
 $ <span class="hljs-built_in">cd</span> apache-pulsar-2.3.2
 $ bin/pulsar standalone \
   --advertised-address 127.0.0.1
 </code></pre>
-<p>When running Pulsar in standalone mode, the <code>public</code> tenant and <code>default</code> namespace will be created automatically for you. That tenant and namespace will be used throughout this tutorial.</p>
+<p>When running Pulsar in standalone mode, the <code>public</code> tenant and the <code>default</code> namespace are created automatically. The tenant and namespace are used throughout this tutorial.</p>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-local-run-mode"></a><a href="#run-a-pulsar-function-in-local-run-mode" 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  [...]
-<p>Let's start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes that new string to another Pulsar topic. Here's the code for the function:</p>
+<p>You can start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes the new string to another Pulsar topic. The following is the code for the function.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.apache.pulsar.functions.api.examples;
 
 <span class="hljs-keyword">import</span> java.util.function.Function;
@@ -104,7 +104,7 @@ $ bin/pulsar standalone \
     }
 }
 </code></pre>
-<p>A JAR file containing this and several other functions (written in Java) is included with the binary distribution you downloaded above (in the <code>examples</code> folder). To run the function in local mode, i.e. on our laptop but outside our Pulsar cluster:</p>
+<p>A JAR file containing this function and several other functions (written in Java) is included with the binary distribution you have downloaded (in the <code>examples</code> folder). Run the function in local mode on your laptop but outside your Pulsar cluster with the following commands.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -113,13 +113,13 @@ $ bin/pulsar standalone \
   --name exclamation
 </code></pre>
 <blockquote>
-<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics-allowed"></a><a href="#multiple-input-topics-allowed" 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  [...]
-<p>In the example above, a single topic was specified using the <code>--inputs</code> flag. You can also specify multiple input topics as a comma-separated list using the same flag. Here's an example:</p>
+<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics"></a><a href="#multiple-input-topics" 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 [...]
+<p>In the example above, a single topic is specified using the <code>--inputs</code> flag. You can also specify multiple input topics with a comma-separated list using the same flag.</p>
 <pre><code class="hljs css language-bash"></code></pre>
 </blockquote>
 <p>--inputs topic1,topic2</p>
 <pre><code class="hljs">
-We can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic:
+You can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic.
 
 <span class="hljs-code">```bash
 $ bin/pulsar-client consume persistent://public/default/exclamation-output \
@@ -127,27 +127,26 @@ $ bin/pulsar-client consume persistent://public/default/exclamation-output \
   --num-messages 0
 </span></code></pre>
 <blockquote>
-<p>Setting the <code>--num-messages</code> flag to 0 means that the consumer will listen on the topic indefinitely (rather than only accepting a certain number of messages).</p>
+<p>Setting the <code>--num-messages</code> flag to <code>0</code> means that consumers listen on the topic indefinitely, rather than only accepting a certain number of messages.</p>
 </blockquote>
-<p>With a listener up and running, we can open up another shell and produce a message on the input topic that we specified:</p>
+<p>With a listener up and running, you can open up another shell and produce a message on the input topic that you specify.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-client produce persistent://public/default/exclamation-input \
   --num-produce 1 \
   --messages <span class="hljs-string">"Hello world"</span>
 </code></pre>
-<p>In the output, you should see the following:</p>
+<p>When the message has been successfully processed by the exclamation function, you will see the following output. To shut down the function, press <strong>Ctrl+C</strong>.</p>
 <pre><code class="hljs">----- got message -----
 Hello world!
 </code></pre>
-<p>Success! As you can see, the message has been successfully processed by the exclamation function. To shut down the function, simply hit <strong>Ctrl+C</strong>.</p>
-<p>Here's what happened:</p>
+<h3><a class="anchor" aria-hidden="true" id="process-explanation"></a><a href="#process-explanation" 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.2 [...]
 <ul>
-<li>The <code>Hello world</code> message that we published to the input topic (<code>persistent://public/default/exclamation-input</code>) was passed to the exclamation function that we ran on our machine</li>
-<li>The exclamation function processed the message (providing a result of <code>Hello world!</code>) and published the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
-<li>If our exclamation function <em>hadn't</em> been running, Pulsar would have durably stored the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumed and acknowledged the message</li>
+<li>The <code>Hello world</code> message you publish to the input topic (<code>persistent://public/default/exclamation-input</code>) is passed to the exclamation function.</li>
+<li>The exclamation function processes the message (providing a result of <code>Hello world!</code>) and publishes the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
+<li>If the exclamation function <em>does not</em> run, Pulsar will durably store the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumes and acknowledges the message.</li>
 </ul>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-cluster-mode"></a><a href="#run-a-pulsar-function-in-cluster-mode" 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 [...]
-<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and experimentation, but if you want to use Pulsar Functions in a real Pulsar deployment, you'll want to run them in <strong>cluster mode</strong>. In this mode, Pulsar Functions run <em>inside</em> your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface that we've been using thus far.</p>
-<p>This command, for example, would deploy the same exclamation function we ran locally above <em>in our Pulsar cluster</em> (rather than outside it):</p>
+<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and test. However, when you use Pulsar for real deployment, you run it in <strong>cluster mode</strong>. In cluster mode, Pulsar Functions run <em>inside</em> of your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface.</p>
+<p>The following command deploys the same exclamation function you run locally in your Pulsar cluster, rather than outside of it.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -155,18 +154,18 @@ Hello world!
   --output persistent://public/default/exclamation-output \
   --name exclamation
 </code></pre>
-<p>You should see <code>Created successfully</code> in the output. Now, let's see a list of functions running in our cluster:</p>
+<p>You will see <code>Created successfully</code> in the output. Check the list of functions running in your cluster.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> list \
   --tenant public \
   --namespace default
 </code></pre>
-<p>We should see just the <code>exclamation</code> function listed there. We can also check the status of our deployed function using the <code>getstatus</code> command:</p>
+<p>You will see the <code>exclamation</code> function. Check the status of your deployed function using the <code>getstatus</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> getstatus \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"functionStatusList"</span>: [
     {
@@ -176,13 +175,13 @@ Hello world!
   ]
 }
 </code></pre>
-<p>As we can see, (a) the instance is currently running and (b) there is one instance, with an ID of 0, running. We can get other information about the function (topics, tenant, namespace, etc.) using the <code>get</code> command instead of <code>getstatus</code>:</p>
+<p>As you can see, the instance is currently running, and an instance with the ID of <code>0</code> is running. With the <code>get</code> command, you can get other information about the function, for example, topics, tenant, namespace, and so on.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> get \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -196,7 +195,7 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">1</span>
 }
 </code></pre>
-<p>As we can see, the parallelism of the function is 1, meaning that only one instance of the function is running in our cluster. Let's update our function to a parallelism of 3 using the <code>update</code> command:</p>
+<p>As you can see, only one instance of the function is running in your cluster. Update the parallel functions to <code>3</code> using the <code>update</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> update \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -207,7 +206,7 @@ Hello world!
   --name exclamation \
   --parallelism 3
 </code></pre>
-<p>You should see <code>Updated successfully</code> in the output. If you run the <code>get</code> command from above for the function, you can see that the parallelism has increased to 3, meaning that there are now three instances of the function running in our cluster:</p>
+<p>You will see <code>Updated successfully</code> in the output. If you enter the <code>get</code> command, you see that the parallel functions are increased to <code>3</code>, meaning that three instances of the function are running in your cluster.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -221,32 +220,26 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">3</span>
 }
 </code></pre>
-<p>Finally, we can shut down our running function using the <code>delete</code> command:</p>
+<p>Shut down the running function with the <code>delete</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> delete \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
-<h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" 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.5 [...]
-<blockquote>
-<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
-<pre><code class="hljs css language-bash"></code></pre>
-</blockquote>
-<p>$ pip install pulsar-client</p>
-<pre><code class="hljs">
-In <span class="hljs-keyword">the</span> <span class="hljs-keyword">above</span> examples, we ran <span class="hljs-keyword">and</span> managed a pre-written Pulsar Function <span class="hljs-keyword">and</span> saw how <span class="hljs-keyword">it</span> worked. To really <span class="hljs-keyword">get</span> our hands dirty, let's <span class="hljs-built_in">write</span> <span class="hljs-keyword">and</span> our own function <span class="hljs-keyword">from</span> scratch, using <span  [...]
-
-First, create a new Python <span class="hljs-built_in">file</span>:
-
-```bash
-$ touch <span class="hljs-built_in">reverse</span>.py
+<p>When you see <code>Deleted successfully</code> in the output, you've successfully run, updated, and shut down functions running in cluster mode.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-new-function"></a><a href="#write-and-run-a-new-function" 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 [...]
+<p>In order to write and run <a href="functions-api.md#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
+<pre><code class="hljs css language-bash">$ pip install pulsar-client
+</code></pre>
+<p>In the examples above, you run and manage pre-written Pulsar Functions and learn how they work. You can also write your own functions with Python API. In the following example, the function takes a string as input, reverses the string, and publishes the reversed string to the specified topic.</p>
+<p>First, create a new Python file.</p>
+<pre><code class="hljs css language-bash">$ touch reverse.py
 </code></pre>
-<p>In that file, add the following:</p>
+<p>Add the following information in the Python file.</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
-<p>Here, the <code>process</code> method defines the processing logic of the Pulsar Function. It simply uses some Python slice magic to reverse each incoming string. Now, we can deploy the function using <code>create</code>:</p>
+<p>The <code>process</code> method defines the processing logic of Pulsar Functions. It uses Python slice magic to reverse each incoming string. You can deploy the function using the <code>create</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --py reverse.py \
   --classname reverse \
@@ -256,30 +249,74 @@ $ touch <span class="hljs-built_in">reverse</span>.py
   --namespace default \
   --name reverse
 </code></pre>
-<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, we can <strong>trigger</strong> the function using the <a href="/docs/ja/next/pulsar-admin#trigger"><code>trigger</code></a> command. This command will send a message that we specify to the function and also give us the function's output. Here's an example:</p>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, you can <strong>trigger</strong> the function using the <a href="reference-pulsar-admin.md#trigger"><code>trigger</code></a> command. This command sends a message that you specify to the function and returns the function output. The following is an example.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger \
   --name reverse \
   --tenant public \
   --namespace default \
   --trigger-value <span class="hljs-string">"sdrawrof won si tub sdrawkcab saw gnirts sihT"</span>
 </code></pre>
-<p>You should get this output:</p>
+<p>You will get the following output.</p>
 <pre><code class="hljs">This string was backwards but is now forwards
 </code></pre>
-<p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
-<h2><a class="anchor" aria-hidden="true" id="packaging-python-dependencies"></a><a href="#packaging-python-dependencies" 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  [...]
-<p>For python functions requiring dependencies to be deployable in pulsar worker instances in an offline manner, we need to package the artifacts as below.</p>
-<h4><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Following programs are required to be installed on the client machine</p>
-<pre><code class="hljs">pip \\ rquired for getting python dependencies
+<p>You have created a new Pulsar Function, deployed it in your Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a>, and triggered the Function.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-go-function"></a><a href="#write-and-run-a-go-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Go function depends on <code>pulsar-client-go</code>. Make sure that you have built <code>pulsar-client-go</code> before using Go function.</p>
+<p>To write and run a Go function, complete the following steps.</p>
+<ol>
+<li><p>Create a new Go file.</p>
+<p>touch helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Append a byte for messages from the input topic.<br>
+The following is a <code>helloFunc.go</code> example. Each message from the input topic is appended with a <code>110</code> byte, and then delivered to the output topic.</p>
+<p>package main</p>
+<p>import (
+&quot;context&quot;</p>
+<pre><code class="hljs"> &quot;github.com/apache/pulsar/pulsar-function-go/pf&quot;
+</code></pre>
+<p>)</p>
+<p>func HandleResponse(ctx context.Context, in []byte) ([]byte, error) {
+res := append(in, 110)
+return res, nil
+}</p>
+<p>func main() {
+pf.Start(HandleResponse)
+}</p></li>
+</ol>
+<ol>
+<li><p>Compile code.</p>
+<p>go build -o examplepulsar helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Run Go function.</p>
+<p>$ bin/pulsar-admin functions create <br>
+--go examplepulsar <br>
+--inputs <a href="persistent://public/default/backwards">persistent://public/default/backwards</a> <br>
+--output <a href="persistent://public/default/forwards">persistent://public/default/forwards</a> <br>
+--tenant public <br>
+--namespace default <br>
+--name gofunc</p></li>
+</ol>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Start a producer and produce messages to the <code>backwards</code> input topic. Start a consumer and consume messages from the <code>forwards</code> output topic, you will see <code>110</code> is appended to all messages.</p>
+<p>The <code>--classname</code> parameter is not specified when running Go function, because there is no <code>Class</code> concept in Go, which is different from Java and Python.</p>
+<blockquote>
+<p>Note<br>
+When you use the <code>--go</code> command to specify an executable file, make sure you have executable permissions.</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="package-python-dependencies"></a><a href="#package-python-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>When you deploy Python functions in a cluster offline, you need to package the required dependencies in a ZIP file before deployment.</p>
+<h3><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>The following programs are required to be installed on the client machine.</p>
+<pre><code class="hljs">pip \\ required for getting python dependencies
 zip \\ for building zip archives
 </code></pre>
-<h4><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
-<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the python function</p>
+<h3><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
+<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the Python function.</p>
 <pre><code class="hljs">sh==1.12.14
 </code></pre>
-<p>Prepare the pulsar function in folder called <strong>src</strong>.</p>
-<p>Run the following command to gather the python dependencies in the folder caller <strong>deps</strong></p>
+<p>Prepare the Pulsar Function in the <strong>src</strong> folder.</p>
+<p>Run the following command to gather Python dependencies in the <strong>deps</strong> folder.</p>
 <pre><code class="hljs">pip download \
 --only-binary :all: \
 --platform manylinux1_x86_64 \
@@ -287,15 +324,18 @@ zip \\ for building zip archives
 --implementation cp \
 --abi cp27m -r requirements.txt -d deps
 </code></pre>
-<p>Sample ouptut</p>
+<p>Sample output</p>
 <pre><code class="hljs">Collecting sh==1.12.14 (from -r requirements.txt (line 1))
   Using cached https://files.pythonhosted.org/packages/4a/22/17b22ef5b049f12080f5815c41bf94de3c229217609e469001a8f80c1b3d/sh-1.12.14-py2.py3-none-any.whl
   Saved ./deps/sh-1.12.14-py2.py3-none-any.whl
 Successfully downloaded sh
 </code></pre>
-<p><strong>Note</strong> pulsar-client is not needed as a dependency as it already installed in the worker node.</p>
-<h4><a class="anchor" aria-hidden="true" id="packaging"></a><a href="#packaging" 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>Create a destination folder with the desired pacaking name eg : <strong>exclamation</strong>, copy <strong>src</strong> and <strong>deps</strong> folder into it and finally compress the folder into a zip archive.</p>
+<blockquote>
+<p>Note<br>
+<code>pulsar-client</code> is not needed as a dependency as it has already installed in the worker node.</p>
+</blockquote>
+<h4><a class="anchor" aria-hidden="true" id="package"></a><a href="#package" 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>Create a destination folder with the desired package name, for example, <strong>exclamation</strong>. Copy the <strong>src</strong> and <strong>deps</strong> folders into it, and compress the folder into a ZIP archive.</p>
 <p>Sample sequence</p>
 <pre><code class="hljs">cp -R deps exclamation/
 cp -R src exclamation/
@@ -309,12 +349,8 @@ drwxr-xr-x   3 a.ahmed  staff   96 Nov  6 17:51 src
 
 zip -r exclamation.zip exclamation
 </code></pre>
-<p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
-<ul>
-<li><a href="/docs/ja/next/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/ja/next/functions-deploying">Deploying Pulsar Functions</a></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/ja/next/functions-overview"><span class="arrow-prev">← </span><span>概要</span></a><a class="docs-next button" href="/docs/ja/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cluster</a [...]
+<p>After package all the required dependencies into the <strong>exclamation.zip</strong> file, you can deploy functions in a Pulsar worker. The Pulsar worker does not need internet connectivity to download packages, because they are all included in the ZIP file.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/ja/next/functions-overview"><span class="arrow-prev">← </span><span>概要</span></a><a class="docs-next button" href="/docs/ja/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cluster</a [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/zh-CN/next/admin-api-overview.html b/content/docs/zh-CN/next/admin-api-overview.html
index 4f3e40a..85d2bba 100644
--- a/content/docs/zh-CN/next/admin-api-overview.html
+++ b/content/docs/zh-CN/next/admin-api-overview.html
@@ -138,6 +138,24 @@ config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
 
 PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
 </code></pre>
+<p>If you have multiple brokers to use, you can use multi-host like Pulsar service. For example,</p>
+<pre><code class="hljs css language-java">URL url = <span class="hljs-keyword">new</span> URL(<span class="hljs-string">"http://localhost:8080,localhost:8081,localhost:8082"</span>);
+<span class="hljs-comment">// Pass auth-plugin class fully-qualified name if Pulsar-security is enabled.</span>
+String authPluginClassName = <span class="hljs-string">"com.org.MyAuthPluginClass"</span>; 
+<span class="hljs-comment">// Pass auth-param if auth-plugin class requires it</span>
+String authParams = <span class="hljs-string">"param1=value1"</span>;
+<span class="hljs-keyword">boolean</span> useTls = <span class="hljs-keyword">false</span>;
+<span class="hljs-keyword">boolean</span> tlsAllowInsecureConnection = <span class="hljs-keyword">false</span>;
+String tlsTrustCertsFilePath = <span class="hljs-keyword">null</span>;
+
+ClientConfiguration config = <span class="hljs-keyword">new</span> ClientConfiguration();
+config.setAuthentication(authPluginClassName, authParams);
+config.setUseTls(useTls);
+config.setTlsAllowInsecureConnection(tlsAllowInsecureConnection);
+config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
+
+PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
+</code></pre>
 </span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/zh-CN/next/client-libraries-websocket"><span class="arrow-prev">← </span><span class="function-name-prevnext">WebSocket</span></a><a class="docs-next button" href="/docs/zh-CN/next/admin-api-clusters"><span>集群</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#管理设置">管理设置</a><ul class="toc-headings"><li><a href="#rest-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
diff --git a/content/docs/zh-CN/next/admin-api-overview/index.html b/content/docs/zh-CN/next/admin-api-overview/index.html
index 4f3e40a..85d2bba 100644
--- a/content/docs/zh-CN/next/admin-api-overview/index.html
+++ b/content/docs/zh-CN/next/admin-api-overview/index.html
@@ -138,6 +138,24 @@ config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
 
 PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
 </code></pre>
+<p>If you have multiple brokers to use, you can use multi-host like Pulsar service. For example,</p>
+<pre><code class="hljs css language-java">URL url = <span class="hljs-keyword">new</span> URL(<span class="hljs-string">"http://localhost:8080,localhost:8081,localhost:8082"</span>);
+<span class="hljs-comment">// Pass auth-plugin class fully-qualified name if Pulsar-security is enabled.</span>
+String authPluginClassName = <span class="hljs-string">"com.org.MyAuthPluginClass"</span>; 
+<span class="hljs-comment">// Pass auth-param if auth-plugin class requires it</span>
+String authParams = <span class="hljs-string">"param1=value1"</span>;
+<span class="hljs-keyword">boolean</span> useTls = <span class="hljs-keyword">false</span>;
+<span class="hljs-keyword">boolean</span> tlsAllowInsecureConnection = <span class="hljs-keyword">false</span>;
+String tlsTrustCertsFilePath = <span class="hljs-keyword">null</span>;
+
+ClientConfiguration config = <span class="hljs-keyword">new</span> ClientConfiguration();
+config.setAuthentication(authPluginClassName, authParams);
+config.setUseTls(useTls);
+config.setTlsAllowInsecureConnection(tlsAllowInsecureConnection);
+config.setTlsTrustCertsFilePath(tlsTrustCertsFilePath);
+
+PulsarAdmin admin = <span class="hljs-keyword">new</span> PulsarAdmin(url, config);
+</code></pre>
 </span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/zh-CN/next/client-libraries-websocket"><span class="arrow-prev">← </span><span class="function-name-prevnext">WebSocket</span></a><a class="docs-next button" href="/docs/zh-CN/next/admin-api-clusters"><span>集群</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#管理设置">管理设置</a><ul class="toc-headings"><li><a href="#rest-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
diff --git a/content/docs/zh-CN/next/client-libraries-java.html b/content/docs/zh-CN/next/client-libraries-java.html
index 225e154..8cb7746 100644
--- a/content/docs/zh-CN/next/client-libraries-java.html
+++ b/content/docs/zh-CN/next/client-libraries-java.html
@@ -115,6 +115,9 @@ dependencies {
 <p>Pulsar协议 url 使用 <code>pulsar</code> scheme来指定被连接的集群,默认端口为6650。以下是 <code>localhost</code> 的示例:</p>
 <pre><code class="hljs css language-http">pulsar://localhost:6650
 </code></pre>
+<p>If you have more than one broker, the URL may look like this:</p>
+<pre><code class="hljs css language-http">pulsar://localhost:6550,localhost:6651,localhost:6652
+</code></pre>
 <p>生产环境的Pulsar 集群URL类似这样:</p>
 <pre><code class="hljs css language-http">pulsar://pulsar.us-west.example.com:6650
 </code></pre>
@@ -128,6 +131,11 @@ dependencies {
         .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650"</span>)
         .build();
 </code></pre>
+<p>If you have multiple brokers, you can initiate a PulsarClient like this:</p>
+<pre><code class="hljs css language-java">PulsarClient client = PulsarClient.builder()
+        .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650,localhost:6651,localhost:6652"</span>)
+        .build();
+</code></pre>
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="默认的broker-url是单机集群"></a><a href="#默认的broker-url是单机集群" 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- [...]
 <p>如果你使用<a href="/docs/zh-CN/next/standalone">单机模式</a>运行一个集群,broker将默认使用<code>pulsar://localhost:6650</code></p>
diff --git a/content/docs/zh-CN/next/client-libraries-java/index.html b/content/docs/zh-CN/next/client-libraries-java/index.html
index 225e154..8cb7746 100644
--- a/content/docs/zh-CN/next/client-libraries-java/index.html
+++ b/content/docs/zh-CN/next/client-libraries-java/index.html
@@ -115,6 +115,9 @@ dependencies {
 <p>Pulsar协议 url 使用 <code>pulsar</code> scheme来指定被连接的集群,默认端口为6650。以下是 <code>localhost</code> 的示例:</p>
 <pre><code class="hljs css language-http">pulsar://localhost:6650
 </code></pre>
+<p>If you have more than one broker, the URL may look like this:</p>
+<pre><code class="hljs css language-http">pulsar://localhost:6550,localhost:6651,localhost:6652
+</code></pre>
 <p>生产环境的Pulsar 集群URL类似这样:</p>
 <pre><code class="hljs css language-http">pulsar://pulsar.us-west.example.com:6650
 </code></pre>
@@ -128,6 +131,11 @@ dependencies {
         .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650"</span>)
         .build();
 </code></pre>
+<p>If you have multiple brokers, you can initiate a PulsarClient like this:</p>
+<pre><code class="hljs css language-java">PulsarClient client = PulsarClient.builder()
+        .serviceUrl(<span class="hljs-string">"pulsar://localhost:6650,localhost:6651,localhost:6652"</span>)
+        .build();
+</code></pre>
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="默认的broker-url是单机集群"></a><a href="#默认的broker-url是单机集群" 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- [...]
 <p>如果你使用<a href="/docs/zh-CN/next/standalone">单机模式</a>运行一个集群,broker将默认使用<code>pulsar://localhost:6650</code></p>
diff --git a/content/docs/zh-CN/next/cookbooks-compaction.html b/content/docs/zh-CN/next/cookbooks-compaction.html
index ee38de0..140ef2a 100644
--- a/content/docs/zh-CN/next/cookbooks-compaction.html
+++ b/content/docs/zh-CN/next/cookbooks-compaction.html
@@ -87,7 +87,7 @@
 <p>Compaction only works on messages that have keys (as in the stock ticker example the stock symbol serves as the key for each message). Keys can thus be thought of as the axis along which compaction is applied. Messages that don't have keys are simply ignored by compaction.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="when-should-i-use-compacted-topics-when"></a><a href="#when-should-i-use-compacted-topics-when" 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  [...]
-<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scneario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
+<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scenario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
 <ul>
 <li>They can read from the &quot;original,&quot; non-compacted topic in case they need access to &quot;historical&quot; values, i.e. the entirety of the topic's messages.</li>
 <li>They can read from the compacted topic if they only want to see the most up-to-date messages.</li>
diff --git a/content/docs/zh-CN/next/cookbooks-compaction/index.html b/content/docs/zh-CN/next/cookbooks-compaction/index.html
index ee38de0..140ef2a 100644
--- a/content/docs/zh-CN/next/cookbooks-compaction/index.html
+++ b/content/docs/zh-CN/next/cookbooks-compaction/index.html
@@ -87,7 +87,7 @@
 <p>Compaction only works on messages that have keys (as in the stock ticker example the stock symbol serves as the key for each message). Keys can thus be thought of as the axis along which compaction is applied. Messages that don't have keys are simply ignored by compaction.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="when-should-i-use-compacted-topics-when"></a><a href="#when-should-i-use-compacted-topics-when" 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  [...]
-<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scneario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
+<p>The classic example of a topic that could benefit from compaction would be a stock ticker topic through which consumers can access up-to-date values for specific stocks. Imagine a scenario in which messages carrying stock value data use the stock symbol as the key (<code>GOOG</code>, <code>AAPL</code>, <code>TWTR</code>, etc.). Compacting this topic would give consumers on the topic two options:</p>
 <ul>
 <li>They can read from the &quot;original,&quot; non-compacted topic in case they need access to &quot;historical&quot; values, i.e. the entirety of the topic's messages.</li>
 <li>They can read from the compacted topic if they only want to see the most up-to-date messages.</li>
diff --git a/content/docs/zh-CN/next/deploy-bare-metal.html b/content/docs/zh-CN/next/deploy-bare-metal.html
index 827cfdc..f25ab8e 100644
--- a/content/docs/zh-CN/next/deploy-bare-metal.html
+++ b/content/docs/zh-CN/next/deploy-bare-metal.html
@@ -111,6 +111,7 @@
 </ul>
 <blockquote>
 <p>如果没有足够的机器,或者想在集群模式下使用 Pulsar (稍后扩展集群),可以把 Pulsar 部署在一个节点上,该节点会在同一台机器上运行 zookeeper、bookie 和 broker。</p>
+<p>If you don't have a DNS server, you can use multi-host in service URL instead.</p>
 </blockquote>
 <p>集群中的每台机器都需要安装<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 8</a>或更高版本。</p>
 <p>下图展示了基本设置:</p>
diff --git a/content/docs/zh-CN/next/deploy-bare-metal/index.html b/content/docs/zh-CN/next/deploy-bare-metal/index.html
index 827cfdc..f25ab8e 100644
--- a/content/docs/zh-CN/next/deploy-bare-metal/index.html
+++ b/content/docs/zh-CN/next/deploy-bare-metal/index.html
@@ -111,6 +111,7 @@
 </ul>
 <blockquote>
 <p>如果没有足够的机器,或者想在集群模式下使用 Pulsar (稍后扩展集群),可以把 Pulsar 部署在一个节点上,该节点会在同一台机器上运行 zookeeper、bookie 和 broker。</p>
+<p>If you don't have a DNS server, you can use multi-host in service URL instead.</p>
 </blockquote>
 <p>集群中的每台机器都需要安装<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 8</a>或更高版本。</p>
 <p>下图展示了基本设置:</p>
diff --git a/content/docs/zh-CN/next/develop-cpp.html b/content/docs/zh-CN/next/develop-cpp.html
index 1348691..2398939 100644
--- a/content/docs/zh-CN/next/develop-cpp.html
+++ b/content/docs/zh-CN/next/develop-cpp.html
@@ -96,7 +96,7 @@
 <h3><a class="anchor" aria-hidden="true" id="linux"></a><a href="#linux" 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.09 [...]
 <p>首先,安装所有必需的依赖项:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> apt-get install cmake libssl-dev libcurl4-openssl-dev liblog4cxx-dev \</span>
-  libprotobuf-dev libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
+  libprotobuf-dev protobuf-compiler libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
 </code></pre>
 <p>Then compile and install <a href="https://github.com/google/googletest">Google Test</a>:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> libgtest-dev version is 1.18.0 or above</span>
diff --git a/content/docs/zh-CN/next/develop-cpp/index.html b/content/docs/zh-CN/next/develop-cpp/index.html
index 1348691..2398939 100644
--- a/content/docs/zh-CN/next/develop-cpp/index.html
+++ b/content/docs/zh-CN/next/develop-cpp/index.html
@@ -96,7 +96,7 @@
 <h3><a class="anchor" aria-hidden="true" id="linux"></a><a href="#linux" 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.09 [...]
 <p>首先,安装所有必需的依赖项:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> apt-get install cmake libssl-dev libcurl4-openssl-dev liblog4cxx-dev \</span>
-  libprotobuf-dev libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
+  libprotobuf-dev protobuf-compiler libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
 </code></pre>
 <p>Then compile and install <a href="https://github.com/google/googletest">Google Test</a>:</p>
 <pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> libgtest-dev version is 1.18.0 or above</span>
diff --git a/content/docs/zh-CN/next/functions-quickstart.html b/content/docs/zh-CN/next/functions-quickstart.html
index fa29797..e6b8ef4 100644
--- a/content/docs/zh-CN/next/functions-quickstart.html
+++ b/content/docs/zh-CN/next/functions-quickstart.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;本教程将引导你在计算机上运行 &lt;a href=&quot;/docs/zh-CN/next/reference-terminology#standalone&quot;&gt;独立 &lt;/a&gt; Pulsar &lt;a href=&quot;/docs/zh-CN/next/reference-terminology#clu [...]
-"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="zh-CN"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;本教程将引导你在计算机上运行 &lt;a href=&quot;/docs/zh-CN/next/reference-terminology#standalone&quot;&gt;独立 &lt;/a&gt; Pulsar &lt;a href=&quot;/docs/zh-CN [...]
+<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/zh-CN/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/zh [...]
+"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="zh-CN"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/zh-CN/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; P [...]
 "/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.incubator.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.incubator.apache.org/blog/atom.x [...]
               (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),
@@ -76,23 +76,23 @@
                 };
               }
             });
-        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>本教程将引导你在计算机上运行 <a href="/docs/zh-CN/next/reference-terminology#standalone">独立 </a> Pulsar <a href="/docs/zh-CN/next/ref [...]
+        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial walks you through running a <a href="/docs/zh-CN/next/reference-terminology#standalone">standalone</a> Pu [...]
 <blockquote>
-<p>在本地模式下,Pulsar Function会与 Pulsar 集群通信,但在集群之外运行。</p>
+<p>In local run mode, Pulsar Functions communicate with Pulsar cluster, but run outside of the cluster.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" 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>为了遵循此教程,你需要在机器上安装 <a href="https://maven.apache.org/download.cgi">Maven</a>。</p>
+<p>Install <a href="https://maven.apache.org/download.cgi">Maven</a> on your machine.</p>
 <h2><a class="anchor" aria-hidden="true" id="运行-pulsar-独立集群"></a><a href="#运行-pulsar-独立集群" 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>为了运行 Pulsar Functions,我们需要先运行本地 Pulsar 集群。 简单的方式就是用 <a href="/docs/zh-CN/next/reference-terminology#standalone">standalone</a> 模式运行 Pulsar。 根据下面的步骤启动一个独立集群:</p>
+<p>In order to run Pulsar Functions, you need to run a Pulsar cluster locally first. The easiest way is to run Pulsar in <a href="/docs/zh-CN/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster.</p>
 <pre><code class="hljs css language-bash">$ wget https://archive.apache.org/dist/pulsar/pulsar-2.3.2/apache-pulsar-2.3.2-bin.tar.gz
 $ tar xvfz apache-pulsar-2.3.2-bin.tar.gz
 $ <span class="hljs-built_in">cd</span> apache-pulsar-2.3.2
 $ bin/pulsar standalone \
   --advertised-address 127.0.0.1
 </code></pre>
-<p>在独立模式下运行 Pulsar 会自动创建<code>public</code> 租户和<code>default</code>命名空间。 That tenant and namespace will be used throughout this tutorial.</p>
+<p>When running Pulsar in standalone mode, the <code>public</code> tenant and the <code>default</code> namespace are created automatically. The tenant and namespace are used throughout this tutorial.</p>
 <h2><a class="anchor" aria-hidden="true" id="在本地模式下运行-pulsar-function"></a><a href="#在本地模式下运行-pulsar-function" 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-. [...]
-<p>让我们从一个简单的函数开始,该函数将字符串作为Pulsar主题的输入,在字符串的末尾添加一个感叹号,然后将该新字符串发布到另一个Pulsar主题。 这是函数的代码:</p>
+<p>You can start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes the new string to another Pulsar topic. The following is the code for the function.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{
@@ -100,7 +100,7 @@ $ bin/pulsar standalone \
     }
 }
 </code></pre>
-<p>包含此函数和其他几个函数(用Java写的) 的 JAR 文件包含在你下载的二进制发行版里(在<code>examples</code>文件夹下)。 To run the function in local mode, i.e. on our laptop but outside our Pulsar cluster:</p>
+<p>A JAR file containing this function and several other functions (written in Java) is included with the binary distribution you have downloaded (in the <code>examples</code> folder). Run the function in local mode on your laptop but outside your Pulsar cluster with the following commands.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -109,13 +109,13 @@ $ bin/pulsar standalone \
   --name exclamation
 </code></pre>
 <blockquote>
-<h4><a class="anchor" aria-hidden="true" id="允许多个输入主题"></a><a href="#允许多个输入主题" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>In the example above, a single topic was specified using the <code>--inputs</code> flag. You can also specify multiple input topics as a comma-separated list using the same flag. Here's an example:</p>
+<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics"></a><a href="#multiple-input-topics" 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 [...]
+<p>In the example above, a single topic is specified using the <code>--inputs</code> flag. You can also specify multiple input topics with a comma-separated list using the same flag.</p>
 <pre><code class="hljs css language-bash"></code></pre>
 </blockquote>
 <p>--inputs topic1,topic2</p>
 <pre><code class="hljs">
-We can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic:
+You can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic.
 
 <span class="hljs-code">```bash
 $ bin/pulsar-client consume persistent://public/default/exclamation-output \
@@ -123,27 +123,26 @@ $ bin/pulsar-client consume persistent://public/default/exclamation-output \
   --num-messages 0
 </span></code></pre>
 <blockquote>
-<p>Setting the <code>--num-messages</code> flag to 0 means that the consumer will listen on the topic indefinitely (rather than only accepting a certain number of messages).</p>
+<p>Setting the <code>--num-messages</code> flag to <code>0</code> means that consumers listen on the topic indefinitely, rather than only accepting a certain number of messages.</p>
 </blockquote>
-<p>With a listener up and running, we can open up another shell and produce a message on the input topic that we specified:</p>
+<p>With a listener up and running, you can open up another shell and produce a message on the input topic that you specify.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-client produce persistent://public/default/exclamation-input \
   --num-produce 1 \
   --messages <span class="hljs-string">"Hello world"</span>
 </code></pre>
-<p>In the output, you should see the following:</p>
+<p>When the message has been successfully processed by the exclamation function, you will see the following output. To shut down the function, press <strong>Ctrl+C</strong>.</p>
 <pre><code class="hljs">----- got message -----
 Hello world!
 </code></pre>
-<p>Success! As you can see, the message has been successfully processed by the exclamation function. To shut down the function, simply hit <strong>Ctrl+C</strong>.</p>
-<p>Here's what happened:</p>
+<h3><a class="anchor" aria-hidden="true" id="process-explanation"></a><a href="#process-explanation" 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.2 [...]
 <ul>
-<li>The <code>Hello world</code> message that we published to the input topic (<code>persistent://public/default/exclamation-input</code>) was passed to the exclamation function that we ran on our machine</li>
-<li>The exclamation function processed the message (providing a result of <code>Hello world!</code>) and published the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
-<li>If our exclamation function <em>hadn't</em> been running, Pulsar would have durably stored the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumed and acknowledged the message</li>
+<li>The <code>Hello world</code> message you publish to the input topic (<code>persistent://public/default/exclamation-input</code>) is passed to the exclamation function.</li>
+<li>The exclamation function processes the message (providing a result of <code>Hello world!</code>) and publishes the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
+<li>If the exclamation function <em>does not</em> run, Pulsar will durably store the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumes and acknowledges the message.</li>
 </ul>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-cluster-mode"></a><a href="#run-a-pulsar-function-in-cluster-mode" 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 [...]
-<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and experimentation, but if you want to use Pulsar Functions in a real Pulsar deployment, you'll want to run them in <strong>cluster mode</strong>. In this mode, Pulsar Functions run <em>inside</em> your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface that we've been using thus far.</p>
-<p>This command, for example, would deploy the same exclamation function we ran locally above <em>in our Pulsar cluster</em> (rather than outside it):</p>
+<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and test. However, when you use Pulsar for real deployment, you run it in <strong>cluster mode</strong>. In cluster mode, Pulsar Functions run <em>inside</em> of your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface.</p>
+<p>The following command deploys the same exclamation function you run locally in your Pulsar cluster, rather than outside of it.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -151,18 +150,18 @@ Hello world!
   --output persistent://public/default/exclamation-output \
   --name exclamation
 </code></pre>
-<p>You should see <code>Created successfully</code> in the output. Now, let's see a list of functions running in our cluster:</p>
+<p>You will see <code>Created successfully</code> in the output. Check the list of functions running in your cluster.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> list \
   --tenant public \
   --namespace default
 </code></pre>
-<p>We should see just the <code>exclamation</code> function listed there. We can also check the status of our deployed function using the <code>getstatus</code> command:</p>
+<p>You will see the <code>exclamation</code> function. Check the status of your deployed function using the <code>getstatus</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> getstatus \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"functionStatusList"</span>: [
     {
@@ -172,13 +171,13 @@ Hello world!
   ]
 }
 </code></pre>
-<p>As we can see, (a) the instance is currently running and (b) there is one instance, with an ID of 0, running. We can get other information about the function (topics, tenant, namespace, etc.) using the <code>get</code> command instead of <code>getstatus</code>:</p>
+<p>As you can see, the instance is currently running, and an instance with the ID of <code>0</code> is running. With the <code>get</code> command, you can get other information about the function, for example, topics, tenant, namespace, and so on.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> get \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -192,7 +191,7 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">1</span>
 }
 </code></pre>
-<p>As we can see, the parallelism of the function is 1, meaning that only one instance of the function is running in our cluster. Let's update our function to a parallelism of 3 using the <code>update</code> command:</p>
+<p>As you can see, only one instance of the function is running in your cluster. Update the parallel functions to <code>3</code> using the <code>update</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> update \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -203,7 +202,7 @@ Hello world!
   --name exclamation \
   --parallelism 3
 </code></pre>
-<p>You should see <code>Updated successfully</code> in the output. If you run the <code>get</code> command from above for the function, you can see that the parallelism has increased to 3, meaning that there are now three instances of the function running in our cluster:</p>
+<p>You will see <code>Updated successfully</code> in the output. If you enter the <code>get</code> command, you see that the parallel functions are increased to <code>3</code>, meaning that three instances of the function are running in your cluster.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -217,32 +216,26 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">3</span>
 }
 </code></pre>
-<p>Finally, we can shut down our running function using the <code>delete</code> command:</p>
+<p>Shut down the running function with the <code>delete</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> delete \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
-<h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" 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.5 [...]
-<blockquote>
-<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
-<pre><code class="hljs css language-bash"></code></pre>
-</blockquote>
-<p>$ pip install pulsar-client</p>
-<pre><code class="hljs">
-In <span class="hljs-keyword">the</span> <span class="hljs-keyword">above</span> examples, we ran <span class="hljs-keyword">and</span> managed a pre-written Pulsar Function <span class="hljs-keyword">and</span> saw how <span class="hljs-keyword">it</span> worked. To really <span class="hljs-keyword">get</span> our hands dirty, let's <span class="hljs-built_in">write</span> <span class="hljs-keyword">and</span> our own function <span class="hljs-keyword">from</span> scratch, using <span  [...]
-
-First, create a new Python <span class="hljs-built_in">file</span>:
-
-```bash
-$ touch <span class="hljs-built_in">reverse</span>.py
+<p>When you see <code>Deleted successfully</code> in the output, you've successfully run, updated, and shut down functions running in cluster mode.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-new-function"></a><a href="#write-and-run-a-new-function" 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 [...]
+<p>In order to write and run <a href="functions-api.md#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
+<pre><code class="hljs css language-bash">$ pip install pulsar-client
+</code></pre>
+<p>In the examples above, you run and manage pre-written Pulsar Functions and learn how they work. You can also write your own functions with Python API. In the following example, the function takes a string as input, reverses the string, and publishes the reversed string to the specified topic.</p>
+<p>First, create a new Python file.</p>
+<pre><code class="hljs css language-bash">$ touch reverse.py
 </code></pre>
-<p>In that file, add the following:</p>
+<p>Add the following information in the Python file.</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
-<p>Here, the <code>process</code> method defines the processing logic of the Pulsar Function. It simply uses some Python slice magic to reverse each incoming string. Now, we can deploy the function using <code>create</code>:</p>
+<p>The <code>process</code> method defines the processing logic of Pulsar Functions. It uses Python slice magic to reverse each incoming string. You can deploy the function using the <code>create</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --py reverse.py \
   --classname reverse \
@@ -252,30 +245,74 @@ $ touch <span class="hljs-built_in">reverse</span>.py
   --namespace default \
   --name reverse
 </code></pre>
-<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, we can <strong>trigger</strong> the function using the <a href="/docs/zh-CN/next/pulsar-admin#trigger"><code>trigger</code></a> command. This command will send a message that we specify to the function and also give us the function's output. 下面是一个示例:</p>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, you can <strong>trigger</strong> the function using the <a href="reference-pulsar-admin.md#trigger"><code>trigger</code></a> command. This command sends a message that you specify to the function and returns the function output. The following is an example.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger \
   --name reverse \
   --tenant public \
   --namespace default \
   --trigger-value <span class="hljs-string">"sdrawrof won si tub sdrawkcab saw gnirts sihT"</span>
 </code></pre>
-<p>You should get this output:</p>
+<p>You will get the following output.</p>
 <pre><code class="hljs">This string was backwards but is now forwards
 </code></pre>
-<p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
-<h2><a class="anchor" aria-hidden="true" id="packaging-python-dependencies"></a><a href="#packaging-python-dependencies" 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  [...]
-<p>For python functions requiring dependencies to be deployable in pulsar worker instances in an offline manner, we need to package the artifacts as below.</p>
-<h4><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Following programs are required to be installed on the client machine</p>
-<pre><code class="hljs">pip \\ rquired for getting python dependencies
+<p>You have created a new Pulsar Function, deployed it in your Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a>, and triggered the Function.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-go-function"></a><a href="#write-and-run-a-go-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Go function depends on <code>pulsar-client-go</code>. Make sure that you have built <code>pulsar-client-go</code> before using Go function.</p>
+<p>To write and run a Go function, complete the following steps.</p>
+<ol>
+<li><p>Create a new Go file.</p>
+<p>touch helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Append a byte for messages from the input topic.<br>
+The following is a <code>helloFunc.go</code> example. Each message from the input topic is appended with a <code>110</code> byte, and then delivered to the output topic.</p>
+<p>package main</p>
+<p>import (
+&quot;context&quot;</p>
+<pre><code class="hljs"> &quot;github.com/apache/pulsar/pulsar-function-go/pf&quot;
+</code></pre>
+<p>)</p>
+<p>func HandleResponse(ctx context.Context, in []byte) ([]byte, error) {
+res := append(in, 110)
+return res, nil
+}</p>
+<p>func main() {
+pf.Start(HandleResponse)
+}</p></li>
+</ol>
+<ol>
+<li><p>Compile code.</p>
+<p>go build -o examplepulsar helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Run Go function.</p>
+<p>$ bin/pulsar-admin functions create <br>
+--go examplepulsar <br>
+--inputs <a href="persistent://public/default/backwards">persistent://public/default/backwards</a> <br>
+--output <a href="persistent://public/default/forwards">persistent://public/default/forwards</a> <br>
+--tenant public <br>
+--namespace default <br>
+--name gofunc</p></li>
+</ol>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Start a producer and produce messages to the <code>backwards</code> input topic. Start a consumer and consume messages from the <code>forwards</code> output topic, you will see <code>110</code> is appended to all messages.</p>
+<p>The <code>--classname</code> parameter is not specified when running Go function, because there is no <code>Class</code> concept in Go, which is different from Java and Python.</p>
+<blockquote>
+<p>Note<br>
+When you use the <code>--go</code> command to specify an executable file, make sure you have executable permissions.</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="package-python-dependencies"></a><a href="#package-python-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>When you deploy Python functions in a cluster offline, you need to package the required dependencies in a ZIP file before deployment.</p>
+<h3><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>The following programs are required to be installed on the client machine.</p>
+<pre><code class="hljs">pip \\ required for getting python dependencies
 zip \\ for building zip archives
 </code></pre>
-<h4><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
-<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the python function</p>
+<h3><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
+<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the Python function.</p>
 <pre><code class="hljs">sh==1.12.14
 </code></pre>
-<p>Prepare the pulsar function in folder called <strong>src</strong>.</p>
-<p>Run the following command to gather the python dependencies in the folder caller <strong>deps</strong></p>
+<p>Prepare the Pulsar Function in the <strong>src</strong> folder.</p>
+<p>Run the following command to gather Python dependencies in the <strong>deps</strong> folder.</p>
 <pre><code class="hljs">pip download \
 --only-binary :all: \
 --platform manylinux1_x86_64 \
@@ -283,15 +320,18 @@ zip \\ for building zip archives
 --implementation cp \
 --abi cp27m -r requirements.txt -d deps
 </code></pre>
-<p>Sample ouptut</p>
+<p>Sample output</p>
 <pre><code class="hljs">Collecting sh==1.12.14 (from -r requirements.txt (line 1))
   Using cached https://files.pythonhosted.org/packages/4a/22/17b22ef5b049f12080f5815c41bf94de3c229217609e469001a8f80c1b3d/sh-1.12.14-py2.py3-none-any.whl
   Saved ./deps/sh-1.12.14-py2.py3-none-any.whl
 Successfully downloaded sh
 </code></pre>
-<p><strong>Note</strong> pulsar-client is not needed as a dependency as it already installed in the worker node.</p>
-<h4><a class="anchor" aria-hidden="true" id="packaging"></a><a href="#packaging" 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>Create a destination folder with the desired pacaking name eg : <strong>exclamation</strong>, copy <strong>src</strong> and <strong>deps</strong> folder into it and finally compress the folder into a zip archive.</p>
+<blockquote>
+<p>Note<br>
+<code>pulsar-client</code> is not needed as a dependency as it has already installed in the worker node.</p>
+</blockquote>
+<h4><a class="anchor" aria-hidden="true" id="包"></a><a href="#包" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1 [...]
+<p>Create a destination folder with the desired package name, for example, <strong>exclamation</strong>. Copy the <strong>src</strong> and <strong>deps</strong> folders into it, and compress the folder into a ZIP archive.</p>
 <p>Sample sequence</p>
 <pre><code class="hljs">cp -R deps exclamation/
 cp -R src exclamation/
@@ -305,12 +345,8 @@ drwxr-xr-x   3 a.ahmed  staff   96 Nov  6 17:51 src
 
 zip -r exclamation.zip exclamation
 </code></pre>
-<p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
-<ul>
-<li><a href="/docs/zh-CN/next/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/zh-CN/next/functions-deploying">Deploying Pulsar Functions</a></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/zh-CN/next/functions-overview"><span class="arrow-prev">← </span><span>概述</span></a><a class="docs-next button" href="/docs/zh-CN/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#运行-pulsar-独立集群">运行 Pulsar 独立集群</a></li><li><a href="#在本地模式下运行 [...]
+<p>After package all the required dependencies into the <strong>exclamation.zip</strong> file, you can deploy functions in a Pulsar worker. The Pulsar worker does not need internet connectivity to download packages, because they are all included in the ZIP file.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/zh-CN/next/functions-overview"><span class="arrow-prev">← </span><span>概述</span></a><a class="docs-next button" href="/docs/zh-CN/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#运行-pulsar-独立集群">运行 Pulsar 独立集群</a></li><li><a href="#在本地模式下运行 [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/zh-CN/next/functions-quickstart/index.html b/content/docs/zh-CN/next/functions-quickstart/index.html
index fa29797..e6b8ef4 100644
--- a/content/docs/zh-CN/next/functions-quickstart/index.html
+++ b/content/docs/zh-CN/next/functions-quickstart/index.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;本教程将引导你在计算机上运行 &lt;a href=&quot;/docs/zh-CN/next/reference-terminology#standalone&quot;&gt;独立 &lt;/a&gt; Pulsar &lt;a href=&quot;/docs/zh-CN/next/reference-terminology#clu [...]
-"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="zh-CN"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;本教程将引导你在计算机上运行 &lt;a href=&quot;/docs/zh-CN/next/reference-terminology#standalone&quot;&gt;独立 &lt;/a&gt; Pulsar &lt;a href=&quot;/docs/zh-CN [...]
+<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Get started with Pulsar Functions · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/zh-CN/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; Pulsar &lt;a href=&quot;/docs/zh [...]
+"/><meta name="docsearch:version" content="next"/><meta name="docsearch:language" content="zh-CN"/><meta property="og:title" content="Get started with Pulsar Functions · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.incubator.apache.org/"/><meta property="og:description" content="&lt;p&gt;This tutorial walks you through running a &lt;a href=&quot;/docs/zh-CN/next/reference-terminology#standalone&quot;&gt;standalone&lt;/a&gt; P [...]
 "/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.incubator.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.incubator.apache.org/blog/atom.x [...]
               (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),
@@ -76,23 +76,23 @@
                 };
               }
             });
-        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>本教程将引导你在计算机上运行 <a href="/docs/zh-CN/next/reference-terminology#standalone">独立 </a> Pulsar <a href="/docs/zh-CN/next/ref [...]
+        </script></nav></div><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">Translate</a><h1 class="postHeaderTitle">Get started with Pulsar Functions</h1></header><article><div><span><p>This tutorial walks you through running a <a href="/docs/zh-CN/next/reference-terminology#standalone">standalone</a> Pu [...]
 <blockquote>
-<p>在本地模式下,Pulsar Function会与 Pulsar 集群通信,但在集群之外运行。</p>
+<p>In local run mode, Pulsar Functions communicate with Pulsar cluster, but run outside of the cluster.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" 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>为了遵循此教程,你需要在机器上安装 <a href="https://maven.apache.org/download.cgi">Maven</a>。</p>
+<p>Install <a href="https://maven.apache.org/download.cgi">Maven</a> on your machine.</p>
 <h2><a class="anchor" aria-hidden="true" id="运行-pulsar-独立集群"></a><a href="#运行-pulsar-独立集群" 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>为了运行 Pulsar Functions,我们需要先运行本地 Pulsar 集群。 简单的方式就是用 <a href="/docs/zh-CN/next/reference-terminology#standalone">standalone</a> 模式运行 Pulsar。 根据下面的步骤启动一个独立集群:</p>
+<p>In order to run Pulsar Functions, you need to run a Pulsar cluster locally first. The easiest way is to run Pulsar in <a href="/docs/zh-CN/next/reference-terminology#standalone">standalone</a> mode. Follow these steps to start up a standalone cluster.</p>
 <pre><code class="hljs css language-bash">$ wget https://archive.apache.org/dist/pulsar/pulsar-2.3.2/apache-pulsar-2.3.2-bin.tar.gz
 $ tar xvfz apache-pulsar-2.3.2-bin.tar.gz
 $ <span class="hljs-built_in">cd</span> apache-pulsar-2.3.2
 $ bin/pulsar standalone \
   --advertised-address 127.0.0.1
 </code></pre>
-<p>在独立模式下运行 Pulsar 会自动创建<code>public</code> 租户和<code>default</code>命名空间。 That tenant and namespace will be used throughout this tutorial.</p>
+<p>When running Pulsar in standalone mode, the <code>public</code> tenant and the <code>default</code> namespace are created automatically. The tenant and namespace are used throughout this tutorial.</p>
 <h2><a class="anchor" aria-hidden="true" id="在本地模式下运行-pulsar-function"></a><a href="#在本地模式下运行-pulsar-function" 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-. [...]
-<p>让我们从一个简单的函数开始,该函数将字符串作为Pulsar主题的输入,在字符串的末尾添加一个感叹号,然后将该新字符串发布到另一个Pulsar主题。 这是函数的代码:</p>
+<p>You can start with a simple function that takes a string as input from a Pulsar topic, adds an exclamation point to the end of the string, and then publishes the new string to another Pulsar topic. The following is the code for the function.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{
@@ -100,7 +100,7 @@ $ bin/pulsar standalone \
     }
 }
 </code></pre>
-<p>包含此函数和其他几个函数(用Java写的) 的 JAR 文件包含在你下载的二进制发行版里(在<code>examples</code>文件夹下)。 To run the function in local mode, i.e. on our laptop but outside our Pulsar cluster:</p>
+<p>A JAR file containing this function and several other functions (written in Java) is included with the binary distribution you have downloaded (in the <code>examples</code> folder). Run the function in local mode on your laptop but outside your Pulsar cluster with the following commands.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -109,13 +109,13 @@ $ bin/pulsar standalone \
   --name exclamation
 </code></pre>
 <blockquote>
-<h4><a class="anchor" aria-hidden="true" id="允许多个输入主题"></a><a href="#允许多个输入主题" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>In the example above, a single topic was specified using the <code>--inputs</code> flag. You can also specify multiple input topics as a comma-separated list using the same flag. Here's an example:</p>
+<h4><a class="anchor" aria-hidden="true" id="multiple-input-topics"></a><a href="#multiple-input-topics" 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 [...]
+<p>In the example above, a single topic is specified using the <code>--inputs</code> flag. You can also specify multiple input topics with a comma-separated list using the same flag.</p>
 <pre><code class="hljs css language-bash"></code></pre>
 </blockquote>
 <p>--inputs topic1,topic2</p>
 <pre><code class="hljs">
-We can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic:
+You can open up another shell and use the [<span class="hljs-string">`pulsar-client`</span>](<span class="hljs-link">reference-cli-tools.md#pulsar-client</span>) tool to listen for messages on the output topic.
 
 <span class="hljs-code">```bash
 $ bin/pulsar-client consume persistent://public/default/exclamation-output \
@@ -123,27 +123,26 @@ $ bin/pulsar-client consume persistent://public/default/exclamation-output \
   --num-messages 0
 </span></code></pre>
 <blockquote>
-<p>Setting the <code>--num-messages</code> flag to 0 means that the consumer will listen on the topic indefinitely (rather than only accepting a certain number of messages).</p>
+<p>Setting the <code>--num-messages</code> flag to <code>0</code> means that consumers listen on the topic indefinitely, rather than only accepting a certain number of messages.</p>
 </blockquote>
-<p>With a listener up and running, we can open up another shell and produce a message on the input topic that we specified:</p>
+<p>With a listener up and running, you can open up another shell and produce a message on the input topic that you specify.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-client produce persistent://public/default/exclamation-input \
   --num-produce 1 \
   --messages <span class="hljs-string">"Hello world"</span>
 </code></pre>
-<p>In the output, you should see the following:</p>
+<p>When the message has been successfully processed by the exclamation function, you will see the following output. To shut down the function, press <strong>Ctrl+C</strong>.</p>
 <pre><code class="hljs">----- got message -----
 Hello world!
 </code></pre>
-<p>Success! As you can see, the message has been successfully processed by the exclamation function. To shut down the function, simply hit <strong>Ctrl+C</strong>.</p>
-<p>Here's what happened:</p>
+<h3><a class="anchor" aria-hidden="true" id="process-explanation"></a><a href="#process-explanation" 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.2 [...]
 <ul>
-<li>The <code>Hello world</code> message that we published to the input topic (<code>persistent://public/default/exclamation-input</code>) was passed to the exclamation function that we ran on our machine</li>
-<li>The exclamation function processed the message (providing a result of <code>Hello world!</code>) and published the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
-<li>If our exclamation function <em>hadn't</em> been running, Pulsar would have durably stored the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumed and acknowledged the message</li>
+<li>The <code>Hello world</code> message you publish to the input topic (<code>persistent://public/default/exclamation-input</code>) is passed to the exclamation function.</li>
+<li>The exclamation function processes the message (providing a result of <code>Hello world!</code>) and publishes the result to the output topic (<code>persistent://public/default/exclamation-output</code>).</li>
+<li>If the exclamation function <em>does not</em> run, Pulsar will durably store the message data published to the input topic in <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> until a consumer consumes and acknowledges the message.</li>
 </ul>
 <h2><a class="anchor" aria-hidden="true" id="run-a-pulsar-function-in-cluster-mode"></a><a href="#run-a-pulsar-function-in-cluster-mode" 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 [...]
-<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and experimentation, but if you want to use Pulsar Functions in a real Pulsar deployment, you'll want to run them in <strong>cluster mode</strong>. In this mode, Pulsar Functions run <em>inside</em> your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface that we've been using thus far.</p>
-<p>This command, for example, would deploy the same exclamation function we ran locally above <em>in our Pulsar cluster</em> (rather than outside it):</p>
+<p><a href="#run-a-pulsar-function-in-local-run-mode">Local run mode</a> is useful for development and test. However, when you use Pulsar for real deployment, you run it in <strong>cluster mode</strong>. In cluster mode, Pulsar Functions run <em>inside</em> of your Pulsar cluster and are managed using the same <a href="reference-pulsar-admin.md#functions"><code>pulsar-admin functions</code></a> interface.</p>
+<p>The following command deploys the same exclamation function you run locally in your Pulsar cluster, rather than outside of it.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -151,18 +150,18 @@ Hello world!
   --output persistent://public/default/exclamation-output \
   --name exclamation
 </code></pre>
-<p>You should see <code>Created successfully</code> in the output. Now, let's see a list of functions running in our cluster:</p>
+<p>You will see <code>Created successfully</code> in the output. Check the list of functions running in your cluster.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> list \
   --tenant public \
   --namespace default
 </code></pre>
-<p>We should see just the <code>exclamation</code> function listed there. We can also check the status of our deployed function using the <code>getstatus</code> command:</p>
+<p>You will see the <code>exclamation</code> function. Check the status of your deployed function using the <code>getstatus</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> getstatus \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"functionStatusList"</span>: [
     {
@@ -172,13 +171,13 @@ Hello world!
   ]
 }
 </code></pre>
-<p>As we can see, (a) the instance is currently running and (b) there is one instance, with an ID of 0, running. We can get other information about the function (topics, tenant, namespace, etc.) using the <code>get</code> command instead of <code>getstatus</code>:</p>
+<p>As you can see, the instance is currently running, and an instance with the ID of <code>0</code> is running. With the <code>get</code> command, you can get other information about the function, for example, topics, tenant, namespace, and so on.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> get \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>You should see this JSON output:</p>
+<p>You will see the following JSON output.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -192,7 +191,7 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">1</span>
 }
 </code></pre>
-<p>As we can see, the parallelism of the function is 1, meaning that only one instance of the function is running in our cluster. Let's update our function to a parallelism of 3 using the <code>update</code> command:</p>
+<p>As you can see, only one instance of the function is running in your cluster. Update the parallel functions to <code>3</code> using the <code>update</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> update \
   --jar examples/api-examples.jar \
   --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
@@ -203,7 +202,7 @@ Hello world!
   --name exclamation \
   --parallelism 3
 </code></pre>
-<p>You should see <code>Updated successfully</code> in the output. If you run the <code>get</code> command from above for the function, you can see that the parallelism has increased to 3, meaning that there are now three instances of the function running in our cluster:</p>
+<p>You will see <code>Updated successfully</code> in the output. If you enter the <code>get</code> command, you see that the parallel functions are increased to <code>3</code>, meaning that three instances of the function are running in your cluster.</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"public"</span>,
   <span class="hljs-attr">"namespace"</span>: <span class="hljs-string">"default"</span>,
@@ -217,32 +216,26 @@ Hello world!
   <span class="hljs-attr">"parallelism"</span>: <span class="hljs-number">3</span>
 }
 </code></pre>
-<p>Finally, we can shut down our running function using the <code>delete</code> command:</p>
+<p>Shut down the running function with the <code>delete</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> delete \
   --tenant public \
   --namespace default \
   --name exclamation
 </code></pre>
-<p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
-<h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" 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.5 [...]
-<blockquote>
-<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
-<pre><code class="hljs css language-bash"></code></pre>
-</blockquote>
-<p>$ pip install pulsar-client</p>
-<pre><code class="hljs">
-In <span class="hljs-keyword">the</span> <span class="hljs-keyword">above</span> examples, we ran <span class="hljs-keyword">and</span> managed a pre-written Pulsar Function <span class="hljs-keyword">and</span> saw how <span class="hljs-keyword">it</span> worked. To really <span class="hljs-keyword">get</span> our hands dirty, let's <span class="hljs-built_in">write</span> <span class="hljs-keyword">and</span> our own function <span class="hljs-keyword">from</span> scratch, using <span  [...]
-
-First, create a new Python <span class="hljs-built_in">file</span>:
-
-```bash
-$ touch <span class="hljs-built_in">reverse</span>.py
+<p>When you see <code>Deleted successfully</code> in the output, you've successfully run, updated, and shut down functions running in cluster mode.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-new-function"></a><a href="#write-and-run-a-new-function" 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 [...]
+<p>In order to write and run <a href="functions-api.md#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
+<pre><code class="hljs css language-bash">$ pip install pulsar-client
+</code></pre>
+<p>In the examples above, you run and manage pre-written Pulsar Functions and learn how they work. You can also write your own functions with Python API. In the following example, the function takes a string as input, reverses the string, and publishes the reversed string to the specified topic.</p>
+<p>First, create a new Python file.</p>
+<pre><code class="hljs css language-bash">$ touch reverse.py
 </code></pre>
-<p>In that file, add the following:</p>
+<p>Add the following information in the Python file.</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
-<p>Here, the <code>process</code> method defines the processing logic of the Pulsar Function. It simply uses some Python slice magic to reverse each incoming string. Now, we can deploy the function using <code>create</code>:</p>
+<p>The <code>process</code> method defines the processing logic of Pulsar Functions. It uses Python slice magic to reverse each incoming string. You can deploy the function using the <code>create</code> command.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --py reverse.py \
   --classname reverse \
@@ -252,30 +245,74 @@ $ touch <span class="hljs-built_in">reverse</span>.py
   --namespace default \
   --name reverse
 </code></pre>
-<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, we can <strong>trigger</strong> the function using the <a href="/docs/zh-CN/next/pulsar-admin#trigger"><code>trigger</code></a> command. This command will send a message that we specify to the function and also give us the function's output. 下面是一个示例:</p>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Because the function is running in cluster mode, you can <strong>trigger</strong> the function using the <a href="reference-pulsar-admin.md#trigger"><code>trigger</code></a> command. This command sends a message that you specify to the function and returns the function output. The following is an example.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger \
   --name reverse \
   --tenant public \
   --namespace default \
   --trigger-value <span class="hljs-string">"sdrawrof won si tub sdrawkcab saw gnirts sihT"</span>
 </code></pre>
-<p>You should get this output:</p>
+<p>You will get the following output.</p>
 <pre><code class="hljs">This string was backwards but is now forwards
 </code></pre>
-<p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
-<h2><a class="anchor" aria-hidden="true" id="packaging-python-dependencies"></a><a href="#packaging-python-dependencies" 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  [...]
-<p>For python functions requiring dependencies to be deployable in pulsar worker instances in an offline manner, we need to package the artifacts as below.</p>
-<h4><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Following programs are required to be installed on the client machine</p>
-<pre><code class="hljs">pip \\ rquired for getting python dependencies
+<p>You have created a new Pulsar Function, deployed it in your Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a>, and triggered the Function.</p>
+<h2><a class="anchor" aria-hidden="true" id="write-and-run-a-go-function"></a><a href="#write-and-run-a-go-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Go function depends on <code>pulsar-client-go</code>. Make sure that you have built <code>pulsar-client-go</code> before using Go function.</p>
+<p>To write and run a Go function, complete the following steps.</p>
+<ol>
+<li><p>Create a new Go file.</p>
+<p>touch helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Append a byte for messages from the input topic.<br>
+The following is a <code>helloFunc.go</code> example. Each message from the input topic is appended with a <code>110</code> byte, and then delivered to the output topic.</p>
+<p>package main</p>
+<p>import (
+&quot;context&quot;</p>
+<pre><code class="hljs"> &quot;github.com/apache/pulsar/pulsar-function-go/pf&quot;
+</code></pre>
+<p>)</p>
+<p>func HandleResponse(ctx context.Context, in []byte) ([]byte, error) {
+res := append(in, 110)
+return res, nil
+}</p>
+<p>func main() {
+pf.Start(HandleResponse)
+}</p></li>
+</ol>
+<ol>
+<li><p>Compile code.</p>
+<p>go build -o examplepulsar helloFunc.go</p></li>
+</ol>
+<ol>
+<li><p>Run Go function.</p>
+<p>$ bin/pulsar-admin functions create <br>
+--go examplepulsar <br>
+--inputs <a href="persistent://public/default/backwards">persistent://public/default/backwards</a> <br>
+--output <a href="persistent://public/default/forwards">persistent://public/default/forwards</a> <br>
+--tenant public <br>
+--namespace default <br>
+--name gofunc</p></li>
+</ol>
+<p>If you see <code>Created successfully</code>, the function is ready to accept incoming messages. Start a producer and produce messages to the <code>backwards</code> input topic. Start a consumer and consume messages from the <code>forwards</code> output topic, you will see <code>110</code> is appended to all messages.</p>
+<p>The <code>--classname</code> parameter is not specified when running Go function, because there is no <code>Class</code> concept in Go, which is different from Java and Python.</p>
+<blockquote>
+<p>Note<br>
+When you use the <code>--go</code> command to specify an executable file, make sure you have executable permissions.</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="package-python-dependencies"></a><a href="#package-python-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>When you deploy Python functions in a cluster offline, you need to package the required dependencies in a ZIP file before deployment.</p>
+<h3><a class="anchor" aria-hidden="true" id="client-requirements"></a><a href="#client-requirements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>The following programs are required to be installed on the client machine.</p>
+<pre><code class="hljs">pip \\ required for getting python dependencies
 zip \\ for building zip archives
 </code></pre>
-<h4><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
-<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the python function</p>
+<h3><a class="anchor" aria-hidden="true" id="python-dependencies"></a><a href="#python-dependencies" 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.2 [...]
+<p>A file named <strong>requirements.txt</strong> is needed with required dependencies for the Python function.</p>
 <pre><code class="hljs">sh==1.12.14
 </code></pre>
-<p>Prepare the pulsar function in folder called <strong>src</strong>.</p>
-<p>Run the following command to gather the python dependencies in the folder caller <strong>deps</strong></p>
+<p>Prepare the Pulsar Function in the <strong>src</strong> folder.</p>
+<p>Run the following command to gather Python dependencies in the <strong>deps</strong> folder.</p>
 <pre><code class="hljs">pip download \
 --only-binary :all: \
 --platform manylinux1_x86_64 \
@@ -283,15 +320,18 @@ zip \\ for building zip archives
 --implementation cp \
 --abi cp27m -r requirements.txt -d deps
 </code></pre>
-<p>Sample ouptut</p>
+<p>Sample output</p>
 <pre><code class="hljs">Collecting sh==1.12.14 (from -r requirements.txt (line 1))
   Using cached https://files.pythonhosted.org/packages/4a/22/17b22ef5b049f12080f5815c41bf94de3c229217609e469001a8f80c1b3d/sh-1.12.14-py2.py3-none-any.whl
   Saved ./deps/sh-1.12.14-py2.py3-none-any.whl
 Successfully downloaded sh
 </code></pre>
-<p><strong>Note</strong> pulsar-client is not needed as a dependency as it already installed in the worker node.</p>
-<h4><a class="anchor" aria-hidden="true" id="packaging"></a><a href="#packaging" 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>Create a destination folder with the desired pacaking name eg : <strong>exclamation</strong>, copy <strong>src</strong> and <strong>deps</strong> folder into it and finally compress the folder into a zip archive.</p>
+<blockquote>
+<p>Note<br>
+<code>pulsar-client</code> is not needed as a dependency as it has already installed in the worker node.</p>
+</blockquote>
+<h4><a class="anchor" aria-hidden="true" id="包"></a><a href="#包" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1 [...]
+<p>Create a destination folder with the desired package name, for example, <strong>exclamation</strong>. Copy the <strong>src</strong> and <strong>deps</strong> folders into it, and compress the folder into a ZIP archive.</p>
 <p>Sample sequence</p>
 <pre><code class="hljs">cp -R deps exclamation/
 cp -R src exclamation/
@@ -305,12 +345,8 @@ drwxr-xr-x   3 a.ahmed  staff   96 Nov  6 17:51 src
 
 zip -r exclamation.zip exclamation
 </code></pre>
-<p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
-<ul>
-<li><a href="/docs/zh-CN/next/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/zh-CN/next/functions-deploying">Deploying Pulsar Functions</a></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/zh-CN/next/functions-overview"><span class="arrow-prev">← </span><span>概述</span></a><a class="docs-next button" href="/docs/zh-CN/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#运行-pulsar-独立集群">运行 Pulsar 独立集群</a></li><li><a href="#在本地模式下运行 [...]
+<p>After package all the required dependencies into the <strong>exclamation.zip</strong> file, you can deploy functions in a Pulsar worker. The Pulsar worker does not need internet connectivity to download packages, because they are all included in the ZIP file.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/zh-CN/next/functions-overview"><span class="arrow-prev">← </span><span>概述</span></a><a class="docs-next button" href="/docs/zh-CN/next/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#运行-pulsar-独立集群">运行 Pulsar 独立集群</a></li><li><a href="#在本地模式下运行 [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/swagger/2.4.0-SNAPSHOT/swagger.json b/content/swagger/2.4.0-SNAPSHOT/swagger.json
index 5544f1a..81aa1cd 100644
--- a/content/swagger/2.4.0-SNAPSHOT/swagger.json
+++ b/content/swagger/2.4.0-SNAPSHOT/swagger.json
@@ -8522,21 +8522,12 @@
           "type" : "number",
           "format" : "double"
         },
-        "bandwidthIn" : {
-          "$ref" : "#/definitions/ResourceUsage"
-        },
-        "bandwidthOut" : {
-          "$ref" : "#/definitions/ResourceUsage"
-        },
         "memory" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
         "cpu" : {
           "$ref" : "#/definitions/ResourceUsage"
         },
-        "directMemory" : {
-          "$ref" : "#/definitions/ResourceUsage"
-        },
         "lastUpdate" : {
           "type" : "integer",
           "format" : "int64"
@@ -8549,14 +8540,23 @@
           "type" : "number",
           "format" : "double"
         },
-        "loadReportType" : {
-          "type" : "string"
+        "directMemory" : {
+          "$ref" : "#/definitions/ResourceUsage"
+        },
+        "bandwidthOut" : {
+          "$ref" : "#/definitions/ResourceUsage"
+        },
+        "bandwidthIn" : {
+          "$ref" : "#/definitions/ResourceUsage"
         },
         "underLoaded" : {
           "type" : "boolean"
         },
         "overLoaded" : {
           "type" : "boolean"
+        },
+        "loadReportType" : {
+          "type" : "string"
         }
       }
     },
@@ -9494,11 +9494,11 @@
     "ResourceUnit" : {
       "type" : "object",
       "properties" : {
-        "availableResource" : {
-          "$ref" : "#/definitions/ResourceDescription"
-        },
         "resourceId" : {
           "type" : "string"
+        },
+        "availableResource" : {
+          "$ref" : "#/definitions/ResourceDescription"
         }
       }
     },
diff --git a/content/swagger/2.4.0-SNAPSHOT/swaggerfunctions.json b/content/swagger/2.4.0-SNAPSHOT/swaggerfunctions.json
index 71722db..aace8fd 100644
--- a/content/swagger/2.4.0-SNAPSHOT/swaggerfunctions.json
+++ b/content/swagger/2.4.0-SNAPSHOT/swaggerfunctions.json
@@ -159,7 +159,7 @@
         }, {
           "in" : "body",
           "name" : "body",
-          "description" : "A JSON value presenting functions configuration payload. An example of the expected functions can be found here.  \nautoAck  \n  Whether or not the framework will automatically acknowledge messages.  \nruntime  \n  What is the runtime of the function. Possible Values: [JAVA, PYTHON, GO]  \nresources  \n  The size of the system resources allowed by the function runtime. The resources include: cpu, ram, disk.  \nclassName  \n  The class name of functions.  \ntena [...]
+          "description" : "A JSON value presenting functions configuration payload. An example of the expected functions can be found here.  \nautoAck  \n  Whether or not the framework will automatically acknowledge messages.  \nruntime  \n  What is the runtime of the function. Possible Values: [JAVA, PYTHON, GO]  \nresources  \n  The size of the system resources allowed by the function runtime. The resources include: cpu, ram, disk.  \nclassName  \n  The class name of functions.  \ncust [...]
           "required" : false,
           "schema" : {
             "type" : "string"
@@ -211,7 +211,7 @@
         }, {
           "in" : "body",
           "name" : "body",
-          "description" : "A JSON value presenting a functions config playload. An example of the expected functions can be found down here.  \nautoAck  \n  Whether or not the framework will automatically acknowledge messages.  \nruntime  \n  What is the runtime of the function. Possible Values: [JAVA, PYTHON, GO]  \nresources  \n  The size of the system resources allowed by the function runtime. The resources include: cpu, ram, disk.  \nclassName  \n  The class name of functions.  \nten [...]
+          "description" : "A JSON value presenting a functions config playload. An example of the expected functions can be found down here.  \nautoAck  \n  Whether or not the framework will automatically acknowledge messages.  \nruntime  \n  What is the runtime of the function. Possible Values: [JAVA, PYTHON, GO]  \nresources  \n  The size of the system resources allowed by the function runtime. The resources include: cpu, ram, disk.  \nclassName  \n  The class name of functions.  \ncus [...]
           "required" : false,
           "schema" : {
             "type" : "string"
@@ -1348,40 +1348,25 @@
     "Message" : {
       "type" : "object",
       "properties" : {
-        "keyBytes" : {
+        "orderingKey" : {
           "type" : "array",
           "items" : {
             "type" : "string",
             "format" : "byte"
           }
         },
-        "replicated" : {
-          "type" : "boolean"
-        },
-        "publishTime" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "eventTime" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "messageId" : {
-          "$ref" : "#/definitions/MessageId"
-        },
-        "sequenceId" : {
-          "type" : "integer",
-          "format" : "int64"
+        "encryptionCtx" : {
+          "$ref" : "#/definitions/EncryptionContext"
         },
-        "orderingKey" : {
+        "keyBytes" : {
           "type" : "array",
           "items" : {
             "type" : "string",
             "format" : "byte"
           }
         },
-        "encryptionCtx" : {
-          "$ref" : "#/definitions/EncryptionContext"
+        "messageId" : {
+          "$ref" : "#/definitions/MessageId"
         },
         "redeliveryCount" : {
           "type" : "integer",
@@ -1394,6 +1379,21 @@
             "format" : "byte"
           }
         },
+        "sequenceId" : {
+          "type" : "integer",
+          "format" : "int64"
+        },
+        "replicated" : {
+          "type" : "boolean"
+        },
+        "publishTime" : {
+          "type" : "integer",
+          "format" : "int64"
+        },
+        "eventTime" : {
+          "type" : "integer",
+          "format" : "int64"
+        },
         "topicName" : {
           "type" : "string"
         },
@@ -1447,10 +1447,12 @@
     "UpdateOptions" : {
       "type" : "object",
       "properties" : {
-        "updateAuthData" : {
-          "type" : "boolean"
+        "update-auth-data" : {
+          "type" : "boolean",
+          "description" : "Whether or not to update the auth data"
         }
-      }
+      },
+      "description" : "Options while updating the sink"
     },
     "WindowConfig" : {
       "type" : "object",
diff --git a/content/swagger/2.4.0-SNAPSHOT/swaggersink.json b/content/swagger/2.4.0-SNAPSHOT/swaggersink.json
index 1f93fb7..b7248ff 100644
--- a/content/swagger/2.4.0-SNAPSHOT/swaggersink.json
+++ b/content/swagger/2.4.0-SNAPSHOT/swaggersink.json
@@ -25,22 +25,13 @@
         "produces" : [ "application/json" ],
         "responses" : {
           "200" : {
-            "description" : "successful operation",
+            "description" : "Get builtin sinks successfully.",
             "schema" : {
               "type" : "array",
               "items" : {
                 "type" : "object"
               }
             }
-          },
-          "400" : {
-            "description" : "Invalid request"
-          },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "408" : {
-            "description" : "Request timeout"
           }
         }
       }
@@ -56,11 +47,13 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         } ],
@@ -72,10 +65,16 @@
             }
           },
           "400" : {
-            "description" : "Invalid request"
+            "description" : "Invalid list request"
+          },
+          "401" : {
+            "description" : "The client is not authorized to perform this operation"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "500" : {
+            "description" : "Internal server error (failed to authorize, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -91,16 +90,19 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
         } ],
@@ -114,14 +116,11 @@
           "400" : {
             "description" : "Invalid request"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
           "404" : {
-            "description" : "The function doesn't exist"
+            "description" : "The sink does not exist"
           },
-          "408" : {
-            "description" : "Request timeout"
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       },
@@ -135,31 +134,48 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
+        }, {
+          "in" : "body",
+          "name" : "body",
+          "description" : "A JSON value presenting a sink config playload. All available configuration options are:  \nclassname  \n   The sink's class name if archive is file-url-path (file://)  \nsourceSubscriptionName  \n   Pulsar source subscription name if user wants a specific  \n   subscription-name for input-topic consumer  \ninputs  \n   The sink's input topic or topics (specified as a JSON array)  \ntopicsPattern  \n   TopicsPattern to consume from list of topics under a namesp [...]
+          "required" : false,
+          "schema" : {
+            "type" : "string"
+          },
+          "x-examples" : {
+            "application/json" : "{  \n\t\"classname\": \"org.example.MySinkTest\",\n\t\"inputs\": [\"persistent://public/default/sink-input\"],\n\t\"processingGuarantees\": \"EFFECTIVELY_ONCE\",\n\t\"parallelism\": 10\n}"
+          }
         } ],
         "responses" : {
           "200" : {
-            "description" : "Pulsar Function successfully created"
+            "description" : "Pulsar Sink successfully created"
           },
           "400" : {
-            "description" : "Invalid request (function already exists, etc.)"
+            "description" : "Invalid request (sink already exists, etc.)"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "401" : {
+            "description" : "Client is not authorized to perform operation"
           },
-          "408" : {
-            "description" : "Request timeout"
+          "500" : {
+            "description" : "Internal server error (failed to authorize, failed to get tenant data, failed to process package, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       },
@@ -173,28 +189,58 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
+        }, {
+          "in" : "body",
+          "name" : "body",
+          "description" : "A JSON value presenting a sink config playload. All available configuration options are:  \nclassname  \n   The sink's class name if archive is file-url-path (file://)  \nsourceSubscriptionName  \n   Pulsar source subscription name if user wants a specific  \n   subscription-name for input-topic consumer  \ninputs  \n   The sink's input topic or topics (specified as a JSON array)  \ntopicsPattern  \n   TopicsPattern to consume from list of topics under a namesp [...]
+          "required" : false,
+          "schema" : {
+            "type" : "string"
+          },
+          "x-examples" : {
+            "application/json" : "{  \n\t\"classname\": \"org.example.SinkStressTest\",  \n\t\"inputs\": [\"persistent://public/default/sink-input\"],\n\t\"processingGuarantees\": \"EFFECTIVELY_ONCE\",\n\t\"parallelism\": 5\n}"
+          }
+        }, {
+          "in" : "body",
+          "name" : "body",
+          "required" : false,
+          "schema" : {
+            "$ref" : "#/definitions/UpdateOptions"
+          }
         } ],
         "responses" : {
           "200" : {
-            "description" : "Pulsar Function successfully updated"
+            "description" : "Pulsar Sink successfully updated"
           },
           "400" : {
-            "description" : "Invalid request (function doesn't exist, etc.)"
+            "description" : "Invalid request (sink doesn't exist, update contains no change, etc.)"
+          },
+          "401" : {
+            "description" : "Client is not authorized to perform operation"
+          },
+          "404" : {
+            "description" : "The sink does not exist"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "500" : {
+            "description" : "Internal server error (failed to authorize, failed to process package, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       },
@@ -208,34 +254,43 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
         } ],
         "responses" : {
           "200" : {
-            "description" : "The function was successfully deleted"
+            "description" : "The sink was successfully deleted"
           },
           "400" : {
-            "description" : "Invalid request"
+            "description" : "Invalid deregister request"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "401" : {
+            "description" : "Client is not authorized to perform operation"
           },
           "404" : {
-            "description" : "The function doesn't exist"
+            "description" : "The sink does not exist"
           },
           "408" : {
-            "description" : "Request timeout"
+            "description" : "Got InterruptedException while deregistering the sink"
+          },
+          "500" : {
+            "description" : "Internal server error (failed to authorize, failed to deregister, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -251,28 +306,37 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
         } ],
         "responses" : {
           "400" : {
-            "description" : "Invalid request"
+            "description" : "Invalid restart request"
+          },
+          "401" : {
+            "description" : "The client is not authorized to perform this operation"
           },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "The sink does not exist"
           },
           "500" : {
-            "description" : "Internal server error"
+            "description" : "Internal server error (failed to restart the sink, failed to authorize, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -288,28 +352,37 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
         } ],
         "responses" : {
           "400" : {
-            "description" : "Invalid request"
+            "description" : "Invalid start request"
+          },
+          "401" : {
+            "description" : "The client is not authorized to perform this operation"
           },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "The sink does not exist"
           },
           "500" : {
-            "description" : "Internal server error"
+            "description" : "Internal server error (failed to start the sink, failed to authorize, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -325,16 +398,19 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
         } ],
@@ -346,13 +422,16 @@
             }
           },
           "400" : {
-            "description" : "Invalid request"
+            "description" : "Invalid get status request"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "401" : {
+            "description" : "The client is not authorized to perform this operation"
           },
           "404" : {
-            "description" : "The sink doesn't exist"
+            "description" : "The sink does not exist"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -368,28 +447,37 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
         } ],
         "responses" : {
           "400" : {
-            "description" : "Invalid request"
+            "description" : "Invalid stop request"
+          },
+          "401" : {
+            "description" : "The client is not authorized to perform this operation"
           },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "The sink does not exist"
           },
           "500" : {
-            "description" : "Internal server error"
+            "description" : "Internal server error (failed to stop the sink, failed to authorize, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -405,33 +493,43 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "instanceId",
           "in" : "path",
+          "description" : "The sink instanceId",
           "required" : true,
           "type" : "string"
         } ],
         "responses" : {
           "400" : {
-            "description" : "Invalid request"
+            "description" : "Invalid restart request"
+          },
+          "401" : {
+            "description" : "The client is not authorized to perform this operation"
           },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "The sink does not exist"
           },
           "500" : {
-            "description" : "Internal server error"
+            "description" : "Internal server error (failed to restart the sink instance, failed to authorize, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -447,33 +545,43 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "instanceId",
           "in" : "path",
+          "description" : "The sink instanceId",
           "required" : true,
           "type" : "string"
         } ],
         "responses" : {
           "400" : {
-            "description" : "Invalid request"
+            "description" : "Invalid start request"
+          },
+          "401" : {
+            "description" : "The client is not authorized to perform this operation"
           },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "The sink does not exist"
           },
           "500" : {
-            "description" : "Internal server error"
+            "description" : "Internal server error (failed to start the sink, failed to authorize, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -489,21 +597,25 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "instanceId",
           "in" : "path",
+          "description" : "The sink instanceId",
           "required" : true,
           "type" : "string"
         } ],
@@ -515,13 +627,16 @@
             }
           },
           "400" : {
-            "description" : "Invalid request"
-          },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+            "description" : "The sink instance does not exist"
           },
           "404" : {
-            "description" : "The sink doesn't exist"
+            "description" : "The sink does not exist"
+          },
+          "500" : {
+            "description" : "Internal Server Error (got exception while getting status, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -537,33 +652,43 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The sink's tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The sink's namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sinkName",
           "in" : "path",
+          "description" : "The sink's name",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "instanceId",
           "in" : "path",
+          "description" : "The sink instanceId",
           "required" : true,
           "type" : "string"
         } ],
         "responses" : {
           "400" : {
-            "description" : "Invalid request"
+            "description" : "Invalid stop request"
+          },
+          "401" : {
+            "description" : "The client is not authorized to perform this operation"
           },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "The sink instance does not exist"
           },
           "500" : {
-            "description" : "Internal server error"
+            "description" : "Internal server error (failed to stop the sink, failed to authorize, etc.)"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -786,6 +911,16 @@
           }
         }
       }
+    },
+    "UpdateOptions" : {
+      "type" : "object",
+      "properties" : {
+        "update-auth-data" : {
+          "type" : "boolean",
+          "description" : "Whether or not to update the auth data"
+        }
+      },
+      "description" : "Options while updating the sink"
     }
   }
 }
\ No newline at end of file
diff --git a/content/swagger/2.4.0-SNAPSHOT/swaggersource.json b/content/swagger/2.4.0-SNAPSHOT/swaggersource.json
index 3e0f658..d8c8a17 100644
--- a/content/swagger/2.4.0-SNAPSHOT/swaggersource.json
+++ b/content/swagger/2.4.0-SNAPSHOT/swaggersource.json
@@ -41,6 +41,9 @@
           },
           "408" : {
             "description" : "Request timeout"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -56,11 +59,13 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         } ],
@@ -74,8 +79,14 @@
           "400" : {
             "description" : "Invalid request"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "401" : {
+            "description" : "Client is not authorize to perform operation"
+          },
+          "500" : {
+            "description" : "Internal Server Error"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -91,16 +102,19 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of name",
           "required" : true,
           "type" : "string"
         } ],
@@ -114,14 +128,11 @@
           "400" : {
             "description" : "Invalid request"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
           "404" : {
-            "description" : "The function doesn't exist"
+            "description" : "Not Found(The source doesn't exist)"
           },
-          "408" : {
-            "description" : "Request timeout"
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       },
@@ -135,31 +146,48 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of source",
           "required" : true,
           "type" : "string"
+        }, {
+          "in" : "body",
+          "name" : "body",
+          "description" : "A JSON value presenting source configuration payload. An example of the expected functions can be found here.  \nclassname  \n  The source's class name if archive is file-url-path (file://).  \ntopicName  \n  The Pulsar topic to which data is sent.  \nserdeClassName  \n  The SerDe classname for the source.  \nschemaType  \n  The schema type (either a builtin schema like 'avro', 'json', etc.. or    custom Schema class name to be used to encode messages emitted f [...]
+          "required" : false,
+          "schema" : {
+            "type" : "string"
+          },
+          "x-examples" : {
+            "application/json" : "{\n  \"tenant\": public\n  \"namespace\": default\n  \"name\": pulsar-io-mysql\n  \"className\": TestSourceMysql\n  \"topicName\": pulsar-io-mysql\n  \"parallelism\": 1\n  \"archive\": /connectors/pulsar-io-mysql-0.0.1.nar\n  \"schemaType\": avro\n}"
+          }
         } ],
         "responses" : {
           "200" : {
             "description" : "Pulsar Function successfully created"
           },
           "400" : {
-            "description" : "Invalid request (function already exists, etc.)"
+            "description" : "Invalid request (Function already exists or Tenant, Namespace or Name is not provided, etc.)"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "401" : {
+            "description" : "Client is not authorize to perform operation"
           },
-          "408" : {
-            "description" : "Request timeout"
+          "500" : {
+            "description" : "Internal Server Error"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       },
@@ -173,28 +201,54 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of source",
           "required" : true,
           "type" : "string"
+        }, {
+          "in" : "body",
+          "name" : "body",
+          "description" : "A JSON value presenting source configuration payload. An example of the expected functions can be found here.  \nclassname  \n  The source's class name if archive is file-url-path (file://).  \ntopicName  \n  The Pulsar topic to which data is sent.  \nserdeClassName  \n  The SerDe classname for the source.  \nschemaType  \n  The schema type (either a builtin schema like 'avro', 'json', etc.. or    custom Schema class name to be used to encode messages emitted f [...]
+          "required" : false,
+          "schema" : {
+            "type" : "string"
+          },
+          "x-examples" : {
+            "application/json" : "{\n  \"tenant\": public\n  \"namespace\": default\n  \"name\": pulsar-io-mysql\n  \"className\": TestSourceMysql\n  \"topicName\": pulsar-io-mysql\n  \"parallelism\": 1\n  \"archive\": /connectors/pulsar-io-mysql-0.0.1.nar\n  \"schemaType\": avro\n}"
+          }
         } ],
         "responses" : {
           "200" : {
             "description" : "Pulsar Function successfully updated"
           },
           "400" : {
-            "description" : "Invalid request (function doesn't exist, etc.)"
+            "description" : "Invalid request (Function already exists or Tenant, Namespace or Name is not provided, etc.)"
+          },
+          "401" : {
+            "description" : "Client is not authorize to perform operation"
           },
           "403" : {
             "description" : "The requester doesn't have admin permissions"
+          },
+          "404" : {
+            "description" : "Not Found(The source doesn't exist)"
+          },
+          "500" : {
+            "description" : "Internal Server Error"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       },
@@ -208,16 +262,19 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of name",
           "required" : true,
           "type" : "string"
         } ],
@@ -228,14 +285,20 @@
           "400" : {
             "description" : "Invalid request"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "401" : {
+            "description" : "Client is not authorize to perform operation"
           },
           "404" : {
-            "description" : "The function doesn't exist"
+            "description" : "Not Found(The source doesn't exist)"
           },
           "408" : {
             "description" : "Request timeout"
+          },
+          "500" : {
+            "description" : "Internal Server Error"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -251,16 +314,19 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of name",
           "required" : true,
           "type" : "string"
         } ],
@@ -268,11 +334,17 @@
           "400" : {
             "description" : "Invalid request"
           },
+          "401" : {
+            "description" : "Client is not authorize to perform operation"
+          },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "Not Found(The source doesn't exist)"
           },
           "500" : {
             "description" : "Internal server error"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -288,16 +360,19 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of name",
           "required" : true,
           "type" : "string"
         } ],
@@ -305,11 +380,17 @@
           "400" : {
             "description" : "Invalid request"
           },
+          "401" : {
+            "description" : "Client is not authorize to perform operation"
+          },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "Not Found(The source doesn't exist)"
           },
           "500" : {
             "description" : "Internal server error"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -325,16 +406,19 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of name",
           "required" : true,
           "type" : "string"
         } ],
@@ -345,14 +429,11 @@
               "$ref" : "#/definitions/SourceStatus"
             }
           },
-          "400" : {
-            "description" : "Invalid request"
-          },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "500" : {
+            "description" : "Internal Server Error"
           },
-          "404" : {
-            "description" : "The source doesn't exist"
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -368,16 +449,19 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of name",
           "required" : true,
           "type" : "string"
         } ],
@@ -385,11 +469,17 @@
           "400" : {
             "description" : "Invalid request"
           },
+          "401" : {
+            "description" : "Client is not authorize to perform operation"
+          },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "Not Found(The source doesn't exist)"
           },
           "500" : {
             "description" : "Internal server error"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -405,21 +495,25 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of name",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "instanceId",
           "in" : "path",
+          "description" : "The source instanceId (if instance-id is not provided, the stats of all instances is returned).",
           "required" : true,
           "type" : "string"
         } ],
@@ -427,11 +521,17 @@
           "400" : {
             "description" : "Invalid request"
           },
+          "401" : {
+            "description" : "Client is not authorize to perform operation"
+          },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "Not Found(The source doesn't exist)"
           },
           "500" : {
             "description" : "Internal server error"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -447,21 +547,25 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of name",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "instanceId",
           "in" : "path",
+          "description" : "The source instanceId (if instance-id is not provided, the stats of all instances is returned).",
           "required" : true,
           "type" : "string"
         } ],
@@ -469,11 +573,17 @@
           "400" : {
             "description" : "Invalid request"
           },
+          "401" : {
+            "description" : "Client is not authorize to perform operation"
+          },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "Not Found(The source doesn't exist)"
           },
           "500" : {
             "description" : "Internal server error"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -489,21 +599,25 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of name",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "instanceId",
           "in" : "path",
+          "description" : "The source instanceId (if instance-id is not provided, the stats of all instances is returned).",
           "required" : true,
           "type" : "string"
         } ],
@@ -514,14 +628,11 @@
               "$ref" : "#/definitions/SourceInstanceStatusData"
             }
           },
-          "400" : {
-            "description" : "Invalid request"
-          },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "500" : {
+            "description" : "Internal Server Error"
           },
-          "404" : {
-            "description" : "The source doesn't exist"
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }
@@ -537,21 +648,25 @@
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
+          "description" : "The name of tenant",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "namespace",
           "in" : "path",
+          "description" : "The name of namespace",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "sourceName",
           "in" : "path",
+          "description" : "The name of name",
           "required" : true,
           "type" : "string"
         }, {
           "name" : "instanceId",
           "in" : "path",
+          "description" : "The source instanceId (if instance-id is not provided, the stats of all instances is returned).",
           "required" : true,
           "type" : "string"
         } ],
@@ -559,11 +674,17 @@
           "400" : {
             "description" : "Invalid request"
           },
+          "401" : {
+            "description" : "Client is not authorize to perform operation"
+          },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "Not Found(The source doesn't exist)"
           },
           "500" : {
             "description" : "Internal server error"
+          },
+          "503" : {
+            "description" : "Function worker service is now initializing. Please try again later."
           }
         }
       }