You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tubemq.apache.org by gi...@apache.org on 2020/05/29 08:30:24 UTC

[incubator-tubemq-website] branch asf-site updated: Automated deployment: Fri May 29 08:30:05 UTC 2020 3ea81a3c240c789d21502c89da98ac2f4c65e5b8

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

github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/incubator-tubemq-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 0c500a9  Automated deployment: Fri May 29 08:30:05 UTC 2020 3ea81a3c240c789d21502c89da98ac2f4c65e5b8
0c500a9 is described below

commit 0c500a97c7ef29c12d67a7cdd22714df906f2e9d
Author: wf123537200 <wf...@users.noreply.github.com>
AuthorDate: Fri May 29 08:30:05 2020 +0000

    Automated deployment: Fri May 29 08:30:05 UTC 2020 3ea81a3c240c789d21502c89da98ac2f4c65e5b8
---
 build/documentation.js                             |   2 +-
 docs/en-us/architecture.md                         |  26 +++
 docs/en-us/consumer_example.md                     |  96 +++++++++
 docs/en-us/contact.md                              |  26 +--
 docs/en-us/contribution.md                         |  19 +-
 docs/en-us/deployment.md                           | 161 +++++++++++++++
 docs/en-us/producer_example.md                     | 148 +++++++++++++
 docs/en-us/quick_start.md                          | 230 +++++++++++++++++++++
 docs/zh-cn/architecture.md                         |  26 +++
 docs/zh-cn/consumer_example.md                     |  96 +++++++++
 docs/zh-cn/contact.md                              |  26 +--
 docs/zh-cn/contribution.md                         |  19 +-
 docs/zh-cn/deployment.md                           | 161 +++++++++++++++
 docs/zh-cn/producer_example.md                     | 148 +++++++++++++
 docs/zh-cn/quick_start.md                          | 230 +++++++++++++++++++++
 en-us/docs/architecture.html                       |  60 ++++++
 en-us/docs/architecture.json                       |   6 +
 en-us/docs/consumer_example.html                   | 120 +++++++++++
 en-us/docs/consumer_example.json                   |   6 +
 en-us/docs/contact.html                            |  26 +--
 en-us/docs/contact.json                            |   2 +-
 en-us/docs/contribution.html                       |  18 +-
 en-us/docs/contribution.json                       |   2 +-
 ...mq_config_introduction.html => deployment.html} |  53 ++++-
 en-us/docs/deployment.json                         |   6 +
 en-us/docs/http_access_API_definition.html         |   2 +-
 en-us/docs/producer_example.html                   | 178 ++++++++++++++++
 en-us/docs/producer_example.json                   |   6 +
 .../{tubemq_user_guide.html => quick_start.html}   |  40 +---
 en-us/docs/quick_start.json                        |   6 +
 en-us/docs/tubemq_basic_introduction_cn.html       |   2 +-
 en-us/docs/tubemq_clients_cn.html                  |   2 +-
 en-us/docs/tubemq_config_introduction.html         |   2 +-
 en-us/docs/tubemq_console_introduction_cn.html     |   2 +-
 .../docs/tubemq_error_status_introduction_cn.html  |   2 +-
 en-us/docs/tubemq_perf_test_vs_Kafka_cn.html       |   2 +-
 en-us/docs/tubemq_user_guide.html                  |   2 +-
 zh-cn/docs/architecture.html                       |  60 ++++++
 zh-cn/docs/architecture.json                       |   6 +
 zh-cn/docs/consumer_example.html                   | 120 +++++++++++
 zh-cn/docs/consumer_example.json                   |   6 +
 zh-cn/docs/contact.html                            |  26 +--
 zh-cn/docs/contact.json                            |   2 +-
 zh-cn/docs/contribution.html                       |  18 +-
 zh-cn/docs/contribution.json                       |   2 +-
 ...mq_config_introduction.html => deployment.html} |  53 ++++-
 zh-cn/docs/deployment.json                         |   6 +
 zh-cn/docs/http_access_API_definition.html         |   2 +-
 zh-cn/docs/producer_example.html                   | 178 ++++++++++++++++
 zh-cn/docs/producer_example.json                   |   6 +
 .../{tubemq_user_guide.html => quick_start.html}   |  60 ++----
 zh-cn/docs/quick_start.json                        |   6 +
 zh-cn/docs/tubemq_basic_introduction_cn.html       |   2 +-
 zh-cn/docs/tubemq_clients_cn.html                  |   2 +-
 zh-cn/docs/tubemq_config_introduction.html         |   2 +-
 zh-cn/docs/tubemq_console_introduction_cn.html     |   2 +-
 .../docs/tubemq_error_status_introduction_cn.html  |   2 +-
 zh-cn/docs/tubemq_perf_test_vs_Kafka_cn.html       |   2 +-
 zh-cn/docs/tubemq_user_guide.html                  |   2 +-
 59 files changed, 2309 insertions(+), 215 deletions(-)

diff --git a/build/documentation.js b/build/documentation.js
index 439e68e..87c1766 100644
--- a/build/documentation.js
+++ b/build/documentation.js
@@ -32,4 +32,4 @@ Object.defineProperty(t,"__esModule",{value:!0});var i="function"==typeof Symbol
  * Copyright © 2012-2019 Faisal Salman <f...@faisalman.com>
  * Licensed under MIT License
  */
-return"string"==typeof e?e.replace(/[^\d\.]/g,"").split(".")[0]:void 0},trim:function(e){return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}},m={rgx:function(e,t){for(var n,r,o,i,a,c,s=0;s<t.length&&!a;){var l=t[s],u=t[s+1];for(n=r=0;n<l.length&&!a;)if(a=l[n++].exec(e))for(o=0;o<u.length;o++)c=a[++r],i=u[o],"object"==typeof i&&i.length>0?2==i.length?"function"==typeof i[1]?this[i[0]]=i[1].call(this,c):this[i[0]]=i[1]:3==i.length?"function"!=typeof i[1]||i[1].exec&&i[1].test?this[i [...]
\ No newline at end of file
+return"string"==typeof e?e.replace(/[^\d\.]/g,"").split(".")[0]:void 0},trim:function(e){return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}},m={rgx:function(e,t){for(var n,r,o,i,a,c,s=0;s<t.length&&!a;){var l=t[s],u=t[s+1];for(n=r=0;n<l.length&&!a;)if(a=l[n++].exec(e))for(o=0;o<u.length;o++)c=a[++r],i=u[o],"object"==typeof i&&i.length>0?2==i.length?"function"==typeof i[1]?this[i[0]]=i[1].call(this,c):this[i[0]]=i[1]:3==i.length?"function"!=typeof i[1]||i[1].exec&&i[1].test?this[i [...]
\ No newline at end of file
diff --git a/docs/en-us/architecture.md b/docs/en-us/architecture.md
new file mode 100644
index 0000000..7f0e3de
--- /dev/null
+++ b/docs/en-us/architecture.md
@@ -0,0 +1,26 @@
+## TubeMQ Architecture: ##
+After years of evolution, the TubeMQ cluster is divided into the following 5 parts: 
+![](img/sys_structure.png)
+
+- **Portal:** The Portal part responsible for external interaction and maintenance operations, including API and Web. The API connects to the management system outside the cluster. The Web is a page encapsulation of daily operation and maintenance functions based on the API;
+
+- **Master:** It is responsible for the Control part of the cluster. This part is composed of one or more Master nodes. Master HA performs heartbeat keep-alive and real-time hot standby switching between master nodes (This is the reason why everyone needs to fill in the addresses of all Master nodes corresponding to the cluster when using TubeMQ Lib). The main master is responsible for managing the status of the entire cluster, resource scheduling, permission checking, metadata query, etc;
+
+- **Broker:** The Store part responsible for data storage. This part is composed of independent Broker nodes. Each Broker node manages the Topic set in this node, including the addition, deletion, modification, and inquiring about Topics. It is also responsible for message storage, consumption, aging, partition expansion, data consumption offset records, etc. on the topic, and the external capabilities of the cluster, including the number of topics, throughput, and capacity, are complete [...]
+
+- **Client:** The Client part responsible for data production and consumption. We provide this part in the form of Lib. The most commonly used is the consumer. Compared with the previous, the consumer now supports Push and Pull data pull modes, data consumption behavior support both order and filtered consumption. For the Pull consumption mode, the service supports resetting the precise offset through the client to support the business extract-once consumption. At the same time, the cons [...]
+
+- **Zookeeper:** Responsible for the zk part of the offset storage. This part of the function has been weakened to only the persistent storage of the offset. Considering the next multi-node copy function, this module is temporarily reserved;
+
+## Broker File Storage Scheme Improvement: ##
+Systems that use disk as a medium for data persistence are faced with a variety of performance issues caused by disk problems,TubeMQ is no exception. Performance improvements are largely addressed to solve the problem of how message data is read, write and stored. In this respect, TubeMQ has made some improvements:
+
+1. **File structure and organization adjustment:** TubeMQ's disk storage scheme is similar to Kafka, but not the same, as the figure shown below. Storage instance is consisted of an index file and a data file, each topic can allocate one or more storage instances. And each topic separately maintains the mechanisms of managing storage instances, including aging cycles, number of partitions, whether readable or writable, etc.
+![](img/store_file.png)
+
+2. **Memory block cache:** We add an additional memory cache block for each storage instance based on the file storage, i.e. add a piece of memory to the original write disk to isolate the slow impact of hard disk. The data is brushed into memory first, and the memory control block then brushes the data to disk files in bulk.
+![](img/store_mem.png)
+
+3. **SSD Auxiliary Storage:** For servers with SSD hardware in addition to disk storage, we have made a layer of SSD secondary storage, which is different from the common practice that external systems save data to SSD first, and then transfer data from SSD to disk: according to our analysis, for normal sequential disk accesses, the performance is sufficient to meet the needs of data persistence. When disk IO is up to 100%, the performance degradation is mainly due to lagged consumption, [...]
+![](img/store_ssd.png)
+
diff --git a/docs/en-us/consumer_example.md b/docs/en-us/consumer_example.md
new file mode 100644
index 0000000..62236a1
--- /dev/null
+++ b/docs/en-us/consumer_example.md
@@ -0,0 +1,96 @@
+## Consumer Example
+  TubeMQ provides two ways to consumer message, PullConsumer and PushConsumer:
+
+1. PullConsumer 
+   ```
+   public class PullConsumerExample {
+   
+       public static void main(String[] args) throws Throwable {
+           final String localHostIP = "127.0.0.1";
+           final String masterHostAndPort = "localhost:8000";
+           final String topic = "test";
+           final String group = "test-group";
+           final ConsumerConfig consumerConfig = new ConsumerConfig(localHostIP, masterHostAndPort, group);
+           /* consumeModel
+            *  Set the start position of the consumer group. The value can be [-1, 0, 1]. Default value is 0.
+            * -1: Start from 0 for the first time. Otherwise start from last consume position.
+            *  0: Start from the latest position for the first time. Otherwise start from last consume position.
+            *  1: Start from the latest consume position.
+           */
+           consumerConfig.setConsumeModel(0);
+           final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(consumerConfig);
+           final PullMessageConsumer messagePullConsumer = messageSessionFactory.createPullConsumer(consumerConfig);
+           messagePullConsumer.subscribe(topic, null);
+           messagePullConsumer.completeSubscribe();
+           // wait for client to join the exact consumer queue that consumer group allocated
+           while (!messagePullConsumer.isPartitionsReady(1000)) {
+               ThreadUtils.sleep(1000);
+           }
+           while(true){
+               ConsumerResult result = messagePullConsumer.getMessage();
+               if (result.isSuccess()) {
+                   List<Message> messageList = result.getMessageList();
+                   for (Message message : messageList) {
+                       System.out.println("received message : " + message);
+                   }
+                   messagePullConsumer.confirmConsume(result.getConfirmContext(), true);
+               } else{
+                   if (result.getErrCode() == 400) {
+                       ThreadUtils.sleep(100);
+                   } else {
+                       if (result.getErrCode() != 404) {
+                           System.out.println(String.format("Receive messages errorCode is %d, Error message is %s", result.getErrCode(), result.getErrMsg()));
+                       }
+                   }
+               }
+           }
+       }
+   }
+   ``` 
+   
+2. PushConsumer
+   ```
+   public class PushConsumerExample {
+   
+       public static void main(String[] args) throws Throwable {
+           final String localHostIP = "127.0.0.1";
+           final String masterHostAndPort = "localhost:8000";
+           final String topic = "test";
+           final String group = "test-group";
+           final ConsumerConfig consumerConfig = new ConsumerConfig(localHostIP, masterHostAndPort, group);
+           /* consumeModel
+            *  Set the start position of the consumer group. The value can be [-1, 0, 1]. Default value is 0.
+            * -1: Start from 0 for the first time. Otherwise start from last consume position.
+            *  0: Start from the latest position for the first time. Otherwise start from last consume position.
+            *  1: Start from the latest consume position.
+           */
+           consumerConfig.setConsumeModel(0);
+           final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(consumerConfig);
+           final PushMessageConsumer pushConsumer = messageSessionFactory.createPushConsumer(consumerConfig);
+           pushConsumer.subscribe(topic, null, new MessageListener() {
+   
+               @Override
+               public void receiveMessages(List<Message> messages) throws InterruptedException {
+                   for (Message message : messages) {
+                       System.out.println("received message : " + new String(message.getData()));
+                   }
+               }
+   
+               @Override
+               public Executor getExecutor() {
+                   return null;
+               }
+   
+               @Override
+               public void stop() {
+                   //
+               }
+           });
+           pushConsumer.completeSubscribe();
+           CountDownLatch latch = new CountDownLatch(1);
+           latch.await(10, TimeUnit.MINUTES);
+       }
+   }
+   ```
+
+
diff --git a/docs/en-us/contact.md b/docs/en-us/contact.md
index aae87de..d605c82 100644
--- a/docs/en-us/contact.md
+++ b/docs/en-us/contact.md
@@ -1,28 +1,16 @@
-Apache TubeMQ
-==============================================
-[![Build Status](https://travis-ci.org/apache/incubator-tubemq.svg?branch=master)](https://travis-ci.org/apache/incubator-tubemq)
-
-Apache TubeMQ (incubating) is a trillion-records-scale distributed messaging queue (MQ) system, focuses on data transmission and storage under massive data. Compared to many open source MQ projects, TubeMQ has unique advantages in terms of stability, performance, and low cost.
-
-
-Contact
+Contact us
 -------
 
-
 - Mailing lists
 
-| Name                                                                          | Scope                           |                                                                 |                                                                     |                                                                              |
-|:------------------------------------------------------------------------------|:--------------------------------|:----------------------------------------------------------------|:--------------------------------------------------------------------|:-----------------------------------------------------------------------------|
-| [dev@tubemq.apache.org](mailto:dev@tubemq.apache.org)     | Development-related discussions | [Subscribe](mailto:dev-subscribe@tubemq.apache.org)   | [Unsubscribe](mailto:dev-unsubscribe@tubemq.apache.org)   | [Archives](http://mail-archives.apache.org/mod_mbox/tubemq-dev/)   |
+    | Name                                                                          | Scope                           |                                                                 |                                                                     |                                                                              |
+    |:------------------------------------------------------------------------------|:--------------------------------|:----------------------------------------------------------------|:--------------------------------------------------------------------|:-----------------------------------------------------------------------------|
+    | [dev@tubemq.apache.org](mailto:dev@tubemq.apache.org)     | Development-related discussions | [Subscribe](mailto:dev-subscribe@tubemq.apache.org)   | [Unsubscribe](mailto:dev-unsubscribe@tubemq.apache.org)   | [Archives](http://mail-archives.apache.org/mod_mbox/tubemq-dev/)   |
 
+- Home page: https://tubemq.apache.org
+- Docs: https://tubemq.apache.org/en-us/docs/tubemq_user_guide.html
+- Issues: https://issues.apache.org/jira/browse/TubeMQ
 
-- Issue management
-  [See JIRA](https://issues.apache.org/jira/browse/TubeMQ)
-
-
-Build and Deploy
--------
-- [See user guide](./tubemq_user_guide.md)
 
 
 License
diff --git a/docs/en-us/contribution.md b/docs/en-us/contribution.md
index 64ec4ed..5f46e0e 100644
--- a/docs/en-us/contribution.md
+++ b/docs/en-us/contribution.md
@@ -40,14 +40,6 @@ To avoid potential frustration during the code review cycle, we encourage you to
 
 We are using "TubeMQ Improvement Proposals" for managing major changes to TubeMQ. The list of all proposals is maintained in the TubeMQ wiki at [this page](https://cwiki.apache.org/confluence/display/TUBEMQ/TubeMQ+Improvement+Proposals).
 
-## Code
-
-TBD
-
-## Review
-
-TBD
-
 ## Commit (committers only)
 
 Once the code has been peer reviewed by a committer, the next step is for the committer to merge it into the Github repo.
@@ -56,3 +48,14 @@ Pull requests should not be merged before the review has approved from at least
 
 For more about merging pull request, please refer to [this page](https://cwiki.apache.org/confluence/display/TUBEMQ/Merging+Pull+Requests)
 
+## Website Contributor List
+We are very pleased to announce some contributors here. They have made a lot of contributions in the translation of TubeMQ. Thanks again to the following participants.
+ - deepEvolution
+ - missy
+ - min.yang
+ - goson
+ - stillcoolme
+ - tboy
+ - viviel
+ - yuecai.liu
+
diff --git a/docs/en-us/deployment.md b/docs/en-us/deployment.md
new file mode 100644
index 0000000..87c9215
--- /dev/null
+++ b/docs/en-us/deployment.md
@@ -0,0 +1,161 @@
+## Deployment
+  The TubeMQ server includes two modules for the Master and the Broker. The Master also includes a Web front-end module for external page access (this part is stored in the resources). Considering the actual deployment, two modules are often deployed in the same machine, TubeMQ. The contents of the three parts of the two modules are packaged and delivered to the operation and maintenance; the client does not include the lib package of the server part and is delivered to the user separately.
+   Master and Broker use the ini configuration file format, and the relevant configuration files are placed in the master.ini and broker.ini files in the tubemq-server-3.8.0/conf/ directory.
+   Their configuration is defined by a set of configuration units. The Master configuration consists of four mandatory units: [master], [zookeeper], [bdbStore], and optional [tlsSetting]. The Broker configuration is mandatory. Broker], [zookeeper] and optional [tlsSetting] consist of a total of 3 configuration units; in actual use, you can also combine the contents of the two configuration files into one ini file.
+   In addition to the back-end system configuration file, the Master also stores the Web front-end page module in the resources. The root directory velocity.properties file of the resources is the Web front-end page configuration file of the Master.
+
+### Master
+  In real production environment, you need to run multiple master services on different servers for high availability purpose. Here's
+  the introduction of availability level.
+  
+  | HA Level | Master Number | Description |
+  | -------- | ------------- | ----------- |
+  | High     | 3 masters     | After any master crashed, the cluster meta data is still in read/write state and can accept new producers/consumers. |
+  | Medium   | 2 masters     | After one master crashed, the cluster meta data is in read only state. There's no affect on existing producers and consumers. |
+  | Minimum  | 1 master      | After the master crashed, there's no affect on existing producer and consumer. |
+  
+  Please notice that the master servers should be clock synchronized.
+  
+### Master Configuration item details:
+ 
+ ### master.ini file:
+ [master]
+ > Master system runs the main configuration unit, required unit, the value is fixed to "[master]"
+ 
+ | Name                          | Required                          | Type                          | Description                                                  |
+ | ----------------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+ | hostName                      | yes      | string  | The host address of the master external service, required, must be configured on the NIC, is enabled, non-loopback and cannot be IP of 127.0.0.1 |
+ | port                          | no       | int     | Master listening port, optional, default is 8715             |
+ | webPort                       | no       | int     | Master web console access port, the default value is 8080    |
+ | webResourcePath               | yes      | string  | Master Web Resource deploys an absolute path, which is required. If the value is set incorrectly, the web page will not display properly. |
+ | confModAuthToken              | no       | string  | The authorization Token provided by the operator when the change operation (including adding, deleting, changing configuration, and changing the master and managed Broker status) is performed by the Master's Web or API. The value is optional. The default is "ASDFGHJKL". |
+ | firstBalanceDelayAfterStartMs | no       | long    | Master starts to the interval of the first time to start Rebalance, optional, default 30000 milliseconds |
+ | consumerBalancePeriodMs       | no       | long    | The master balances the rebalance period of the consumer group. The default is 60000 milliseconds. When the cluster size is large, increase the value. |
+ | consumerHeartbeatTimeoutMs    | no       | long    | Consumer heartbeat timeout period, optional, default 30000 milliseconds, when the cluster size is large, please increase the value |
+ | producerHeartbeatTimeoutMs    | no       | long    | Producer heartbeat timeout period, optional, default 30000 milliseconds, when the cluster size is large, please increase the value |
+ | brokerHeartbeatTimeoutMs      | no       | long    | Broker heartbeat timeout period, optional, default 30000 milliseconds, when the cluster size is large, please increase the value |
+ | socketRecvBuffer              | no       | long    | Socket receives the size of the Buffer buffer SO_RCVBUF, the unit byte, the negative number is set as the default value |
+ | socketSendBuffer              | no       | long    | Socket sends Buffer buffer SO_SNDBUF size, unit byte, negative number is  set as the default value |
+ | maxAutoForbiddenCnt           | no       | int     | When the broker has an IO failure, the maximum number of masters allowed to automatically go offline is the number of options. The default value is 5. It is recommended that the value does not exceed 10% of the total number of brokers in the cluster. |
+ | startOffsetResetCheck         | no       | boolean | Whether to enable the check function of the client Offset reset function, optional, the default is false |
+ | needBrokerVisitAuth           | no       | boolean | Whether to enable Broker access authentication, the default is false. If true, the message reported by the broker must carry the correct username and signature information. |
+ | visitName                     | no       | string  | The username of the Broker access authentication. The default is an empty string. This value must exist when needBrokerVisitAuth is true. This value must be the same as the value of the visitName field in broker.ini. |
+ | visitPassword                 | no       | string  | The password for the Broker access authentication. The default is an empty string. This value must exist when needBrokerVisitAuth is true. This value must be the same as the value of the visitPassword field in broker.ini. |
+ | startVisitTokenCheck      | no       | boolean | Whether to enable client visitToken check, the default is false |
+ | startProduceAuthenticate      | no       | boolean | Whether to enable production end user authentication, the default is false |
+ | startProduceAuthorize         | no       | boolean | Whether to enable production-side production authorization authentication, the default is false |
+ | startConsumeAuthenticate      | no       | boolean | Whether to enable consumer user authentication, the default is false |
+ | startConsumeAuthorize         | no       | boolean | Whether to enable consumer consumption authorization authentication, the default is false |
+ | maxGroupBrokerConsumeRate     | no       | int     | The maximum ratio of the number of clustered brokers to the number of members in the consumer group. The default is 50. In a 50-kerrow cluster, one consumer group is allowed to start at least one client. |
+ 
+ [zookeeper]
+ >The corresponding Tom MQ cluster of the Master stores the information about the ZooKeeper cluster of the Offset. The required unit has a fixed value of "[zookeeper]".
+ 
+ | Name                  | Required                          | Type                          | Description                                                  |
+ | --------------------- |  -----------------------------|  ----------------------------- | ------------------------------------------------------------ |
+ | zkServerAddr          | no       | string | Zk server address, optional configuration, defaults to "localhost:2181" |
+ | zkNodeRoot            | no       | string | The root path of the node on zk, optional configuration. The default is "/tube". |
+ | zkSessionTimeoutMs    | no       | long   | Zk heartbeat timeout, in milliseconds, default 30 seconds    |
+ | zkConnectionTimeoutMs | no       | long   | Zk connection timeout, in milliseconds, default 30 seconds   |
+ | zkSyncTimeMs          | no       | long   | Zk data synchronization time, in milliseconds, default 5 seconds |
+ | zkCommitPeriodMs      | no       | long   | The interval at which the Master cache data is flushed to zk, in milliseconds, default 5 seconds. |
+ 
+ [bdbStore]
+ >Master configuration of the BDB cluster to which the master belongs. The master uses BDB for metadata storage and multi-node hot standby. The required unit has a fixed value of "[bdbStore]".
+ 
+ | Name                    | Required                          | Type                          | Description                                                  |
+ | ----------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+ | bdbRepGroupName         | yes      | string | BDB cluster name, the primary and backup master node values must be the same, required field |
+ | bdbNodeName             | yes      | string | The name of the node of the master in the BDB cluster. The value of each BDB node must not be repeated. Required field. |
+ | bdbNodePort             | no       | int    | BDB node communication port, optional field, default is 9001 |
+ | bdbEnvHome              | yes      | string | BDB data storage path, required field                        |
+ | bdbHelperHost           | yes      | string | Primary node when the BDB cluster starts, required field     |
+ | bdbLocalSync            | no       | int    | BDB data node local storage mode, the value range of this field is [1, 2, 3]. The default is 1: 1 is data saved to disk, 2 is data only saved to memory, and 3 is only data is written to file system buffer. But not brush |
+ | bdbReplicaSync          | no       | int    | BDB data node synchronization save mode, the value range of this field is [1, 2, 3]. The default is 1: 1 is data saved to disk, 2 is data only saved to memory, and 3 is only data is written to file system buffer. But not brush |
+ | bdbReplicaAck           | no       | int    | The response policy of the BDB node data synchronization, the value range of this field is [1, 2, 3], the default is 1: 1 is more than 1/2 majority is valid, 2 is valid for all nodes, 3 is not Need node response |
+ | bdbStatusCheckTimeoutMs | no       | long   | BDB status check interval, optional field, in milliseconds, defaults to 10 seconds |
+ 
+ [tlsSetting]
+ >The Master uses TLS to encrypt the transport layer data. When TLS is enabled, the configuration unit provides related settings. The optional unit has a fixed value of "[tlsSetting]".
+ 
+ | Name                  | Required                          | Type                          | Description                                                  |
+ | --------------------- |  -----------------------------|  ----------------------------- | ------------------------------------------------------------ |
+ | tlsEnable             | no       | boolean | Whether to enable TLS function, optional configuration, default is false |
+ | tlsPort               | no       | int     | Master TLS port number, optional configuration, default is 8716 |
+ | tlsKeyStorePath       | no       | string  | The absolute storage path of the TLS keyStore file + the name of the keyStore file. This field is required and cannot be empty when the TLS function is enabled. |
+ | tlsKeyStorePassword   | no       | string  | The absolute storage path of the TLS keyStorePassword file + the name of the keyStorePassword file. This field is required and cannot be empty when the TLS function is enabled. |
+ | tlsTwoWayAuthEnable   | no       | boolean | Whether to enable TLS mutual authentication, optional configuration, the default is false |
+ | tlsTrustStorePath     | no       | string  | The absolute storage path of the TLS TrustStore file + the TrustStore file name. This field is required and cannot be empty when the TLS function is enabled and mutual authentication is enabled. |
+ | tlsTrustStorePassword | no       | string  | The absolute storage path of the TLS TrustStorePassword file + the TrustStorePassword file name. This field is required and cannot be empty when the TLS function is enabled and mutual authentication is enabled. |
+ 
+ ### velocity.properties file:
+ 
+ | Name                      | Required                          | Type                          | Description                                                  |
+ | ------------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+ | file.resource.loader.path | yes      | string | The absolute path of the master web template. This part is the absolute path plus /resources/templates of the project when the master is deployed. The configuration is consistent with the actual deployment. If the configuration fails, the master front page access fails. |
+
+ 
+### Broker
+  In real production environment, you need to run multiple at least 2 broker services on different servers for high availability purpose.
+
+### Broker Configuration item details:
+
+### broker.ini file:
+
+[broker]
+>The broker system runs the main configuration unit, required unit, and the value is fixed to "[broker]"
+
+| Name                  | Required                          | Type                          | Description                                                  |
+| --------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+| brokerId              | yes      | int     | Server unique flag, required field, can be set to 0; when set to 0, the system will default to take the local IP to int value |
+| hostName              | yes      | string  | The host address of the broker external service, required, must be configured in the NIC, is enabled, non-loopback and cannot be IP of 127.0.0.1 |
+| port                  | no       | int     | Broker listening port, optional, default is 8123             |
+| webPort               | no       | int     | Broker's http management access port, optional, default is 8081 |
+| masterAddressList     | yes      | string  | Master address list of the cluster to which the broker belongs. Required fields. The format must be ip1:port1, ip2:port2, ip3:port3. |
+| primaryPath           | yes      | string  | Broker stores the absolute path of the message, mandatory field |
+| maxSegmentSize        | no       | int     | Broker stores the file size of the message data content, optional field, default 512M, maximum 1G |
+| maxIndexSegmentSize   | no       | int     | Broker stores the file size of the message Index content, optional field, default 18M, about 70W messages per file |
+| transferSize          | no       | int     | Broker allows the maximum message content size to be transmitted to the client each time, optional field, default is 512K |
+| consumerRegTimeoutMs  | no       | long    | Consumer heartbeat timeout, optional, in milliseconds, default 30 seconds |
+| socketRecvBuffer      | no       | long    | Socket receives the size of the Buffer buffer SO_RCVBUF, the unit byte, the negative number is not set, the default value is |
+| socketSendBuffer      | no       | long    | Socket sends Buffer buffer SO_SNDBUF size, unit byte, negative number is not set, the default value is |
+| secondDataPath        | no       | string  | The SSD to storage location where the broker is located, optional field. The default is blank to indicate that the machine has no SSD. |
+| maxSSDTotalFileCnt    | no       | int     | The maximum number of Data files allowed by the SSD where the Broker is located, optional field, default 70 |
+| maxSSDTotalFileSizes  | no       | long    | The SSD where the Broker is located allows the maximum size of the data file to be saved. The optional field is 32G by default. |
+| tcpWriteServiceThread | no       | int     | Broker supports the number of socket worker threads for TCP production services, optional fields, and defaults to 2 times the number of CPUs of the machine. |
+| tcpReadServiceThread  | no       | int     | Broker supports the number of socket worker threads for TCP consumer services, optional fields, defaults to 2 times the number of CPUs of the machine |
+| logClearupDurationMs  | no       | long    | The aging cleanup period of the message file, in milliseconds. The default is 30 minutes for a log cleanup operation. The minimum is 30 minutes. |
+| logFlushDiskDurMs     | no       | long    | Batch check message persistence to file check cycle, in milliseconds, default is 20 seconds for a full check and brush |
+| visitTokenCheckInValidTimeMs       | no       | long | The length of the delay check for the visitToken check since the Broker is registered, in ms, the default is 120000, the value range [60000, 300000]. |
+| visitMasterAuth       | no       | boolean | Whether the authentication of the master is enabled, the default is false. If true, the user name and signature information are added to the signaling reported to the master. |
+| visitName             | no       | string  | User name of the access master. The default is an empty string. This value must exist when visitMasterAuth is true. The value must be the same as the value of the visitName field in master.ini. |
+| visitPassword         | no       | string  | The password for accessing the master. The default is an empty string. This value must exist when visitMasterAuth is true. The value must be the same as the value of the visitPassword field in master.ini. |
+| logFlushMemDurMs      | no       | long    | Batch check message memory persistence to file check cycle, in milliseconds, default is 10 seconds for a full check and brush |
+
+[zookeeper]
+>The Tube MQ cluster corresponding to the Broker stores the information about the ZooKeeper cluster of the Offset. The required unit has a fixed value of "[zookeeper]".
+
+
+| Name                  | Required                          | Type                          | Description                                                  |
+| --------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+| zkServerAddr          | no       | string | Zk server address, optional configuration, defaults to "localhost:2181" |
+| zkNodeRoot            | no       | string | The root path of the node on zk, optional configuration. The default is "/tube". |
+| zkSessionTimeoutMs    | no       | long   | Zk heartbeat timeout, in milliseconds, default 30 seconds    |
+| zkConnectionTimeoutMs | no       | long   | Zk connection timeout, in milliseconds, default 30 seconds   |
+| zkSyncTimeMs          | no       | long   | Zk data synchronization time, in milliseconds, default 5 seconds |
+| zkCommitPeriodMs      | no       | long   | The interval at which the broker cache data is flushed to zk, in milliseconds, default 5 seconds |
+| zkCommitFailRetries   | no       | int    | The maximum number of re-brushings after Broker fails to flush cached data to Zk |
+
+[tlsSetting]
+>The Master uses TLS to encrypt the transport layer data. When TLS is enabled, the configuration unit provides related settings. The optional unit has a fixed value of "[tlsSetting]".
+
+
+| Name                  | Required                          | Type                           | Description                                                  |
+| --------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+| tlsEnable             | no       | boolean | Whether to enable TLS function, optional configuration, default is false |
+| tlsPort               | no       | int     | Broker TLS port number, optional configuration, default is 8124 |
+| tlsKeyStorePath       | no       | string  | The absolute storage path of the TLS keyStore file + the name of the keyStore file. This field is required and cannot be empty when the TLS function is enabled. |
+| tlsKeyStorePassword   | no       | string  | The absolute storage path of the TLS keyStorePassword file + the name of the keyStorePassword file. This field is required and cannot be empty when the TLS function is enabled. |
+| tlsTwoWayAuthEnable   | no       | boolean | Whether to enable TLS mutual authentication, optional configuration, the default is false |
+| tlsTrustStorePath     | no       | string  | The absolute storage path of the TLS TrustStore file + the TrustStore file name. This field is required and cannot be empty when the TLS function is enabled and mutual authentication is enabled. |
+| tlsTrustStorePassword | no       | string  | The absolute storage path of the TLS TrustStorePassword file + the TrustStorePassword file name. This field is required and cannot be empty when the TLS function is enabled and mutual authentication is enabled. |
diff --git a/docs/en-us/producer_example.md b/docs/en-us/producer_example.md
new file mode 100644
index 0000000..4c9902b
--- /dev/null
+++ b/docs/en-us/producer_example.md
@@ -0,0 +1,148 @@
+## Producer Example
+  TubeMQ provides two ways to initialize session factory, TubeSingleSessionFactory and TubeMultiSessionFactory:
+  - TubeSingleSessionFactory creates only one session in the lifecycle, this is very useful in streaming scenarios.
+  - TubeMultiSessionFactory creates new session on every call.
+
+1. TubeSingleSessionFactory
+   - Send Message Synchronously
+     ```
+     public final class SyncProducerExample {
+    
+        public static void main(String[] args) throws Exception{
+            final String localHostIP = "127.0.0.1";
+            final String masterHostAndPort = "localhost:8000";
+            final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+            final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+            final MessageProducer messageProducer = messageSessionFactory.createProducer();
+            final String topic = "test";
+            final String body = "This is a test message from single-session-factory!";
+            byte[] bodyData = StringUtils.getBytesUtf8(body);
+            messageProducer.publish(topic);
+            Message message = new Message(topic, bodyData);
+            MessageSentResult result = messageProducer.sendMessage(message);
+            if (result.isSuccess()) {
+                System.out.println("sync send message : " + message);
+            }
+            messageProducer.shutdown();
+        }
+     }
+     ```
+     
+   - Send Message Asynchronously
+     ```
+     public final class AsyncProducerExample {
+     
+         public static void main(String[] args) throws Throwable {
+             final String localHostIP = "127.0.0.1";
+             final String masterHostAndPort = "localhost:8000";
+             final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+             final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+             final MessageProducer messageProducer = messageSessionFactory.createProducer();
+             final String topic = "test";
+             final String body = "async send message from single-session-factory!";
+             byte[] bodyData = StringUtils.getBytesUtf8(body);
+             messageProducer.publish(topic);
+             Message message = new Message(topic, bodyData);
+             messageProducer.sendMessage(message, new MessageSentCallback(){
+                 @Override
+                 public void onMessageSent(MessageSentResult result) {
+                     if (result.isSuccess()) {
+                         System.out.println("async send message : " + message);
+                     } else {
+                         System.out.println("async send message failed : " + result.getErrMsg());
+                     }
+                 }
+                 @Override
+                 public void onException(Throwable e) {
+                     System.out.println("async send message error : " + e);
+                 }
+             });
+             messageProducer.shutdown();
+         }
+     }
+     ```
+     
+   - Send Message With Attributes
+     ```
+     public final class ProducerWithAttributeExample {
+     
+         public static void main(String[] args) throws Throwable {
+             final String localHostIP = "127.0.0.1";
+             final String masterHostAndPort = "localhost:8000";
+             final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+             final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+             final MessageProducer messageProducer = messageSessionFactory.createProducer();
+             final String topic = "test";
+             final String body = "send message with attribute from single-session-factory!";
+             byte[] bodyData = StringUtils.getBytesUtf8(body);
+             messageProducer.publish(topic);
+             Message message = new Message(topic, bodyData);
+             //set attribute
+             message.setAttrKeyVal("test_key", "test value");
+             //msgType is used for consumer filtering, and msgTime(accurate to minute) is used as the pipe to send and receive statistics
+             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
+             message.putSystemHeader("test", sdf.format(new Date()));
+             messageProducer.sendMessage(message);
+             messageProducer.shutdown();
+         }
+     }
+     ```  
+     
+- TubeMultiSessionFactory
+
+    ```
+    public class MultiSessionProducerExample {
+        
+        public static void main(String[] args) throws Exception{
+            final int SESSION_FACTORY_NUM = 10;
+            final String localHostIP = "127.0.0.1";
+            final String masterHostAndPort = "localhost:8000";
+            final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+            final List<MessageSessionFactory> sessionFactoryList = new ArrayList<>(SESSION_FACTORY_NUM);
+            final ExecutorService sendExecutorService = Executors.newFixedThreadPool(SESSION_FACTORY_NUM);
+            final CountDownLatch latch = new CountDownLatch(SESSION_FACTORY_NUM);
+            for (int i = 0; i < SESSION_FACTORY_NUM; i++) {
+                TubeMultiSessionFactory tubeMultiSessionFactory = new TubeMultiSessionFactory(clientConfig);
+                sessionFactoryList.add(tubeMultiSessionFactory);
+                MessageProducer producer = tubeMultiSessionFactory.createProducer();
+                Sender sender = new Sender(producer, latch);
+                sendExecutorService.submit(sender);
+            }
+            latch.await();
+            sendExecutorService.shutdownNow();
+            for(MessageSessionFactory sessionFactory : sessionFactoryList){
+                sessionFactory.shutdown();
+            }
+        }
+    
+        private static class Sender implements Runnable {
+            
+            private MessageProducer producer;
+            
+            private CountDownLatch latch;
+    
+            public Sender(MessageProducer producer, CountDownLatch latch) {
+                this.producer = producer;
+                this.latch = latch;
+            }
+    
+            @Override
+            public void run() {
+                final String topic = "test";
+                try {
+                    producer.publish(topic);
+                    final byte[] bodyData = StringUtils.getBytesUtf8("This is a test message from multi-session factory");
+                    Message message = new Message(topic, bodyData);
+                    producer.sendMessage(message);
+                    producer.shutdown();
+                } catch (Throwable ex) {
+                    System.out.println("send message error : " + ex);
+                } finally {
+                    latch.countDown();
+                }
+            }
+        }
+    }
+    ```
+
+
diff --git a/docs/en-us/quick_start.md b/docs/en-us/quick_start.md
new file mode 100644
index 0000000..18e6acc
--- /dev/null
+++ b/docs/en-us/quick_start.md
@@ -0,0 +1,230 @@
+## Prerequisites
+
+- Java 1.7 or 1.8(Java 9 and above haven't been verified yet)
+- Maven
+- [protoc 2.5.0](https://github.com/protocolbuffers/protobuf/releases/tag/v2.5.0)
+
+## Build
+
+### Build distribution tarball
+Go to the project root, and run
+```bash
+mvn clean package -DskipTests
+```
+If you want to build each module of the project separately, you need to run `mvn install` in the project root at first.
+### Build source code
+If you want to build and debug source code in IDE, go to the project root, and run
+
+```bash
+mvn compile
+```
+
+This command will generate the Java source files from the `protoc` files, the generated files located in `target/generated-sources`.
+
+When this command finished, you can use IDE import the project as maven project.
+
+## Deploy
+After the build, please go to `tubemq-server/target`. You can find the
+**tubemq-server-x.x.x-bin.tar.gz** file. It is the server deployment package, which includes
+scripts, configuration files, dependency jars and web GUI code.
+
+For the first time deployment, we just need to extract the package file. For example, we put these
+files into the `/opt/tubemq-server`, here's the folder structure.
+```
+/opt/tubemq-server
+├── bin
+├── conf
+├── lib
+├── logs
+└── resources
+```
+## Configure
+There're two roles in the cluster: **Master** and **Broker**. Master and Broker
+can be deployed on the same server or different servers. In this example, we setup our cluster
+like this, and all services run on the same node. Zookeeper should be setup in your environment also.
+
+| Role | TCP Port | TLS Port | Web Port | Comment |
+| ---- | -------- | -------- | -------- | ------- |
+| Master | 8099 | 8199 | 8080 | Meta data is stored at /stage/metadata |
+| Broker | 8123 | 8124 | 8081 | Message is stored at /stage/msgdata |
+| Zookeeper | 2181 | | | Offset is stored at /tubemq |
+
+You can follow the example below to update the corresponding config files. Please notice that the **YOUR_SERVER_IP** should
+be replaced with your server IP.
+
+##### conf/master.ini
+```ini
+[master]
+hostName=YOUR_SERVER_IP
+port=8000
+webPort=8080
+consumerBalancePeriodMs=30000
+firstBalanceDelayAfterStartMs=60000
+consumerHeartbeatTimeoutMs=30000
+producerHeartbeatTimeoutMs=45000
+brokerHeartbeatTimeoutMs=25000
+confModAuthToken=abc
+webResourcePath=/opt/tubemq-server/resources
+
+[zookeeper]
+zkNodeRoot=/tubemq
+zkServerAddr=localhost:2181
+zkSessionTimeoutMs=30000
+zkConnectionTimeoutMs=30000
+zkSyncTimeMs=5000
+zkCommitPeriodMs=5000
+
+[bdbStore]
+bdbRepGroupName=tubemqMasterGroup
+bdbNodeName=tubemqMasterGroupNode1
+bdbNodePort=9001
+bdbEnvHome=/stage/metadata
+bdbHelperHost=9.134.8.170:9001
+bdbLocalSync= 1
+bdbReplicaSync= 3
+bdbReplicaAck= 1
+bdbStatusCheckTimeoutMs=10000
+```
+
+##### resources/velocity.properties
+```properties
+resource.loader=file
+file.resource.loader.description=Velocity File Resource Loader
+file.resource.loader.class=org.apache.velocity.runtime.resource.loader.FileResourceLoader
+file.resource.loader.path=/opt/tubemq-server/resources/templates
+file.resource.loader.cache=false
+file.resource.loader.modificationCheckInterval=2
+string.resource.loader.description=Velocity String Resource Loader
+string.resource.loader.class=org.apache.velocity.runtime.resource.loader.StringResourceLoader
+input.encoding=UTF-8
+output.encoding=UTF-8
+```
+
+##### conf/broker.ini
+```ini
+[broker]
+brokerId=0
+hostName=YOUR_SERVER_IP
+port=8123
+webPort=8081
+masterAddressList=YOUR_SERVER_IP:8000
+primaryPath=/stage/msgdata
+maxSegmentSize=1073741824
+maxIndexSegmentSize=22020096
+transferSize= 524288
+loadMessageStoresInParallel=true
+consumerRegTimeoutMs=35000
+
+[zookeeper]
+zkNodeRoot=/tubemq
+zkServerAddr=localhost:2181
+zkSessionTimeoutMs=30000
+zkConnectionTimeoutMs=30000
+zkSyncTimeMs=5000
+zkCommitPeriodMs=5000
+zkCommitFailRetries=10
+
+```
+
+You also need to update your `/etc/hosts` file on the master servers. Add other master
+server IPs in this way, assume the ip is `192.168.1.2`:
+##### /etc/hosts
+```
+192.168.1.2 192-168-1-2
+```
+
+## Start Master
+After update the config file, please go to the `bin` folder and run this command to start
+the master service.
+```bash
+./master.sh start
+```
+You should be able to access `http://your-master-ip:8080/config/topic_list.htm` to see the
+web GUI now.
+
+![TubeMQ Console GUI](img/tubemq-console-gui.png)
+
+## Start Broker
+Before we start a broker service, we need to configure it on master web GUI first.
+
+Go to the `Broker List` page, click `Add Single Broker`, and input the new broker 
+information.
+
+![Add Broker 1](img/tubemq-add-broker-1.png)
+
+In this example, we only need to input broker IP and authToken:
+1. broker IP: broker server ip
+2. authToken: A token pre-configured in the `conf/master.ini` file. Please check the
+`confModAuthToken` field in your `master.ini` file.
+
+Click the online link to activate the new added broker.
+
+![Add Broker 2](img/tubemq-add-broker-2.png)
+
+Go to the broker server, under the `bin` folder run this command to start the broker service
+```bash
+./broker.sh start
+```
+
+Refresh the GUI broker list page, you can see that the broker now is registered.
+
+After the sub-state of the broker changed to `idle`, we can add topics to that broker.
+
+![Add Broker 3](img/tubemq-add-broker-3.png)
+
+## Add Topic
+We can add or manage the cluster topics on the web GUI. To add a new topic, go to the
+topic list page and click the add new topic button
+
+![Add Topic 1](img/tubemq-add-topic-1.png)
+
+Then select the brokers which you want to deploy the topics to.
+
+![Add Topic 5](img/tubemq-add-topic-5.png)
+
+We can see the publish and subscribe state of the new added topic is still grey. We need
+to go to the broker list page to reload the broker configuration.
+
+![Add Topic 6](img/tubemq-add-topic-6.png)
+
+![Add Topic 2](img/tubemq-add-topic-2.png)
+
+When the broker sub-state changed to idle, go to the topic list page. We can see
+that the topic publish/subscribe state is active now.
+
+![Add Topic 3](img/tubemq-add-topic-3.png)
+
+![Add Topic 4](img/tubemq-add-topic-4.png)
+
+Now we can use the topic to send messages.
+
+## Demo
+Now we can run the example to test our cluster. First let's run the produce data demo. Please don't
+forget replace `YOUR_SERVER_IP` with your server ip.
+```bash
+java -Dlog4j.configuration=file:/opt/tubemq-server/conf/tools.log4j.properties  -Djava.net.preferIPv4Stack=true -cp  /opt/tubemq-server/lib/*:/opt/tubemq-server/conf/*: com.tencent.tubemq.example.MessageProducerExample YOUR_SERVER_IP YOUR_SERVER_IP:8000 demo 10000000
+```
+From the log, we can see the message is sent out.
+```bash
+[2019-09-11 16:09:08,287] INFO Send demo 1000 message, keyCount is 268 (com.tencent.tubemq.example.MessageProducerExample)
+[2019-09-11 16:09:08,505] INFO Send demo 2000 message, keyCount is 501 (com.tencent.tubemq.example.MessageProducerExample)
+[2019-09-11 16:09:08,958] INFO Send demo 3000 message, keyCount is 755 (com.tencent.tubemq.example.MessageProducerExample)
+[2019-09-11 16:09:09,085] INFO Send demo 4000 message, keyCount is 1001 (com.tencent.tubemq.example.MessageProducerExample)
+```
+
+Then we run the consume data demo. Also replace the server ip
+```bash
+java -Xmx512m -Dlog4j.configuration=file:/opt/tubemq-server/conf/tools.log4j.properties -Djava.net.preferIPv4Stack=true -cp /opt/tubemq-server/lib/*:/opt/tubemq-server/conf/*: com.tencent.tubemq.example.MessageConsumerExample YOUR_SERVER_IP YOUR_SERVER_IP:8000 demo demoGroup 3 1 1
+```
+From the log, we can see the message received by the consumer.
+
+```bash
+[2019-09-11 16:09:29,720] INFO Receive messages:2500 (com.tencent.tubemq.example.MsgRecvStats)
+[2019-09-11 16:09:30,059] INFO Receive messages:5000 (com.tencent.tubemq.example.MsgRecvStats)
+[2019-09-11 16:09:34,493] INFO Receive messages:10000 (com.tencent.tubemq.example.MsgRecvStats)
+[2019-09-11 16:09:34,783] INFO Receive messages:12500 (com.tencent.tubemq.example.MsgRecvStats)
+```
+
+---
+
+
diff --git a/docs/zh-cn/architecture.md b/docs/zh-cn/architecture.md
new file mode 100644
index 0000000..7f0e3de
--- /dev/null
+++ b/docs/zh-cn/architecture.md
@@ -0,0 +1,26 @@
+## TubeMQ Architecture: ##
+After years of evolution, the TubeMQ cluster is divided into the following 5 parts: 
+![](img/sys_structure.png)
+
+- **Portal:** The Portal part responsible for external interaction and maintenance operations, including API and Web. The API connects to the management system outside the cluster. The Web is a page encapsulation of daily operation and maintenance functions based on the API;
+
+- **Master:** It is responsible for the Control part of the cluster. This part is composed of one or more Master nodes. Master HA performs heartbeat keep-alive and real-time hot standby switching between master nodes (This is the reason why everyone needs to fill in the addresses of all Master nodes corresponding to the cluster when using TubeMQ Lib). The main master is responsible for managing the status of the entire cluster, resource scheduling, permission checking, metadata query, etc;
+
+- **Broker:** The Store part responsible for data storage. This part is composed of independent Broker nodes. Each Broker node manages the Topic set in this node, including the addition, deletion, modification, and inquiring about Topics. It is also responsible for message storage, consumption, aging, partition expansion, data consumption offset records, etc. on the topic, and the external capabilities of the cluster, including the number of topics, throughput, and capacity, are complete [...]
+
+- **Client:** The Client part responsible for data production and consumption. We provide this part in the form of Lib. The most commonly used is the consumer. Compared with the previous, the consumer now supports Push and Pull data pull modes, data consumption behavior support both order and filtered consumption. For the Pull consumption mode, the service supports resetting the precise offset through the client to support the business extract-once consumption. At the same time, the cons [...]
+
+- **Zookeeper:** Responsible for the zk part of the offset storage. This part of the function has been weakened to only the persistent storage of the offset. Considering the next multi-node copy function, this module is temporarily reserved;
+
+## Broker File Storage Scheme Improvement: ##
+Systems that use disk as a medium for data persistence are faced with a variety of performance issues caused by disk problems,TubeMQ is no exception. Performance improvements are largely addressed to solve the problem of how message data is read, write and stored. In this respect, TubeMQ has made some improvements:
+
+1. **File structure and organization adjustment:** TubeMQ's disk storage scheme is similar to Kafka, but not the same, as the figure shown below. Storage instance is consisted of an index file and a data file, each topic can allocate one or more storage instances. And each topic separately maintains the mechanisms of managing storage instances, including aging cycles, number of partitions, whether readable or writable, etc.
+![](img/store_file.png)
+
+2. **Memory block cache:** We add an additional memory cache block for each storage instance based on the file storage, i.e. add a piece of memory to the original write disk to isolate the slow impact of hard disk. The data is brushed into memory first, and the memory control block then brushes the data to disk files in bulk.
+![](img/store_mem.png)
+
+3. **SSD Auxiliary Storage:** For servers with SSD hardware in addition to disk storage, we have made a layer of SSD secondary storage, which is different from the common practice that external systems save data to SSD first, and then transfer data from SSD to disk: according to our analysis, for normal sequential disk accesses, the performance is sufficient to meet the needs of data persistence. When disk IO is up to 100%, the performance degradation is mainly due to lagged consumption, [...]
+![](img/store_ssd.png)
+
diff --git a/docs/zh-cn/consumer_example.md b/docs/zh-cn/consumer_example.md
new file mode 100644
index 0000000..62236a1
--- /dev/null
+++ b/docs/zh-cn/consumer_example.md
@@ -0,0 +1,96 @@
+## Consumer Example
+  TubeMQ provides two ways to consumer message, PullConsumer and PushConsumer:
+
+1. PullConsumer 
+   ```
+   public class PullConsumerExample {
+   
+       public static void main(String[] args) throws Throwable {
+           final String localHostIP = "127.0.0.1";
+           final String masterHostAndPort = "localhost:8000";
+           final String topic = "test";
+           final String group = "test-group";
+           final ConsumerConfig consumerConfig = new ConsumerConfig(localHostIP, masterHostAndPort, group);
+           /* consumeModel
+            *  Set the start position of the consumer group. The value can be [-1, 0, 1]. Default value is 0.
+            * -1: Start from 0 for the first time. Otherwise start from last consume position.
+            *  0: Start from the latest position for the first time. Otherwise start from last consume position.
+            *  1: Start from the latest consume position.
+           */
+           consumerConfig.setConsumeModel(0);
+           final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(consumerConfig);
+           final PullMessageConsumer messagePullConsumer = messageSessionFactory.createPullConsumer(consumerConfig);
+           messagePullConsumer.subscribe(topic, null);
+           messagePullConsumer.completeSubscribe();
+           // wait for client to join the exact consumer queue that consumer group allocated
+           while (!messagePullConsumer.isPartitionsReady(1000)) {
+               ThreadUtils.sleep(1000);
+           }
+           while(true){
+               ConsumerResult result = messagePullConsumer.getMessage();
+               if (result.isSuccess()) {
+                   List<Message> messageList = result.getMessageList();
+                   for (Message message : messageList) {
+                       System.out.println("received message : " + message);
+                   }
+                   messagePullConsumer.confirmConsume(result.getConfirmContext(), true);
+               } else{
+                   if (result.getErrCode() == 400) {
+                       ThreadUtils.sleep(100);
+                   } else {
+                       if (result.getErrCode() != 404) {
+                           System.out.println(String.format("Receive messages errorCode is %d, Error message is %s", result.getErrCode(), result.getErrMsg()));
+                       }
+                   }
+               }
+           }
+       }
+   }
+   ``` 
+   
+2. PushConsumer
+   ```
+   public class PushConsumerExample {
+   
+       public static void main(String[] args) throws Throwable {
+           final String localHostIP = "127.0.0.1";
+           final String masterHostAndPort = "localhost:8000";
+           final String topic = "test";
+           final String group = "test-group";
+           final ConsumerConfig consumerConfig = new ConsumerConfig(localHostIP, masterHostAndPort, group);
+           /* consumeModel
+            *  Set the start position of the consumer group. The value can be [-1, 0, 1]. Default value is 0.
+            * -1: Start from 0 for the first time. Otherwise start from last consume position.
+            *  0: Start from the latest position for the first time. Otherwise start from last consume position.
+            *  1: Start from the latest consume position.
+           */
+           consumerConfig.setConsumeModel(0);
+           final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(consumerConfig);
+           final PushMessageConsumer pushConsumer = messageSessionFactory.createPushConsumer(consumerConfig);
+           pushConsumer.subscribe(topic, null, new MessageListener() {
+   
+               @Override
+               public void receiveMessages(List<Message> messages) throws InterruptedException {
+                   for (Message message : messages) {
+                       System.out.println("received message : " + new String(message.getData()));
+                   }
+               }
+   
+               @Override
+               public Executor getExecutor() {
+                   return null;
+               }
+   
+               @Override
+               public void stop() {
+                   //
+               }
+           });
+           pushConsumer.completeSubscribe();
+           CountDownLatch latch = new CountDownLatch(1);
+           latch.await(10, TimeUnit.MINUTES);
+       }
+   }
+   ```
+
+
diff --git a/docs/zh-cn/contact.md b/docs/zh-cn/contact.md
index 8bca60c..d605c82 100644
--- a/docs/zh-cn/contact.md
+++ b/docs/zh-cn/contact.md
@@ -1,28 +1,16 @@
-Apache TubeMQ
-==============================================
-[![Build Status](https://travis-ci.org/apache/incubator-tubemq.svg?branch=master)](https://travis-ci.org/apache/incubator-tubemq)
-
-Apache TubeMQ (incubating) is a trillion-records-scale distributed messaging queue (MQ) system, focuses on data transmission and storage under massive data. Compared to many open source MQ projects, TubeMQ has unique advantages in terms of stability, performance, and low cost.
-
-
-Contact
+Contact us
 -------
 
-
 - Mailing lists
 
-| Name                                                                          | Scope                           |                                                                 |                                                                     |                                                                              |
-|:------------------------------------------------------------------------------|:--------------------------------|:----------------------------------------------------------------|:--------------------------------------------------------------------|:-----------------------------------------------------------------------------|
-| [dev@tubemq.apache.org](mailto:dev@tubemq.apache.org)     | Development-related discussions | [Subscribe](mailto:dev-subscribe@tubemq.apache.org)   | [Unsubscribe](mailto:dev-unsubscribe@tubemq.apache.org)   | [Archives](http://mail-archives.apache.org/mod_mbox/tubemq-dev/)   |
+    | Name                                                                          | Scope                           |                                                                 |                                                                     |                                                                              |
+    |:------------------------------------------------------------------------------|:--------------------------------|:----------------------------------------------------------------|:--------------------------------------------------------------------|:-----------------------------------------------------------------------------|
+    | [dev@tubemq.apache.org](mailto:dev@tubemq.apache.org)     | Development-related discussions | [Subscribe](mailto:dev-subscribe@tubemq.apache.org)   | [Unsubscribe](mailto:dev-unsubscribe@tubemq.apache.org)   | [Archives](http://mail-archives.apache.org/mod_mbox/tubemq-dev/)   |
 
+- Home page: https://tubemq.apache.org
+- Docs: https://tubemq.apache.org/en-us/docs/tubemq_user_guide.html
+- Issues: https://issues.apache.org/jira/browse/TubeMQ
 
-- Issue management
-  [See JIRA](https://issues.apache.org/jira/browse/TubeMQ)
-
-
-Build and Deploy
--------
-- [See user guide](./docs/tubemq_user_guide.md)
 
 
 License
diff --git a/docs/zh-cn/contribution.md b/docs/zh-cn/contribution.md
index 64ec4ed..5f46e0e 100644
--- a/docs/zh-cn/contribution.md
+++ b/docs/zh-cn/contribution.md
@@ -40,14 +40,6 @@ To avoid potential frustration during the code review cycle, we encourage you to
 
 We are using "TubeMQ Improvement Proposals" for managing major changes to TubeMQ. The list of all proposals is maintained in the TubeMQ wiki at [this page](https://cwiki.apache.org/confluence/display/TUBEMQ/TubeMQ+Improvement+Proposals).
 
-## Code
-
-TBD
-
-## Review
-
-TBD
-
 ## Commit (committers only)
 
 Once the code has been peer reviewed by a committer, the next step is for the committer to merge it into the Github repo.
@@ -56,3 +48,14 @@ Pull requests should not be merged before the review has approved from at least
 
 For more about merging pull request, please refer to [this page](https://cwiki.apache.org/confluence/display/TUBEMQ/Merging+Pull+Requests)
 
+## Website Contributor List
+We are very pleased to announce some contributors here. They have made a lot of contributions in the translation of TubeMQ. Thanks again to the following participants.
+ - deepEvolution
+ - missy
+ - min.yang
+ - goson
+ - stillcoolme
+ - tboy
+ - viviel
+ - yuecai.liu
+
diff --git a/docs/zh-cn/deployment.md b/docs/zh-cn/deployment.md
new file mode 100644
index 0000000..87c9215
--- /dev/null
+++ b/docs/zh-cn/deployment.md
@@ -0,0 +1,161 @@
+## Deployment
+  The TubeMQ server includes two modules for the Master and the Broker. The Master also includes a Web front-end module for external page access (this part is stored in the resources). Considering the actual deployment, two modules are often deployed in the same machine, TubeMQ. The contents of the three parts of the two modules are packaged and delivered to the operation and maintenance; the client does not include the lib package of the server part and is delivered to the user separately.
+   Master and Broker use the ini configuration file format, and the relevant configuration files are placed in the master.ini and broker.ini files in the tubemq-server-3.8.0/conf/ directory.
+   Their configuration is defined by a set of configuration units. The Master configuration consists of four mandatory units: [master], [zookeeper], [bdbStore], and optional [tlsSetting]. The Broker configuration is mandatory. Broker], [zookeeper] and optional [tlsSetting] consist of a total of 3 configuration units; in actual use, you can also combine the contents of the two configuration files into one ini file.
+   In addition to the back-end system configuration file, the Master also stores the Web front-end page module in the resources. The root directory velocity.properties file of the resources is the Web front-end page configuration file of the Master.
+
+### Master
+  In real production environment, you need to run multiple master services on different servers for high availability purpose. Here's
+  the introduction of availability level.
+  
+  | HA Level | Master Number | Description |
+  | -------- | ------------- | ----------- |
+  | High     | 3 masters     | After any master crashed, the cluster meta data is still in read/write state and can accept new producers/consumers. |
+  | Medium   | 2 masters     | After one master crashed, the cluster meta data is in read only state. There's no affect on existing producers and consumers. |
+  | Minimum  | 1 master      | After the master crashed, there's no affect on existing producer and consumer. |
+  
+  Please notice that the master servers should be clock synchronized.
+  
+### Master Configuration item details:
+ 
+ ### master.ini file:
+ [master]
+ > Master system runs the main configuration unit, required unit, the value is fixed to "[master]"
+ 
+ | Name                          | Required                          | Type                          | Description                                                  |
+ | ----------------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+ | hostName                      | yes      | string  | The host address of the master external service, required, must be configured on the NIC, is enabled, non-loopback and cannot be IP of 127.0.0.1 |
+ | port                          | no       | int     | Master listening port, optional, default is 8715             |
+ | webPort                       | no       | int     | Master web console access port, the default value is 8080    |
+ | webResourcePath               | yes      | string  | Master Web Resource deploys an absolute path, which is required. If the value is set incorrectly, the web page will not display properly. |
+ | confModAuthToken              | no       | string  | The authorization Token provided by the operator when the change operation (including adding, deleting, changing configuration, and changing the master and managed Broker status) is performed by the Master's Web or API. The value is optional. The default is "ASDFGHJKL". |
+ | firstBalanceDelayAfterStartMs | no       | long    | Master starts to the interval of the first time to start Rebalance, optional, default 30000 milliseconds |
+ | consumerBalancePeriodMs       | no       | long    | The master balances the rebalance period of the consumer group. The default is 60000 milliseconds. When the cluster size is large, increase the value. |
+ | consumerHeartbeatTimeoutMs    | no       | long    | Consumer heartbeat timeout period, optional, default 30000 milliseconds, when the cluster size is large, please increase the value |
+ | producerHeartbeatTimeoutMs    | no       | long    | Producer heartbeat timeout period, optional, default 30000 milliseconds, when the cluster size is large, please increase the value |
+ | brokerHeartbeatTimeoutMs      | no       | long    | Broker heartbeat timeout period, optional, default 30000 milliseconds, when the cluster size is large, please increase the value |
+ | socketRecvBuffer              | no       | long    | Socket receives the size of the Buffer buffer SO_RCVBUF, the unit byte, the negative number is set as the default value |
+ | socketSendBuffer              | no       | long    | Socket sends Buffer buffer SO_SNDBUF size, unit byte, negative number is  set as the default value |
+ | maxAutoForbiddenCnt           | no       | int     | When the broker has an IO failure, the maximum number of masters allowed to automatically go offline is the number of options. The default value is 5. It is recommended that the value does not exceed 10% of the total number of brokers in the cluster. |
+ | startOffsetResetCheck         | no       | boolean | Whether to enable the check function of the client Offset reset function, optional, the default is false |
+ | needBrokerVisitAuth           | no       | boolean | Whether to enable Broker access authentication, the default is false. If true, the message reported by the broker must carry the correct username and signature information. |
+ | visitName                     | no       | string  | The username of the Broker access authentication. The default is an empty string. This value must exist when needBrokerVisitAuth is true. This value must be the same as the value of the visitName field in broker.ini. |
+ | visitPassword                 | no       | string  | The password for the Broker access authentication. The default is an empty string. This value must exist when needBrokerVisitAuth is true. This value must be the same as the value of the visitPassword field in broker.ini. |
+ | startVisitTokenCheck      | no       | boolean | Whether to enable client visitToken check, the default is false |
+ | startProduceAuthenticate      | no       | boolean | Whether to enable production end user authentication, the default is false |
+ | startProduceAuthorize         | no       | boolean | Whether to enable production-side production authorization authentication, the default is false |
+ | startConsumeAuthenticate      | no       | boolean | Whether to enable consumer user authentication, the default is false |
+ | startConsumeAuthorize         | no       | boolean | Whether to enable consumer consumption authorization authentication, the default is false |
+ | maxGroupBrokerConsumeRate     | no       | int     | The maximum ratio of the number of clustered brokers to the number of members in the consumer group. The default is 50. In a 50-kerrow cluster, one consumer group is allowed to start at least one client. |
+ 
+ [zookeeper]
+ >The corresponding Tom MQ cluster of the Master stores the information about the ZooKeeper cluster of the Offset. The required unit has a fixed value of "[zookeeper]".
+ 
+ | Name                  | Required                          | Type                          | Description                                                  |
+ | --------------------- |  -----------------------------|  ----------------------------- | ------------------------------------------------------------ |
+ | zkServerAddr          | no       | string | Zk server address, optional configuration, defaults to "localhost:2181" |
+ | zkNodeRoot            | no       | string | The root path of the node on zk, optional configuration. The default is "/tube". |
+ | zkSessionTimeoutMs    | no       | long   | Zk heartbeat timeout, in milliseconds, default 30 seconds    |
+ | zkConnectionTimeoutMs | no       | long   | Zk connection timeout, in milliseconds, default 30 seconds   |
+ | zkSyncTimeMs          | no       | long   | Zk data synchronization time, in milliseconds, default 5 seconds |
+ | zkCommitPeriodMs      | no       | long   | The interval at which the Master cache data is flushed to zk, in milliseconds, default 5 seconds. |
+ 
+ [bdbStore]
+ >Master configuration of the BDB cluster to which the master belongs. The master uses BDB for metadata storage and multi-node hot standby. The required unit has a fixed value of "[bdbStore]".
+ 
+ | Name                    | Required                          | Type                          | Description                                                  |
+ | ----------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+ | bdbRepGroupName         | yes      | string | BDB cluster name, the primary and backup master node values must be the same, required field |
+ | bdbNodeName             | yes      | string | The name of the node of the master in the BDB cluster. The value of each BDB node must not be repeated. Required field. |
+ | bdbNodePort             | no       | int    | BDB node communication port, optional field, default is 9001 |
+ | bdbEnvHome              | yes      | string | BDB data storage path, required field                        |
+ | bdbHelperHost           | yes      | string | Primary node when the BDB cluster starts, required field     |
+ | bdbLocalSync            | no       | int    | BDB data node local storage mode, the value range of this field is [1, 2, 3]. The default is 1: 1 is data saved to disk, 2 is data only saved to memory, and 3 is only data is written to file system buffer. But not brush |
+ | bdbReplicaSync          | no       | int    | BDB data node synchronization save mode, the value range of this field is [1, 2, 3]. The default is 1: 1 is data saved to disk, 2 is data only saved to memory, and 3 is only data is written to file system buffer. But not brush |
+ | bdbReplicaAck           | no       | int    | The response policy of the BDB node data synchronization, the value range of this field is [1, 2, 3], the default is 1: 1 is more than 1/2 majority is valid, 2 is valid for all nodes, 3 is not Need node response |
+ | bdbStatusCheckTimeoutMs | no       | long   | BDB status check interval, optional field, in milliseconds, defaults to 10 seconds |
+ 
+ [tlsSetting]
+ >The Master uses TLS to encrypt the transport layer data. When TLS is enabled, the configuration unit provides related settings. The optional unit has a fixed value of "[tlsSetting]".
+ 
+ | Name                  | Required                          | Type                          | Description                                                  |
+ | --------------------- |  -----------------------------|  ----------------------------- | ------------------------------------------------------------ |
+ | tlsEnable             | no       | boolean | Whether to enable TLS function, optional configuration, default is false |
+ | tlsPort               | no       | int     | Master TLS port number, optional configuration, default is 8716 |
+ | tlsKeyStorePath       | no       | string  | The absolute storage path of the TLS keyStore file + the name of the keyStore file. This field is required and cannot be empty when the TLS function is enabled. |
+ | tlsKeyStorePassword   | no       | string  | The absolute storage path of the TLS keyStorePassword file + the name of the keyStorePassword file. This field is required and cannot be empty when the TLS function is enabled. |
+ | tlsTwoWayAuthEnable   | no       | boolean | Whether to enable TLS mutual authentication, optional configuration, the default is false |
+ | tlsTrustStorePath     | no       | string  | The absolute storage path of the TLS TrustStore file + the TrustStore file name. This field is required and cannot be empty when the TLS function is enabled and mutual authentication is enabled. |
+ | tlsTrustStorePassword | no       | string  | The absolute storage path of the TLS TrustStorePassword file + the TrustStorePassword file name. This field is required and cannot be empty when the TLS function is enabled and mutual authentication is enabled. |
+ 
+ ### velocity.properties file:
+ 
+ | Name                      | Required                          | Type                          | Description                                                  |
+ | ------------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+ | file.resource.loader.path | yes      | string | The absolute path of the master web template. This part is the absolute path plus /resources/templates of the project when the master is deployed. The configuration is consistent with the actual deployment. If the configuration fails, the master front page access fails. |
+
+ 
+### Broker
+  In real production environment, you need to run multiple at least 2 broker services on different servers for high availability purpose.
+
+### Broker Configuration item details:
+
+### broker.ini file:
+
+[broker]
+>The broker system runs the main configuration unit, required unit, and the value is fixed to "[broker]"
+
+| Name                  | Required                          | Type                          | Description                                                  |
+| --------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+| brokerId              | yes      | int     | Server unique flag, required field, can be set to 0; when set to 0, the system will default to take the local IP to int value |
+| hostName              | yes      | string  | The host address of the broker external service, required, must be configured in the NIC, is enabled, non-loopback and cannot be IP of 127.0.0.1 |
+| port                  | no       | int     | Broker listening port, optional, default is 8123             |
+| webPort               | no       | int     | Broker's http management access port, optional, default is 8081 |
+| masterAddressList     | yes      | string  | Master address list of the cluster to which the broker belongs. Required fields. The format must be ip1:port1, ip2:port2, ip3:port3. |
+| primaryPath           | yes      | string  | Broker stores the absolute path of the message, mandatory field |
+| maxSegmentSize        | no       | int     | Broker stores the file size of the message data content, optional field, default 512M, maximum 1G |
+| maxIndexSegmentSize   | no       | int     | Broker stores the file size of the message Index content, optional field, default 18M, about 70W messages per file |
+| transferSize          | no       | int     | Broker allows the maximum message content size to be transmitted to the client each time, optional field, default is 512K |
+| consumerRegTimeoutMs  | no       | long    | Consumer heartbeat timeout, optional, in milliseconds, default 30 seconds |
+| socketRecvBuffer      | no       | long    | Socket receives the size of the Buffer buffer SO_RCVBUF, the unit byte, the negative number is not set, the default value is |
+| socketSendBuffer      | no       | long    | Socket sends Buffer buffer SO_SNDBUF size, unit byte, negative number is not set, the default value is |
+| secondDataPath        | no       | string  | The SSD to storage location where the broker is located, optional field. The default is blank to indicate that the machine has no SSD. |
+| maxSSDTotalFileCnt    | no       | int     | The maximum number of Data files allowed by the SSD where the Broker is located, optional field, default 70 |
+| maxSSDTotalFileSizes  | no       | long    | The SSD where the Broker is located allows the maximum size of the data file to be saved. The optional field is 32G by default. |
+| tcpWriteServiceThread | no       | int     | Broker supports the number of socket worker threads for TCP production services, optional fields, and defaults to 2 times the number of CPUs of the machine. |
+| tcpReadServiceThread  | no       | int     | Broker supports the number of socket worker threads for TCP consumer services, optional fields, defaults to 2 times the number of CPUs of the machine |
+| logClearupDurationMs  | no       | long    | The aging cleanup period of the message file, in milliseconds. The default is 30 minutes for a log cleanup operation. The minimum is 30 minutes. |
+| logFlushDiskDurMs     | no       | long    | Batch check message persistence to file check cycle, in milliseconds, default is 20 seconds for a full check and brush |
+| visitTokenCheckInValidTimeMs       | no       | long | The length of the delay check for the visitToken check since the Broker is registered, in ms, the default is 120000, the value range [60000, 300000]. |
+| visitMasterAuth       | no       | boolean | Whether the authentication of the master is enabled, the default is false. If true, the user name and signature information are added to the signaling reported to the master. |
+| visitName             | no       | string  | User name of the access master. The default is an empty string. This value must exist when visitMasterAuth is true. The value must be the same as the value of the visitName field in master.ini. |
+| visitPassword         | no       | string  | The password for accessing the master. The default is an empty string. This value must exist when visitMasterAuth is true. The value must be the same as the value of the visitPassword field in master.ini. |
+| logFlushMemDurMs      | no       | long    | Batch check message memory persistence to file check cycle, in milliseconds, default is 10 seconds for a full check and brush |
+
+[zookeeper]
+>The Tube MQ cluster corresponding to the Broker stores the information about the ZooKeeper cluster of the Offset. The required unit has a fixed value of "[zookeeper]".
+
+
+| Name                  | Required                          | Type                          | Description                                                  |
+| --------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+| zkServerAddr          | no       | string | Zk server address, optional configuration, defaults to "localhost:2181" |
+| zkNodeRoot            | no       | string | The root path of the node on zk, optional configuration. The default is "/tube". |
+| zkSessionTimeoutMs    | no       | long   | Zk heartbeat timeout, in milliseconds, default 30 seconds    |
+| zkConnectionTimeoutMs | no       | long   | Zk connection timeout, in milliseconds, default 30 seconds   |
+| zkSyncTimeMs          | no       | long   | Zk data synchronization time, in milliseconds, default 5 seconds |
+| zkCommitPeriodMs      | no       | long   | The interval at which the broker cache data is flushed to zk, in milliseconds, default 5 seconds |
+| zkCommitFailRetries   | no       | int    | The maximum number of re-brushings after Broker fails to flush cached data to Zk |
+
+[tlsSetting]
+>The Master uses TLS to encrypt the transport layer data. When TLS is enabled, the configuration unit provides related settings. The optional unit has a fixed value of "[tlsSetting]".
+
+
+| Name                  | Required                          | Type                           | Description                                                  |
+| --------------------- |  ----------------------------- |  ----------------------------- | ------------------------------------------------------------ |
+| tlsEnable             | no       | boolean | Whether to enable TLS function, optional configuration, default is false |
+| tlsPort               | no       | int     | Broker TLS port number, optional configuration, default is 8124 |
+| tlsKeyStorePath       | no       | string  | The absolute storage path of the TLS keyStore file + the name of the keyStore file. This field is required and cannot be empty when the TLS function is enabled. |
+| tlsKeyStorePassword   | no       | string  | The absolute storage path of the TLS keyStorePassword file + the name of the keyStorePassword file. This field is required and cannot be empty when the TLS function is enabled. |
+| tlsTwoWayAuthEnable   | no       | boolean | Whether to enable TLS mutual authentication, optional configuration, the default is false |
+| tlsTrustStorePath     | no       | string  | The absolute storage path of the TLS TrustStore file + the TrustStore file name. This field is required and cannot be empty when the TLS function is enabled and mutual authentication is enabled. |
+| tlsTrustStorePassword | no       | string  | The absolute storage path of the TLS TrustStorePassword file + the TrustStorePassword file name. This field is required and cannot be empty when the TLS function is enabled and mutual authentication is enabled. |
diff --git a/docs/zh-cn/producer_example.md b/docs/zh-cn/producer_example.md
new file mode 100644
index 0000000..4c9902b
--- /dev/null
+++ b/docs/zh-cn/producer_example.md
@@ -0,0 +1,148 @@
+## Producer Example
+  TubeMQ provides two ways to initialize session factory, TubeSingleSessionFactory and TubeMultiSessionFactory:
+  - TubeSingleSessionFactory creates only one session in the lifecycle, this is very useful in streaming scenarios.
+  - TubeMultiSessionFactory creates new session on every call.
+
+1. TubeSingleSessionFactory
+   - Send Message Synchronously
+     ```
+     public final class SyncProducerExample {
+    
+        public static void main(String[] args) throws Exception{
+            final String localHostIP = "127.0.0.1";
+            final String masterHostAndPort = "localhost:8000";
+            final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+            final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+            final MessageProducer messageProducer = messageSessionFactory.createProducer();
+            final String topic = "test";
+            final String body = "This is a test message from single-session-factory!";
+            byte[] bodyData = StringUtils.getBytesUtf8(body);
+            messageProducer.publish(topic);
+            Message message = new Message(topic, bodyData);
+            MessageSentResult result = messageProducer.sendMessage(message);
+            if (result.isSuccess()) {
+                System.out.println("sync send message : " + message);
+            }
+            messageProducer.shutdown();
+        }
+     }
+     ```
+     
+   - Send Message Asynchronously
+     ```
+     public final class AsyncProducerExample {
+     
+         public static void main(String[] args) throws Throwable {
+             final String localHostIP = "127.0.0.1";
+             final String masterHostAndPort = "localhost:8000";
+             final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+             final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+             final MessageProducer messageProducer = messageSessionFactory.createProducer();
+             final String topic = "test";
+             final String body = "async send message from single-session-factory!";
+             byte[] bodyData = StringUtils.getBytesUtf8(body);
+             messageProducer.publish(topic);
+             Message message = new Message(topic, bodyData);
+             messageProducer.sendMessage(message, new MessageSentCallback(){
+                 @Override
+                 public void onMessageSent(MessageSentResult result) {
+                     if (result.isSuccess()) {
+                         System.out.println("async send message : " + message);
+                     } else {
+                         System.out.println("async send message failed : " + result.getErrMsg());
+                     }
+                 }
+                 @Override
+                 public void onException(Throwable e) {
+                     System.out.println("async send message error : " + e);
+                 }
+             });
+             messageProducer.shutdown();
+         }
+     }
+     ```
+     
+   - Send Message With Attributes
+     ```
+     public final class ProducerWithAttributeExample {
+     
+         public static void main(String[] args) throws Throwable {
+             final String localHostIP = "127.0.0.1";
+             final String masterHostAndPort = "localhost:8000";
+             final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+             final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+             final MessageProducer messageProducer = messageSessionFactory.createProducer();
+             final String topic = "test";
+             final String body = "send message with attribute from single-session-factory!";
+             byte[] bodyData = StringUtils.getBytesUtf8(body);
+             messageProducer.publish(topic);
+             Message message = new Message(topic, bodyData);
+             //set attribute
+             message.setAttrKeyVal("test_key", "test value");
+             //msgType is used for consumer filtering, and msgTime(accurate to minute) is used as the pipe to send and receive statistics
+             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
+             message.putSystemHeader("test", sdf.format(new Date()));
+             messageProducer.sendMessage(message);
+             messageProducer.shutdown();
+         }
+     }
+     ```  
+     
+- TubeMultiSessionFactory
+
+    ```
+    public class MultiSessionProducerExample {
+        
+        public static void main(String[] args) throws Exception{
+            final int SESSION_FACTORY_NUM = 10;
+            final String localHostIP = "127.0.0.1";
+            final String masterHostAndPort = "localhost:8000";
+            final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+            final List<MessageSessionFactory> sessionFactoryList = new ArrayList<>(SESSION_FACTORY_NUM);
+            final ExecutorService sendExecutorService = Executors.newFixedThreadPool(SESSION_FACTORY_NUM);
+            final CountDownLatch latch = new CountDownLatch(SESSION_FACTORY_NUM);
+            for (int i = 0; i < SESSION_FACTORY_NUM; i++) {
+                TubeMultiSessionFactory tubeMultiSessionFactory = new TubeMultiSessionFactory(clientConfig);
+                sessionFactoryList.add(tubeMultiSessionFactory);
+                MessageProducer producer = tubeMultiSessionFactory.createProducer();
+                Sender sender = new Sender(producer, latch);
+                sendExecutorService.submit(sender);
+            }
+            latch.await();
+            sendExecutorService.shutdownNow();
+            for(MessageSessionFactory sessionFactory : sessionFactoryList){
+                sessionFactory.shutdown();
+            }
+        }
+    
+        private static class Sender implements Runnable {
+            
+            private MessageProducer producer;
+            
+            private CountDownLatch latch;
+    
+            public Sender(MessageProducer producer, CountDownLatch latch) {
+                this.producer = producer;
+                this.latch = latch;
+            }
+    
+            @Override
+            public void run() {
+                final String topic = "test";
+                try {
+                    producer.publish(topic);
+                    final byte[] bodyData = StringUtils.getBytesUtf8("This is a test message from multi-session factory");
+                    Message message = new Message(topic, bodyData);
+                    producer.sendMessage(message);
+                    producer.shutdown();
+                } catch (Throwable ex) {
+                    System.out.println("send message error : " + ex);
+                } finally {
+                    latch.countDown();
+                }
+            }
+        }
+    }
+    ```
+
+
diff --git a/docs/zh-cn/quick_start.md b/docs/zh-cn/quick_start.md
new file mode 100644
index 0000000..18e6acc
--- /dev/null
+++ b/docs/zh-cn/quick_start.md
@@ -0,0 +1,230 @@
+## Prerequisites
+
+- Java 1.7 or 1.8(Java 9 and above haven't been verified yet)
+- Maven
+- [protoc 2.5.0](https://github.com/protocolbuffers/protobuf/releases/tag/v2.5.0)
+
+## Build
+
+### Build distribution tarball
+Go to the project root, and run
+```bash
+mvn clean package -DskipTests
+```
+If you want to build each module of the project separately, you need to run `mvn install` in the project root at first.
+### Build source code
+If you want to build and debug source code in IDE, go to the project root, and run
+
+```bash
+mvn compile
+```
+
+This command will generate the Java source files from the `protoc` files, the generated files located in `target/generated-sources`.
+
+When this command finished, you can use IDE import the project as maven project.
+
+## Deploy
+After the build, please go to `tubemq-server/target`. You can find the
+**tubemq-server-x.x.x-bin.tar.gz** file. It is the server deployment package, which includes
+scripts, configuration files, dependency jars and web GUI code.
+
+For the first time deployment, we just need to extract the package file. For example, we put these
+files into the `/opt/tubemq-server`, here's the folder structure.
+```
+/opt/tubemq-server
+├── bin
+├── conf
+├── lib
+├── logs
+└── resources
+```
+## Configure
+There're two roles in the cluster: **Master** and **Broker**. Master and Broker
+can be deployed on the same server or different servers. In this example, we setup our cluster
+like this, and all services run on the same node. Zookeeper should be setup in your environment also.
+
+| Role | TCP Port | TLS Port | Web Port | Comment |
+| ---- | -------- | -------- | -------- | ------- |
+| Master | 8099 | 8199 | 8080 | Meta data is stored at /stage/metadata |
+| Broker | 8123 | 8124 | 8081 | Message is stored at /stage/msgdata |
+| Zookeeper | 2181 | | | Offset is stored at /tubemq |
+
+You can follow the example below to update the corresponding config files. Please notice that the **YOUR_SERVER_IP** should
+be replaced with your server IP.
+
+##### conf/master.ini
+```ini
+[master]
+hostName=YOUR_SERVER_IP
+port=8000
+webPort=8080
+consumerBalancePeriodMs=30000
+firstBalanceDelayAfterStartMs=60000
+consumerHeartbeatTimeoutMs=30000
+producerHeartbeatTimeoutMs=45000
+brokerHeartbeatTimeoutMs=25000
+confModAuthToken=abc
+webResourcePath=/opt/tubemq-server/resources
+
+[zookeeper]
+zkNodeRoot=/tubemq
+zkServerAddr=localhost:2181
+zkSessionTimeoutMs=30000
+zkConnectionTimeoutMs=30000
+zkSyncTimeMs=5000
+zkCommitPeriodMs=5000
+
+[bdbStore]
+bdbRepGroupName=tubemqMasterGroup
+bdbNodeName=tubemqMasterGroupNode1
+bdbNodePort=9001
+bdbEnvHome=/stage/metadata
+bdbHelperHost=9.134.8.170:9001
+bdbLocalSync= 1
+bdbReplicaSync= 3
+bdbReplicaAck= 1
+bdbStatusCheckTimeoutMs=10000
+```
+
+##### resources/velocity.properties
+```properties
+resource.loader=file
+file.resource.loader.description=Velocity File Resource Loader
+file.resource.loader.class=org.apache.velocity.runtime.resource.loader.FileResourceLoader
+file.resource.loader.path=/opt/tubemq-server/resources/templates
+file.resource.loader.cache=false
+file.resource.loader.modificationCheckInterval=2
+string.resource.loader.description=Velocity String Resource Loader
+string.resource.loader.class=org.apache.velocity.runtime.resource.loader.StringResourceLoader
+input.encoding=UTF-8
+output.encoding=UTF-8
+```
+
+##### conf/broker.ini
+```ini
+[broker]
+brokerId=0
+hostName=YOUR_SERVER_IP
+port=8123
+webPort=8081
+masterAddressList=YOUR_SERVER_IP:8000
+primaryPath=/stage/msgdata
+maxSegmentSize=1073741824
+maxIndexSegmentSize=22020096
+transferSize= 524288
+loadMessageStoresInParallel=true
+consumerRegTimeoutMs=35000
+
+[zookeeper]
+zkNodeRoot=/tubemq
+zkServerAddr=localhost:2181
+zkSessionTimeoutMs=30000
+zkConnectionTimeoutMs=30000
+zkSyncTimeMs=5000
+zkCommitPeriodMs=5000
+zkCommitFailRetries=10
+
+```
+
+You also need to update your `/etc/hosts` file on the master servers. Add other master
+server IPs in this way, assume the ip is `192.168.1.2`:
+##### /etc/hosts
+```
+192.168.1.2 192-168-1-2
+```
+
+## Start Master
+After update the config file, please go to the `bin` folder and run this command to start
+the master service.
+```bash
+./master.sh start
+```
+You should be able to access `http://your-master-ip:8080/config/topic_list.htm` to see the
+web GUI now.
+
+![TubeMQ Console GUI](img/tubemq-console-gui.png)
+
+## Start Broker
+Before we start a broker service, we need to configure it on master web GUI first.
+
+Go to the `Broker List` page, click `Add Single Broker`, and input the new broker 
+information.
+
+![Add Broker 1](img/tubemq-add-broker-1.png)
+
+In this example, we only need to input broker IP and authToken:
+1. broker IP: broker server ip
+2. authToken: A token pre-configured in the `conf/master.ini` file. Please check the
+`confModAuthToken` field in your `master.ini` file.
+
+Click the online link to activate the new added broker.
+
+![Add Broker 2](img/tubemq-add-broker-2.png)
+
+Go to the broker server, under the `bin` folder run this command to start the broker service
+```bash
+./broker.sh start
+```
+
+Refresh the GUI broker list page, you can see that the broker now is registered.
+
+After the sub-state of the broker changed to `idle`, we can add topics to that broker.
+
+![Add Broker 3](img/tubemq-add-broker-3.png)
+
+## Add Topic
+We can add or manage the cluster topics on the web GUI. To add a new topic, go to the
+topic list page and click the add new topic button
+
+![Add Topic 1](img/tubemq-add-topic-1.png)
+
+Then select the brokers which you want to deploy the topics to.
+
+![Add Topic 5](img/tubemq-add-topic-5.png)
+
+We can see the publish and subscribe state of the new added topic is still grey. We need
+to go to the broker list page to reload the broker configuration.
+
+![Add Topic 6](img/tubemq-add-topic-6.png)
+
+![Add Topic 2](img/tubemq-add-topic-2.png)
+
+When the broker sub-state changed to idle, go to the topic list page. We can see
+that the topic publish/subscribe state is active now.
+
+![Add Topic 3](img/tubemq-add-topic-3.png)
+
+![Add Topic 4](img/tubemq-add-topic-4.png)
+
+Now we can use the topic to send messages.
+
+## Demo
+Now we can run the example to test our cluster. First let's run the produce data demo. Please don't
+forget replace `YOUR_SERVER_IP` with your server ip.
+```bash
+java -Dlog4j.configuration=file:/opt/tubemq-server/conf/tools.log4j.properties  -Djava.net.preferIPv4Stack=true -cp  /opt/tubemq-server/lib/*:/opt/tubemq-server/conf/*: com.tencent.tubemq.example.MessageProducerExample YOUR_SERVER_IP YOUR_SERVER_IP:8000 demo 10000000
+```
+From the log, we can see the message is sent out.
+```bash
+[2019-09-11 16:09:08,287] INFO Send demo 1000 message, keyCount is 268 (com.tencent.tubemq.example.MessageProducerExample)
+[2019-09-11 16:09:08,505] INFO Send demo 2000 message, keyCount is 501 (com.tencent.tubemq.example.MessageProducerExample)
+[2019-09-11 16:09:08,958] INFO Send demo 3000 message, keyCount is 755 (com.tencent.tubemq.example.MessageProducerExample)
+[2019-09-11 16:09:09,085] INFO Send demo 4000 message, keyCount is 1001 (com.tencent.tubemq.example.MessageProducerExample)
+```
+
+Then we run the consume data demo. Also replace the server ip
+```bash
+java -Xmx512m -Dlog4j.configuration=file:/opt/tubemq-server/conf/tools.log4j.properties -Djava.net.preferIPv4Stack=true -cp /opt/tubemq-server/lib/*:/opt/tubemq-server/conf/*: com.tencent.tubemq.example.MessageConsumerExample YOUR_SERVER_IP YOUR_SERVER_IP:8000 demo demoGroup 3 1 1
+```
+From the log, we can see the message received by the consumer.
+
+```bash
+[2019-09-11 16:09:29,720] INFO Receive messages:2500 (com.tencent.tubemq.example.MsgRecvStats)
+[2019-09-11 16:09:30,059] INFO Receive messages:5000 (com.tencent.tubemq.example.MsgRecvStats)
+[2019-09-11 16:09:34,493] INFO Receive messages:10000 (com.tencent.tubemq.example.MsgRecvStats)
+[2019-09-11 16:09:34,783] INFO Receive messages:12500 (com.tencent.tubemq.example.MsgRecvStats)
+```
+
+---
+
+
diff --git a/en-us/docs/architecture.html b/en-us/docs/architecture.html
new file mode 100644
index 0000000..592db18
--- /dev/null
+++ b/en-us/docs/architecture.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="architecture" />
+	<meta name="description" content="architecture" />
+	<!-- 网页标签标题 -->
+	<title>architecture</title>
+	<link rel="shortcut icon" href="/img/apache.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+<p>After years of evolution, the TubeMQ cluster is divided into the following 5 parts: 
+<img src="img/sys_structure.png" alt=""></p>
+<ul>
+<li>
+<p><strong>Portal:</strong> The Portal part responsible for external interaction and maintenance operations, including API and Web. The API connects to the management system outside the cluster. The Web is a page encapsulation of daily operation and maintenance functions based on the API;</p>
+</li>
+<li>
+<p><strong>Master:</strong> It is responsible for the Control part of the cluster. This part is composed of one or more Master nodes. Master HA performs heartbeat keep-alive and real-time hot standby switching between master nodes (This is the reason why everyone needs to fill in the addresses of all Master nodes corresponding to the cluster when using TubeMQ Lib). The main master is responsible for managing the status of the entire cluster, resource scheduling, permission checking, meta [...]
+</li>
+<li>
+<p><strong>Broker:</strong> The Store part responsible for data storage. This part is composed of independent Broker nodes. Each Broker node manages the Topic set in this node, including the addition, deletion, modification, and inquiring about Topics. It is also responsible for message storage, consumption, aging, partition expansion, data consumption offset records, etc. on the topic, and the external capabilities of the cluster, including the number of topics, throughput, and capacity [...]
+</li>
+<li>
+<p><strong>Client:</strong> The Client part responsible for data production and consumption. We provide this part in the form of Lib. The most commonly used is the consumer. Compared with the previous, the consumer now supports Push and Pull data pull modes, data consumption behavior support both order and filtered consumption. For the Pull consumption mode, the service supports resetting the precise offset through the client to support the business extract-once consumption. At the same  [...]
+</li>
+<li>
+<p><strong>Zookeeper:</strong> Responsible for the zk part of the offset storage. This part of the function has been weakened to only the persistent storage of the offset. Considering the next multi-node copy function, this module is temporarily reserved;</p>
+</li>
+</ul>
+<h2>Broker File Storage Scheme Improvement:</h2>
+<p>Systems that use disk as a medium for data persistence are faced with a variety of performance issues caused by disk problems,TubeMQ is no exception. Performance improvements are largely addressed to solve the problem of how message data is read, write and stored. In this respect, TubeMQ has made some improvements:</p>
+<ol>
+<li>
+<p><strong>File structure and organization adjustment:</strong> TubeMQ's disk storage scheme is similar to Kafka, but not the same, as the figure shown below. Storage instance is consisted of an index file and a data file, each topic can allocate one or more storage instances. And each topic separately maintains the mechanisms of managing storage instances, including aging cycles, number of partitions, whether readable or writable, etc.
+<img src="img/store_file.png" alt=""></p>
+</li>
+<li>
+<p><strong>Memory block cache:</strong> We add an additional memory cache block for each storage instance based on the file storage, i.e. add a piece of memory to the original write disk to isolate the slow impact of hard disk. The data is brushed into memory first, and the memory control block then brushes the data to disk files in bulk.
+<img src="img/store_mem.png" alt=""></p>
+</li>
+<li>
+<p><strong>SSD Auxiliary Storage:</strong> For servers with SSD hardware in addition to disk storage, we have made a layer of SSD secondary storage, which is different from the common practice that external systems save data to SSD first, and then transfer data from SSD to disk: according to our analysis, for normal sequential disk accesses, the performance is sufficient to meet the needs of data persistence. When disk IO is up to 100%, the performance degradation is mainly due to lagged [...]
+<img src="img/store_ssd.png" alt=""></p>
+</li>
+</ol>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><div class="cols-container"><div class="col col-24"><p>Apache TubeMQ (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with othe [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script src="https://buttons.github.io/buttons.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
diff --git a/en-us/docs/architecture.json b/en-us/docs/architecture.json
new file mode 100644
index 0000000..bfe7760
--- /dev/null
+++ b/en-us/docs/architecture.json
@@ -0,0 +1,6 @@
+{
+  "filename": "architecture.md",
+  "__html": "<h2>TubeMQ Architecture:</h2>\n<p>After years of evolution, the TubeMQ cluster is divided into the following 5 parts: \n<img src=\"img/sys_structure.png\" alt=\"\"></p>\n<ul>\n<li>\n<p><strong>Portal:</strong> The Portal part responsible for external interaction and maintenance operations, including API and Web. The API connects to the management system outside the cluster. The Web is a page encapsulation of daily operation and maintenance functions based on the API;</p>\n</ [...]
+  "link": "/en-us/docs/architecture.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/consumer_example.html b/en-us/docs/consumer_example.html
new file mode 100644
index 0000000..e17e1cb
--- /dev/null
+++ b/en-us/docs/consumer_example.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="consumer_example" />
+	<meta name="description" content="consumer_example" />
+	<!-- 网页标签标题 -->
+	<title>consumer_example</title>
+	<link rel="shortcut icon" href="/img/apache.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+<p>TubeMQ provides two ways to consumer message, PullConsumer and PushConsumer:</p>
+<ol>
+<li>
+<p>PullConsumer</p>
+<pre><code>public class PullConsumerExample {
+
+    public static void main(String[] args) throws Throwable {
+        final String localHostIP = &quot;127.0.0.1&quot;;
+        final String masterHostAndPort = &quot;localhost:8000&quot;;
+        final String topic = &quot;test&quot;;
+        final String group = &quot;test-group&quot;;
+        final ConsumerConfig consumerConfig = new ConsumerConfig(localHostIP, masterHostAndPort, group);
+        /* consumeModel
+         *  Set the start position of the consumer group. The value can be [-1, 0, 1]. Default value is 0.
+         * -1: Start from 0 for the first time. Otherwise start from last consume position.
+         *  0: Start from the latest position for the first time. Otherwise start from last consume position.
+         *  1: Start from the latest consume position.
+        */
+        consumerConfig.setConsumeModel(0);
+        final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(consumerConfig);
+        final PullMessageConsumer messagePullConsumer = messageSessionFactory.createPullConsumer(consumerConfig);
+        messagePullConsumer.subscribe(topic, null);
+        messagePullConsumer.completeSubscribe();
+        // wait for client to join the exact consumer queue that consumer group allocated
+        while (!messagePullConsumer.isPartitionsReady(1000)) {
+            ThreadUtils.sleep(1000);
+        }
+        while(true){
+            ConsumerResult result = messagePullConsumer.getMessage();
+            if (result.isSuccess()) {
+                List&lt;Message&gt; messageList = result.getMessageList();
+                for (Message message : messageList) {
+                    System.out.println(&quot;received message : &quot; + message);
+                }
+                messagePullConsumer.confirmConsume(result.getConfirmContext(), true);
+            } else{
+                if (result.getErrCode() == 400) {
+                    ThreadUtils.sleep(100);
+                } else {
+                    if (result.getErrCode() != 404) {
+                        System.out.println(String.format(&quot;Receive messages errorCode is %d, Error message is %s&quot;, result.getErrCode(), result.getErrMsg()));
+                    }
+                }
+            }
+        }
+    }
+}
+</code></pre>
+</li>
+<li>
+<p>PushConsumer</p>
+<pre><code>public class PushConsumerExample {
+
+    public static void main(String[] args) throws Throwable {
+        final String localHostIP = &quot;127.0.0.1&quot;;
+        final String masterHostAndPort = &quot;localhost:8000&quot;;
+        final String topic = &quot;test&quot;;
+        final String group = &quot;test-group&quot;;
+        final ConsumerConfig consumerConfig = new ConsumerConfig(localHostIP, masterHostAndPort, group);
+        /* consumeModel
+         *  Set the start position of the consumer group. The value can be [-1, 0, 1]. Default value is 0.
+         * -1: Start from 0 for the first time. Otherwise start from last consume position.
+         *  0: Start from the latest position for the first time. Otherwise start from last consume position.
+         *  1: Start from the latest consume position.
+        */
+        consumerConfig.setConsumeModel(0);
+        final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(consumerConfig);
+        final PushMessageConsumer pushConsumer = messageSessionFactory.createPushConsumer(consumerConfig);
+        pushConsumer.subscribe(topic, null, new MessageListener() {
+
+            @Override
+            public void receiveMessages(List&lt;Message&gt; messages) throws InterruptedException {
+                for (Message message : messages) {
+                    System.out.println(&quot;received message : &quot; + new String(message.getData()));
+                }
+            }
+
+            @Override
+            public Executor getExecutor() {
+                return null;
+            }
+
+            @Override
+            public void stop() {
+                //
+            }
+        });
+        pushConsumer.completeSubscribe();
+        CountDownLatch latch = new CountDownLatch(1);
+        latch.await(10, TimeUnit.MINUTES);
+    }
+}
+</code></pre>
+</li>
+</ol>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><div class="cols-container"><div class="col col-24"><p>Apache TubeMQ (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with othe [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script src="https://buttons.github.io/buttons.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
diff --git a/en-us/docs/consumer_example.json b/en-us/docs/consumer_example.json
new file mode 100644
index 0000000..9b966cf
--- /dev/null
+++ b/en-us/docs/consumer_example.json
@@ -0,0 +1,6 @@
+{
+  "filename": "consumer_example.md",
+  "__html": "<h2>Consumer Example</h2>\n<p>TubeMQ provides two ways to consumer message, PullConsumer and PushConsumer:</p>\n<ol>\n<li>\n<p>PullConsumer</p>\n<pre><code>public class PullConsumerExample {\n\n    public static void main(String[] args) throws Throwable {\n        final String localHostIP = &quot;127.0.0.1&quot;;\n        final String masterHostAndPort = &quot;localhost:8000&quot;;\n        final String topic = &quot;test&quot;;\n        final String group = &quot;test-group [...]
+  "link": "/en-us/docs/consumer_example.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/contact.html b/en-us/docs/contact.html
index 38fd22f..c3cedcc 100644
--- a/en-us/docs/contact.html
+++ b/en-us/docs/contact.html
@@ -12,13 +12,10 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
-<p><a href="https://travis-ci.org/apache/incubator-tubemq"><img src="https://travis-ci.org/apache/incubator-tubemq.svg?branch=master" alt="Build Status"></a></p>
-<p>Apache TubeMQ (incubating) is a trillion-records-scale distributed messaging queue (MQ) system, focuses on data transmission and storage under massive data. Compared to many open source MQ projects, TubeMQ has unique advantages in terms of stability, performance, and low cost.</p>
-<h2>Contact</h2>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <ul>
-<li>Mailing lists</li>
-</ul>
+<li>
+<p>Mailing lists</p>
 <table>
 <thead>
 <tr>
@@ -39,13 +36,16 @@
 </tr>
 </tbody>
 </table>
-<ul>
-<li>Issue management
-<a href="https://issues.apache.org/jira/browse/TubeMQ">See JIRA</a></li>
-</ul>
-<h2>Build and Deploy</h2>
-<ul>
-<li><a href="./tubemq_user_guide.md">See user guide</a></li>
+</li>
+<li>
+<p>Home page: <a href="https://tubemq.apache.org">https://tubemq.apache.org</a></p>
+</li>
+<li>
+<p>Docs: <a href="https://tubemq.apache.org/en-us/docs/tubemq_user_guide.html">https://tubemq.apache.org/en-us/docs/tubemq_user_guide.html</a></p>
+</li>
+<li>
+<p>Issues: <a href="https://issues.apache.org/jira/browse/TubeMQ">https://issues.apache.org/jira/browse/TubeMQ</a></p>
+</li>
 </ul>
 <h2>License</h2>
 <p>© Contributors Licensed under an <a href="LICENSE">Apache-2.0</a> license.</p>
diff --git a/en-us/docs/contact.json b/en-us/docs/contact.json
index b3094b7..5c929c8 100644
--- a/en-us/docs/contact.json
+++ b/en-us/docs/contact.json
@@ -1,6 +1,6 @@
 {
   "filename": "contact.md",
-  "__html": "<h1>Apache TubeMQ</h1>\n<p><a href=\"https://travis-ci.org/apache/incubator-tubemq\"><img src=\"https://travis-ci.org/apache/incubator-tubemq.svg?branch=master\" alt=\"Build Status\"></a></p>\n<p>Apache TubeMQ (incubating) is a trillion-records-scale distributed messaging queue (MQ) system, focuses on data transmission and storage under massive data. Compared to many open source MQ projects, TubeMQ has unique advantages in terms of stability, performance, and low cost.</p>\n [...]
+  "__html": "<h2>Contact us</h2>\n<ul>\n<li>\n<p>Mailing lists</p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">Name</th>\n<th style=\"text-align:left\">Scope</th>\n<th style=\"text-align:left\"></th>\n<th style=\"text-align:left\"></th>\n<th style=\"text-align:left\"></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\"><a href=\"mailto:dev@tubemq.apache.org\">dev@tubemq.apache.org</a></td>\n<td style=\"text-align:left\">Development-related discussions</td>\n<td [...]
   "link": "/en-us/docs/contact.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/contribution.html b/en-us/docs/contribution.html
index 86e20fc..570203a 100644
--- a/en-us/docs/contribution.html
+++ b/en-us/docs/contribution.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <p>We use a review-then-commit workflow in TubeMQ for all contributions.</p>
 <p><strong>For larger contributions or those that affect multiple components:</strong></p>
 <ol>
@@ -39,14 +39,22 @@ and project management tool, as well as a way to communicate among a very divers
 <h2>Design</h2>
 <p>To avoid potential frustration during the code review cycle, we encourage you to clearly scope and design non-trivial contributions with the TubeMQ community before you start coding.</p>
 <p>We are using &quot;TubeMQ Improvement Proposals&quot; for managing major changes to TubeMQ. The list of all proposals is maintained in the TubeMQ wiki at <a href="https://cwiki.apache.org/confluence/display/TUBEMQ/TubeMQ+Improvement+Proposals">this page</a>.</p>
-<h2>Code</h2>
-<p>TBD</p>
-<h2>Review</h2>
-<p>TBD</p>
 <h2>Commit (committers only)</h2>
 <p>Once the code has been peer reviewed by a committer, the next step is for the committer to merge it into the Github repo.</p>
 <p>Pull requests should not be merged before the review has approved from at least 1 committer.</p>
 <p>For more about merging pull request, please refer to <a href="https://cwiki.apache.org/confluence/display/TUBEMQ/Merging+Pull+Requests">this page</a></p>
+<h2>Website Contributor List</h2>
+<p>We are very pleased to announce some contributors here. They have made a lot of contributions in the translation of TubeMQ. Thanks again to the following participants.</p>
+<ul>
+<li>deepEvolution</li>
+<li>missy</li>
+<li>min.yang</li>
+<li>goson</li>
+<li>stillcoolme</li>
+<li>tboy</li>
+<li>viviel</li>
+<li>yuecai.liu</li>
+</ul>
 </div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><div class="cols-container"><div class="col col-24"><p>Apache TubeMQ (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with othe [...]
 	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
 	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
diff --git a/en-us/docs/contribution.json b/en-us/docs/contribution.json
index 4ad24bb..d77bde4 100644
--- a/en-us/docs/contribution.json
+++ b/en-us/docs/contribution.json
@@ -1,6 +1,6 @@
 {
   "filename": "contribution.md",
-  "__html": "<p>The Apache TubeMQ(incubating) community welcomes contributions from anyone with a passion for distributed systems! TubeMQ has many different opportunities for contributions -- write new examples/tutorials, add new user-facing libraries or participate on the documentation effort.</p>\n<p>We use a review-then-commit workflow in TubeMQ for all contributions.</p>\n<p><strong>For larger contributions or those that affect multiple components:</strong></p>\n<ol>\n<li><strong>Eng [...]
+  "__html": "<p>The Apache TubeMQ(incubating) community welcomes contributions from anyone with a passion for distributed systems! TubeMQ has many different opportunities for contributions -- write new examples/tutorials, add new user-facing libraries or participate on the documentation effort.</p>\n<p>We use a review-then-commit workflow in TubeMQ for all contributions.</p>\n<p><strong>For larger contributions or those that affect multiple components:</strong></p>\n<ol>\n<li><strong>Eng [...]
   "link": "/en-us/docs/contribution.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/tubemq_config_introduction.html b/en-us/docs/deployment.html
similarity index 87%
copy from en-us/docs/tubemq_config_introduction.html
copy to en-us/docs/deployment.html
index c81b374..777fc0f 100644
--- a/en-us/docs/tubemq_config_introduction.html
+++ b/en-us/docs/deployment.html
@@ -4,20 +4,50 @@
 <head>
 	<meta charset="UTF-8">
 	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-	<meta name="keywords" content="tubemq_config_introduction" />
-	<meta name="description" content="tubemq_config_introduction" />
+	<meta name="keywords" content="deployment" />
+	<meta name="description" content="deployment" />
 	<!-- 网页标签标题 -->
-	<title>tubemq_config_introduction</title>
+	<title>deployment</title>
 	<link rel="shortcut icon" href="/img/apache.ico"/>
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
-<p>The TubeMQ server includes two modules for the Master and the Broker. The Master also includes a Web front-end module for external page access (this part is stored in the resources). Considering the actual deployment, two modules are often deployed in the same machine, TubeMQ. The contents of the three parts of the two modules are packaged and delivered to the operation and maintenance; the client does not include the lib package of the server part and is delivered to the user separat [...]
-<p>Master and Broker use the ini configuration file format, and the relevant configuration files are placed in the master.ini and broker.ini files in the tubemq-server-3.8.0/conf/ directory.</p>
-<p>Their configuration is defined by a set of configuration units. The Master configuration consists of four mandatory units: [master], [zookeeper], [bdbStore], and optional [tlsSetting]. The Broker configuration is mandatory. Broker], [zookeeper] and optional [tlsSetting] consist of a total of 3 configuration units; in actual use, you can also combine the contents of the two configuration files into one ini file.</p>
-<p>In addition to the back-end system configuration file, the Master also stores the Web front-end page module in the resources. The root directory velocity.properties file of the resources is the Web front-end page configuration file of the Master.</p>
-<h2>Configuration item details:</h2>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+<p>The TubeMQ server includes two modules for the Master and the Broker. The Master also includes a Web front-end module for external page access (this part is stored in the resources). Considering the actual deployment, two modules are often deployed in the same machine, TubeMQ. The contents of the three parts of the two modules are packaged and delivered to the operation and maintenance; the client does not include the lib package of the server part and is delivered to the user separately.
+Master and Broker use the ini configuration file format, and the relevant configuration files are placed in the master.ini and broker.ini files in the tubemq-server-3.8.0/conf/ directory.
+Their configuration is defined by a set of configuration units. The Master configuration consists of four mandatory units: [master], [zookeeper], [bdbStore], and optional [tlsSetting]. The Broker configuration is mandatory. Broker], [zookeeper] and optional [tlsSetting] consist of a total of 3 configuration units; in actual use, you can also combine the contents of the two configuration files into one ini file.
+In addition to the back-end system configuration file, the Master also stores the Web front-end page module in the resources. The root directory velocity.properties file of the resources is the Web front-end page configuration file of the Master.</p>
+<h3>Master</h3>
+<p>In real production environment, you need to run multiple master services on different servers for high availability purpose. Here's
+the introduction of availability level.</p>
+<table>
+<thead>
+<tr>
+<th>HA Level</th>
+<th>Master Number</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>High</td>
+<td>3 masters</td>
+<td>After any master crashed, the cluster meta data is still in read/write state and can accept new producers/consumers.</td>
+</tr>
+<tr>
+<td>Medium</td>
+<td>2 masters</td>
+<td>After one master crashed, the cluster meta data is in read only state. There's no affect on existing producers and consumers.</td>
+</tr>
+<tr>
+<td>Minimum</td>
+<td>1 master</td>
+<td>After the master crashed, there's no affect on existing producer and consumer.</td>
+</tr>
+</tbody>
+</table>
+<p>Please notice that the master servers should be clock synchronized.</p>
+<h3>Master Configuration item details:</h3>
 <h3>master.ini file:</h3>
 <p>[master]</p>
 <blockquote>
@@ -372,6 +402,9 @@
 </tr>
 </tbody>
 </table>
+<h3>Broker</h3>
+<p>In real production environment, you need to run multiple at least 2 broker services on different servers for high availability purpose.</p>
+<h3>Broker Configuration item details:</h3>
 <h3>broker.ini file:</h3>
 <p>[broker]</p>
 <blockquote>
@@ -649,8 +682,6 @@
 </tr>
 </tbody>
 </table>
-<hr>
-<p><a href="#top">Back to top</a></p>
 </div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><div class="cols-container"><div class="col col-24"><p>Apache TubeMQ (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with othe [...]
 	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
 	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
diff --git a/en-us/docs/deployment.json b/en-us/docs/deployment.json
new file mode 100644
index 0000000..53513e0
--- /dev/null
+++ b/en-us/docs/deployment.json
@@ -0,0 +1,6 @@
+{
+  "filename": "deployment.md",
+  "__html": "<h2>Deployment</h2>\n<p>The TubeMQ server includes two modules for the Master and the Broker. The Master also includes a Web front-end module for external page access (this part is stored in the resources). Considering the actual deployment, two modules are often deployed in the same machine, TubeMQ. The contents of the three parts of the two modules are packaged and delivered to the operation and maintenance; the client does not include the lib package of the server part an [...]
+  "link": "/en-us/docs/deployment.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/http_access_API_definition.html b/en-us/docs/http_access_API_definition.html
index 3c71dae..b7985dc 100644
--- a/en-us/docs/http_access_API_definition.html
+++ b/en-us/docs/http_access_API_definition.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <h2>Master metadata configuration API</h2>
 <h3><code>admin_online_broker_configure</code></h3>
 <p>The online configuration of the Brokers are new or offline. The configuration of Topics are distributed to related Brokers as well.</p>
diff --git a/en-us/docs/producer_example.html b/en-us/docs/producer_example.html
new file mode 100644
index 0000000..4a3db73
--- /dev/null
+++ b/en-us/docs/producer_example.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="producer_example" />
+	<meta name="description" content="producer_example" />
+	<!-- 网页标签标题 -->
+	<title>producer_example</title>
+	<link rel="shortcut icon" href="/img/apache.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+<p>TubeMQ provides two ways to initialize session factory, TubeSingleSessionFactory and TubeMultiSessionFactory:</p>
+<ul>
+<li>TubeSingleSessionFactory creates only one session in the lifecycle, this is very useful in streaming scenarios.</li>
+<li>TubeMultiSessionFactory creates new session on every call.</li>
+</ul>
+<ol>
+<li>TubeSingleSessionFactory
+<ul>
+<li>
+<p>Send Message Synchronously</p>
+<pre><code>public final class SyncProducerExample {
+
+   public static void main(String[] args) throws Exception{
+       final String localHostIP = &quot;127.0.0.1&quot;;
+       final String masterHostAndPort = &quot;localhost:8000&quot;;
+       final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+       final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+       final MessageProducer messageProducer = messageSessionFactory.createProducer();
+       final String topic = &quot;test&quot;;
+       final String body = &quot;This is a test message from single-session-factory!&quot;;
+       byte[] bodyData = StringUtils.getBytesUtf8(body);
+       messageProducer.publish(topic);
+       Message message = new Message(topic, bodyData);
+       MessageSentResult result = messageProducer.sendMessage(message);
+       if (result.isSuccess()) {
+           System.out.println(&quot;sync send message : &quot; + message);
+       }
+       messageProducer.shutdown();
+   }
+}
+</code></pre>
+</li>
+<li>
+<p>Send Message Asynchronously</p>
+<pre><code>public final class AsyncProducerExample {
+
+    public static void main(String[] args) throws Throwable {
+        final String localHostIP = &quot;127.0.0.1&quot;;
+        final String masterHostAndPort = &quot;localhost:8000&quot;;
+        final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+        final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+        final MessageProducer messageProducer = messageSessionFactory.createProducer();
+        final String topic = &quot;test&quot;;
+        final String body = &quot;async send message from single-session-factory!&quot;;
+        byte[] bodyData = StringUtils.getBytesUtf8(body);
+        messageProducer.publish(topic);
+        Message message = new Message(topic, bodyData);
+        messageProducer.sendMessage(message, new MessageSentCallback(){
+            @Override
+            public void onMessageSent(MessageSentResult result) {
+                if (result.isSuccess()) {
+                    System.out.println(&quot;async send message : &quot; + message);
+                } else {
+                    System.out.println(&quot;async send message failed : &quot; + result.getErrMsg());
+                }
+            }
+            @Override
+            public void onException(Throwable e) {
+                System.out.println(&quot;async send message error : &quot; + e);
+            }
+        });
+        messageProducer.shutdown();
+    }
+}
+</code></pre>
+</li>
+<li>
+<p>Send Message With Attributes</p>
+<pre><code>public final class ProducerWithAttributeExample {
+
+    public static void main(String[] args) throws Throwable {
+        final String localHostIP = &quot;127.0.0.1&quot;;
+        final String masterHostAndPort = &quot;localhost:8000&quot;;
+        final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+        final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+        final MessageProducer messageProducer = messageSessionFactory.createProducer();
+        final String topic = &quot;test&quot;;
+        final String body = &quot;send message with attribute from single-session-factory!&quot;;
+        byte[] bodyData = StringUtils.getBytesUtf8(body);
+        messageProducer.publish(topic);
+        Message message = new Message(topic, bodyData);
+        //set attribute
+        message.setAttrKeyVal(&quot;test_key&quot;, &quot;test value&quot;);
+        //msgType is used for consumer filtering, and msgTime(accurate to minute) is used as the pipe to send and receive statistics
+        SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyyMMddHHmm&quot;);
+        message.putSystemHeader(&quot;test&quot;, sdf.format(new Date()));
+        messageProducer.sendMessage(message);
+        messageProducer.shutdown();
+    }
+}
+</code></pre>
+</li>
+</ul>
+</li>
+</ol>
+<ul>
+<li>
+<p>TubeMultiSessionFactory</p>
+<pre><code>public class MultiSessionProducerExample {
+    
+    public static void main(String[] args) throws Exception{
+        final int SESSION_FACTORY_NUM = 10;
+        final String localHostIP = &quot;127.0.0.1&quot;;
+        final String masterHostAndPort = &quot;localhost:8000&quot;;
+        final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+        final List&lt;MessageSessionFactory&gt; sessionFactoryList = new ArrayList&lt;&gt;(SESSION_FACTORY_NUM);
+        final ExecutorService sendExecutorService = Executors.newFixedThreadPool(SESSION_FACTORY_NUM);
+        final CountDownLatch latch = new CountDownLatch(SESSION_FACTORY_NUM);
+        for (int i = 0; i &lt; SESSION_FACTORY_NUM; i++) {
+            TubeMultiSessionFactory tubeMultiSessionFactory = new TubeMultiSessionFactory(clientConfig);
+            sessionFactoryList.add(tubeMultiSessionFactory);
+            MessageProducer producer = tubeMultiSessionFactory.createProducer();
+            Sender sender = new Sender(producer, latch);
+            sendExecutorService.submit(sender);
+        }
+        latch.await();
+        sendExecutorService.shutdownNow();
+        for(MessageSessionFactory sessionFactory : sessionFactoryList){
+            sessionFactory.shutdown();
+        }
+    }
+
+    private static class Sender implements Runnable {
+        
+        private MessageProducer producer;
+        
+        private CountDownLatch latch;
+
+        public Sender(MessageProducer producer, CountDownLatch latch) {
+            this.producer = producer;
+            this.latch = latch;
+        }
+
+        @Override
+        public void run() {
+            final String topic = &quot;test&quot;;
+            try {
+                producer.publish(topic);
+                final byte[] bodyData = StringUtils.getBytesUtf8(&quot;This is a test message from multi-session factory&quot;);
+                Message message = new Message(topic, bodyData);
+                producer.sendMessage(message);
+                producer.shutdown();
+            } catch (Throwable ex) {
+                System.out.println(&quot;send message error : &quot; + ex);
+            } finally {
+                latch.countDown();
+            }
+        }
+    }
+}
+</code></pre>
+</li>
+</ul>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><div class="cols-container"><div class="col col-24"><p>Apache TubeMQ (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with othe [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script src="https://buttons.github.io/buttons.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
diff --git a/en-us/docs/producer_example.json b/en-us/docs/producer_example.json
new file mode 100644
index 0000000..bf9025a
--- /dev/null
+++ b/en-us/docs/producer_example.json
@@ -0,0 +1,6 @@
+{
+  "filename": "producer_example.md",
+  "__html": "<h2>Producer Example</h2>\n<p>TubeMQ provides two ways to initialize session factory, TubeSingleSessionFactory and TubeMultiSessionFactory:</p>\n<ul>\n<li>TubeSingleSessionFactory creates only one session in the lifecycle, this is very useful in streaming scenarios.</li>\n<li>TubeMultiSessionFactory creates new session on every call.</li>\n</ul>\n<ol>\n<li>TubeSingleSessionFactory\n<ul>\n<li>\n<p>Send Message Synchronously</p>\n<pre><code>public final class SyncProducerExamp [...]
+  "link": "/en-us/docs/producer_example.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/tubemq_user_guide.html b/en-us/docs/quick_start.html
similarity index 90%
copy from en-us/docs/tubemq_user_guide.html
copy to en-us/docs/quick_start.html
index 93b81d7..de6505e 100644
--- a/en-us/docs/tubemq_user_guide.html
+++ b/en-us/docs/quick_start.html
@@ -4,16 +4,15 @@
 <head>
 	<meta charset="UTF-8">
 	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-	<meta name="keywords" content="tubemq_user_guide" />
-	<meta name="description" content="tubemq_user_guide" />
+	<meta name="keywords" content="quick_start" />
+	<meta name="description" content="quick_start" />
 	<!-- 网页标签标题 -->
-	<title>tubemq_user_guide</title>
+	<title>quick_start</title>
 	<link rel="shortcut icon" href="/img/apache.ico"/>
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
-<h2>Prerequisites</h2>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <ul>
 <li>Java 1.7 or 1.8(Java 9 and above haven't been verified yet)</li>
 <li>Maven</li>
@@ -157,37 +156,6 @@ server IPs in this way, assume the ip is <code>192.168.1.2</code>:</p>
 <h5>/etc/hosts</h5>
 <pre><code>192.168.1.2 192-168-1-2
 </code></pre>
-<h2>High Availability</h2>
-<p>In the example above, we run the services on a single node. However, in real production environment, you
-need to run multiple master services on different servers for high availability purpose. Here's
-the introduction of availability level.</p>
-<table>
-<thead>
-<tr>
-<th>HA Level</th>
-<th>Master Number</th>
-<th>Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>High</td>
-<td>3 masters</td>
-<td>After any master crashed, the cluster meta data is still in read/write state and can accept new producers/consumers.</td>
-</tr>
-<tr>
-<td>Medium</td>
-<td>2 masters</td>
-<td>After one master crashed, the cluster meta data is in read only state. There's no affect on existing producers and consumers.</td>
-</tr>
-<tr>
-<td>Minimum</td>
-<td>1 master</td>
-<td>After the master crashed, there's no affect on existing producer and consumer.</td>
-</tr>
-</tbody>
-</table>
-<p>Please notice that the master servers should be clock synchronized.</p>
 <h2>Start Master</h2>
 <p>After update the config file, please go to the <code>bin</code> folder and run this command to start
 the master service.</p>
diff --git a/en-us/docs/quick_start.json b/en-us/docs/quick_start.json
new file mode 100644
index 0000000..65e0944
--- /dev/null
+++ b/en-us/docs/quick_start.json
@@ -0,0 +1,6 @@
+{
+  "filename": "quick_start.md",
+  "__html": "<h2>Prerequisites</h2>\n<ul>\n<li>Java 1.7 or 1.8(Java 9 and above haven't been verified yet)</li>\n<li>Maven</li>\n<li><a href=\"https://github.com/protocolbuffers/protobuf/releases/tag/v2.5.0\">protoc 2.5.0</a></li>\n</ul>\n<h2>Build</h2>\n<h3>Build distribution tarball</h3>\n<p>Go to the project root, and run</p>\n<pre><code class=\"language-bash\">mvn clean package -DskipTests\n</code></pre>\n<p>If you want to build each module of the project separately, you need to run  [...]
+  "link": "/en-us/docs/quick_start.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/tubemq_basic_introduction_cn.html b/en-us/docs/tubemq_basic_introduction_cn.html
index 4a6ce6a..4c66783 100644
--- a/en-us/docs/tubemq_basic_introduction_cn.html
+++ b/en-us/docs/tubemq_basic_introduction_cn.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <blockquote>
 <p>TubeMQ是腾讯大数据在2013年开始研发的分布式消息中间件系统(MQ),专注服务大数据场景下海量数据的高性能存储和传输。经过近7年上万亿的海量数据沉淀,较之于众多的开源MQ组件,TubeMQ在海量实践(稳定性+性能)和低成本方面有一定的优势,近期我们在开源TubeMQ的相关代码及设计,更多资料正在陆续整理和上传之中。更多疑问,请联系: <a href="mailto:gosonzhang@tencent.com">gosonzhang@tencent.com</a>, <a href="mailto:junpingdu@tencent.com">junpingdu@tencent.com</a></p>
 </blockquote>
diff --git a/en-us/docs/tubemq_clients_cn.html b/en-us/docs/tubemq_clients_cn.html
index f81a51f..c2f9653 100644
--- a/en-us/docs/tubemq_clients_cn.html
+++ b/en-us/docs/tubemq_clients_cn.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <hr>
 <h3><strong>1. 基础对象接介绍:</strong></h3>
 <h4><strong>a) MessageSessionFactory(消息会话工厂):</strong></h4>
diff --git a/en-us/docs/tubemq_config_introduction.html b/en-us/docs/tubemq_config_introduction.html
index c81b374..33aa1aa 100644
--- a/en-us/docs/tubemq_config_introduction.html
+++ b/en-us/docs/tubemq_config_introduction.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <p>The TubeMQ server includes two modules for the Master and the Broker. The Master also includes a Web front-end module for external page access (this part is stored in the resources). Considering the actual deployment, two modules are often deployed in the same machine, TubeMQ. The contents of the three parts of the two modules are packaged and delivered to the operation and maintenance; the client does not include the lib package of the server part and is delivered to the user separat [...]
 <p>Master and Broker use the ini configuration file format, and the relevant configuration files are placed in the master.ini and broker.ini files in the tubemq-server-3.8.0/conf/ directory.</p>
 <p>Their configuration is defined by a set of configuration units. The Master configuration consists of four mandatory units: [master], [zookeeper], [bdbStore], and optional [tlsSetting]. The Broker configuration is mandatory. Broker], [zookeeper] and optional [tlsSetting] consist of a total of 3 configuration units; in actual use, you can also combine the contents of the two configuration files into one ini file.</p>
diff --git a/en-us/docs/tubemq_console_introduction_cn.html b/en-us/docs/tubemq_console_introduction_cn.html
index 7361954..2bedb14 100644
--- a/en-us/docs/tubemq_console_introduction_cn.html
+++ b/en-us/docs/tubemq_console_introduction_cn.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <h2>管控台关系</h2>
 <p>​        TubeMQ管控台是管理TubeMQ集群的简单运营工具,包括集群里的Master、Broker,以及Broker上部署的Topic元数据等与TubeMQ系统相关的运营数据及操作。需要说明的是,当前提供的TubeMQ前台所提供的功能没有涵盖TubeMQ所提供的功能范围,大家可以参照《TubeMQ HTTP访问接口定义.xls》定义自行实现符合业务需要的管控前台。TubeMQ管控台的访问地址为http://portal:webport/config/topic_list.htm:
 <img src="img/console/1568169770714.png" alt="">
diff --git a/en-us/docs/tubemq_error_status_introduction_cn.html b/en-us/docs/tubemq_error_status_introduction_cn.html
index 3963471..b483c2b 100644
--- a/en-us/docs/tubemq_error_status_introduction_cn.html
+++ b/en-us/docs/tubemq_error_status_introduction_cn.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <p>​        TubeMQ采用的是 错误码(errCode) + 错误详情(errMsg) 相结合的方式返回具体的操作结果。首先根据错误码确定是哪类问题,然后根据错误详情来确定具体的错误原因。表格汇总了所有的错误码以及运行中大家可能遇到的错误详情的相关对照。</p>
 <h2>错误码</h2>
 <table>
diff --git a/en-us/docs/tubemq_perf_test_vs_Kafka_cn.html b/en-us/docs/tubemq_perf_test_vs_Kafka_cn.html
index 21a3a16..3ed20c8 100644
--- a/en-us/docs/tubemq_perf_test_vs_Kafka_cn.html
+++ b/en-us/docs/tubemq_perf_test_vs_Kafka_cn.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <h2>背景</h2>
 <p>TubeMQ是腾讯大数据自研的分布式消息中间件。其系统架构思想源于<a href="http://kafka.apache.org/">Apache Kafka</a>。在实现上,则完全采取自适应的方式,结合实战做了很多优化及研发工作,如分区管理、分配机制和全新节点通讯流程,自主开发高性能的底层RPC通讯模块等。
 这些实现使得TubeMQ在保证实时性和一致性的前提下,具有很好的健壮性及更高的吞吐能力。结合目前主流消息中间件使用情况,以Kafka为参照做性能对比测试,对比常规应用场景下两套系统性能。</p>
diff --git a/en-us/docs/tubemq_user_guide.html b/en-us/docs/tubemq_user_guide.html
index 93b81d7..a0e2428 100644
--- a/en-us/docs/tubemq_user_guide.html
+++ b/en-us/docs/tubemq_user_guide.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <h2>Prerequisites</h2>
 <ul>
 <li>Java 1.7 or 1.8(Java 9 and above haven't been verified yet)</li>
diff --git a/zh-cn/docs/architecture.html b/zh-cn/docs/architecture.html
new file mode 100644
index 0000000..86110b5
--- /dev/null
+++ b/zh-cn/docs/architecture.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="architecture" />
+	<meta name="description" content="architecture" />
+	<!-- 网页标签标题 -->
+	<title>architecture</title>
+	<link rel="shortcut icon" href="/img/apache.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+<p>After years of evolution, the TubeMQ cluster is divided into the following 5 parts: 
+<img src="img/sys_structure.png" alt=""></p>
+<ul>
+<li>
+<p><strong>Portal:</strong> The Portal part responsible for external interaction and maintenance operations, including API and Web. The API connects to the management system outside the cluster. The Web is a page encapsulation of daily operation and maintenance functions based on the API;</p>
+</li>
+<li>
+<p><strong>Master:</strong> It is responsible for the Control part of the cluster. This part is composed of one or more Master nodes. Master HA performs heartbeat keep-alive and real-time hot standby switching between master nodes (This is the reason why everyone needs to fill in the addresses of all Master nodes corresponding to the cluster when using TubeMQ Lib). The main master is responsible for managing the status of the entire cluster, resource scheduling, permission checking, meta [...]
+</li>
+<li>
+<p><strong>Broker:</strong> The Store part responsible for data storage. This part is composed of independent Broker nodes. Each Broker node manages the Topic set in this node, including the addition, deletion, modification, and inquiring about Topics. It is also responsible for message storage, consumption, aging, partition expansion, data consumption offset records, etc. on the topic, and the external capabilities of the cluster, including the number of topics, throughput, and capacity [...]
+</li>
+<li>
+<p><strong>Client:</strong> The Client part responsible for data production and consumption. We provide this part in the form of Lib. The most commonly used is the consumer. Compared with the previous, the consumer now supports Push and Pull data pull modes, data consumption behavior support both order and filtered consumption. For the Pull consumption mode, the service supports resetting the precise offset through the client to support the business extract-once consumption. At the same  [...]
+</li>
+<li>
+<p><strong>Zookeeper:</strong> Responsible for the zk part of the offset storage. This part of the function has been weakened to only the persistent storage of the offset. Considering the next multi-node copy function, this module is temporarily reserved;</p>
+</li>
+</ul>
+<h2>Broker File Storage Scheme Improvement:</h2>
+<p>Systems that use disk as a medium for data persistence are faced with a variety of performance issues caused by disk problems,TubeMQ is no exception. Performance improvements are largely addressed to solve the problem of how message data is read, write and stored. In this respect, TubeMQ has made some improvements:</p>
+<ol>
+<li>
+<p><strong>File structure and organization adjustment:</strong> TubeMQ's disk storage scheme is similar to Kafka, but not the same, as the figure shown below. Storage instance is consisted of an index file and a data file, each topic can allocate one or more storage instances. And each topic separately maintains the mechanisms of managing storage instances, including aging cycles, number of partitions, whether readable or writable, etc.
+<img src="img/store_file.png" alt=""></p>
+</li>
+<li>
+<p><strong>Memory block cache:</strong> We add an additional memory cache block for each storage instance based on the file storage, i.e. add a piece of memory to the original write disk to isolate the slow impact of hard disk. The data is brushed into memory first, and the memory control block then brushes the data to disk files in bulk.
+<img src="img/store_mem.png" alt=""></p>
+</li>
+<li>
+<p><strong>SSD Auxiliary Storage:</strong> For servers with SSD hardware in addition to disk storage, we have made a layer of SSD secondary storage, which is different from the common practice that external systems save data to SSD first, and then transfer data from SSD to disk: according to our analysis, for normal sequential disk accesses, the performance is sufficient to meet the needs of data persistence. When disk IO is up to 100%, the performance degradation is mainly due to lagged [...]
+<img src="img/store_ssd.png" alt=""></p>
+</li>
+</ol>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><div class="cols-container"><div class="col col-24"><p>Apache TubeMQ (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with othe [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script src="https://buttons.github.io/buttons.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
diff --git a/zh-cn/docs/architecture.json b/zh-cn/docs/architecture.json
new file mode 100644
index 0000000..c1cafb7
--- /dev/null
+++ b/zh-cn/docs/architecture.json
@@ -0,0 +1,6 @@
+{
+  "filename": "architecture.md",
+  "__html": "<h2>TubeMQ Architecture:</h2>\n<p>After years of evolution, the TubeMQ cluster is divided into the following 5 parts: \n<img src=\"img/sys_structure.png\" alt=\"\"></p>\n<ul>\n<li>\n<p><strong>Portal:</strong> The Portal part responsible for external interaction and maintenance operations, including API and Web. The API connects to the management system outside the cluster. The Web is a page encapsulation of daily operation and maintenance functions based on the API;</p>\n</ [...]
+  "link": "/zh-cn/docs/architecture.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/consumer_example.html b/zh-cn/docs/consumer_example.html
new file mode 100644
index 0000000..7d3d3f3
--- /dev/null
+++ b/zh-cn/docs/consumer_example.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="consumer_example" />
+	<meta name="description" content="consumer_example" />
+	<!-- 网页标签标题 -->
+	<title>consumer_example</title>
+	<link rel="shortcut icon" href="/img/apache.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+<p>TubeMQ provides two ways to consumer message, PullConsumer and PushConsumer:</p>
+<ol>
+<li>
+<p>PullConsumer</p>
+<pre><code>public class PullConsumerExample {
+
+    public static void main(String[] args) throws Throwable {
+        final String localHostIP = &quot;127.0.0.1&quot;;
+        final String masterHostAndPort = &quot;localhost:8000&quot;;
+        final String topic = &quot;test&quot;;
+        final String group = &quot;test-group&quot;;
+        final ConsumerConfig consumerConfig = new ConsumerConfig(localHostIP, masterHostAndPort, group);
+        /* consumeModel
+         *  Set the start position of the consumer group. The value can be [-1, 0, 1]. Default value is 0.
+         * -1: Start from 0 for the first time. Otherwise start from last consume position.
+         *  0: Start from the latest position for the first time. Otherwise start from last consume position.
+         *  1: Start from the latest consume position.
+        */
+        consumerConfig.setConsumeModel(0);
+        final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(consumerConfig);
+        final PullMessageConsumer messagePullConsumer = messageSessionFactory.createPullConsumer(consumerConfig);
+        messagePullConsumer.subscribe(topic, null);
+        messagePullConsumer.completeSubscribe();
+        // wait for client to join the exact consumer queue that consumer group allocated
+        while (!messagePullConsumer.isPartitionsReady(1000)) {
+            ThreadUtils.sleep(1000);
+        }
+        while(true){
+            ConsumerResult result = messagePullConsumer.getMessage();
+            if (result.isSuccess()) {
+                List&lt;Message&gt; messageList = result.getMessageList();
+                for (Message message : messageList) {
+                    System.out.println(&quot;received message : &quot; + message);
+                }
+                messagePullConsumer.confirmConsume(result.getConfirmContext(), true);
+            } else{
+                if (result.getErrCode() == 400) {
+                    ThreadUtils.sleep(100);
+                } else {
+                    if (result.getErrCode() != 404) {
+                        System.out.println(String.format(&quot;Receive messages errorCode is %d, Error message is %s&quot;, result.getErrCode(), result.getErrMsg()));
+                    }
+                }
+            }
+        }
+    }
+}
+</code></pre>
+</li>
+<li>
+<p>PushConsumer</p>
+<pre><code>public class PushConsumerExample {
+
+    public static void main(String[] args) throws Throwable {
+        final String localHostIP = &quot;127.0.0.1&quot;;
+        final String masterHostAndPort = &quot;localhost:8000&quot;;
+        final String topic = &quot;test&quot;;
+        final String group = &quot;test-group&quot;;
+        final ConsumerConfig consumerConfig = new ConsumerConfig(localHostIP, masterHostAndPort, group);
+        /* consumeModel
+         *  Set the start position of the consumer group. The value can be [-1, 0, 1]. Default value is 0.
+         * -1: Start from 0 for the first time. Otherwise start from last consume position.
+         *  0: Start from the latest position for the first time. Otherwise start from last consume position.
+         *  1: Start from the latest consume position.
+        */
+        consumerConfig.setConsumeModel(0);
+        final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(consumerConfig);
+        final PushMessageConsumer pushConsumer = messageSessionFactory.createPushConsumer(consumerConfig);
+        pushConsumer.subscribe(topic, null, new MessageListener() {
+
+            @Override
+            public void receiveMessages(List&lt;Message&gt; messages) throws InterruptedException {
+                for (Message message : messages) {
+                    System.out.println(&quot;received message : &quot; + new String(message.getData()));
+                }
+            }
+
+            @Override
+            public Executor getExecutor() {
+                return null;
+            }
+
+            @Override
+            public void stop() {
+                //
+            }
+        });
+        pushConsumer.completeSubscribe();
+        CountDownLatch latch = new CountDownLatch(1);
+        latch.await(10, TimeUnit.MINUTES);
+    }
+}
+</code></pre>
+</li>
+</ol>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><div class="cols-container"><div class="col col-24"><p>Apache TubeMQ (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with othe [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script src="https://buttons.github.io/buttons.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
diff --git a/zh-cn/docs/consumer_example.json b/zh-cn/docs/consumer_example.json
new file mode 100644
index 0000000..cbe7bab
--- /dev/null
+++ b/zh-cn/docs/consumer_example.json
@@ -0,0 +1,6 @@
+{
+  "filename": "consumer_example.md",
+  "__html": "<h2>Consumer Example</h2>\n<p>TubeMQ provides two ways to consumer message, PullConsumer and PushConsumer:</p>\n<ol>\n<li>\n<p>PullConsumer</p>\n<pre><code>public class PullConsumerExample {\n\n    public static void main(String[] args) throws Throwable {\n        final String localHostIP = &quot;127.0.0.1&quot;;\n        final String masterHostAndPort = &quot;localhost:8000&quot;;\n        final String topic = &quot;test&quot;;\n        final String group = &quot;test-group [...]
+  "link": "/zh-cn/docs/consumer_example.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/contact.html b/zh-cn/docs/contact.html
index e9ef79d..3c95718 100644
--- a/zh-cn/docs/contact.html
+++ b/zh-cn/docs/contact.html
@@ -12,13 +12,10 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
-<p><a href="https://travis-ci.org/apache/incubator-tubemq"><img src="https://travis-ci.org/apache/incubator-tubemq.svg?branch=master" alt="Build Status"></a></p>
-<p>Apache TubeMQ (incubating) is a trillion-records-scale distributed messaging queue (MQ) system, focuses on data transmission and storage under massive data. Compared to many open source MQ projects, TubeMQ has unique advantages in terms of stability, performance, and low cost.</p>
-<h2>Contact</h2>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <ul>
-<li>Mailing lists</li>
-</ul>
+<li>
+<p>Mailing lists</p>
 <table>
 <thead>
 <tr>
@@ -39,13 +36,16 @@
 </tr>
 </tbody>
 </table>
-<ul>
-<li>Issue management
-<a href="https://issues.apache.org/jira/browse/TubeMQ">See JIRA</a></li>
-</ul>
-<h2>Build and Deploy</h2>
-<ul>
-<li><a href="./docs/tubemq_user_guide.md">See user guide</a></li>
+</li>
+<li>
+<p>Home page: <a href="https://tubemq.apache.org">https://tubemq.apache.org</a></p>
+</li>
+<li>
+<p>Docs: <a href="https://tubemq.apache.org/en-us/docs/tubemq_user_guide.html">https://tubemq.apache.org/en-us/docs/tubemq_user_guide.html</a></p>
+</li>
+<li>
+<p>Issues: <a href="https://issues.apache.org/jira/browse/TubeMQ">https://issues.apache.org/jira/browse/TubeMQ</a></p>
+</li>
 </ul>
 <h2>License</h2>
 <p>© Contributors Licensed under an <a href="LICENSE">Apache-2.0</a> license.</p>
diff --git a/zh-cn/docs/contact.json b/zh-cn/docs/contact.json
index 1faef00..6fc198d 100644
--- a/zh-cn/docs/contact.json
+++ b/zh-cn/docs/contact.json
@@ -1,6 +1,6 @@
 {
   "filename": "contact.md",
-  "__html": "<h1>Apache TubeMQ</h1>\n<p><a href=\"https://travis-ci.org/apache/incubator-tubemq\"><img src=\"https://travis-ci.org/apache/incubator-tubemq.svg?branch=master\" alt=\"Build Status\"></a></p>\n<p>Apache TubeMQ (incubating) is a trillion-records-scale distributed messaging queue (MQ) system, focuses on data transmission and storage under massive data. Compared to many open source MQ projects, TubeMQ has unique advantages in terms of stability, performance, and low cost.</p>\n [...]
+  "__html": "<h2>Contact us</h2>\n<ul>\n<li>\n<p>Mailing lists</p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">Name</th>\n<th style=\"text-align:left\">Scope</th>\n<th style=\"text-align:left\"></th>\n<th style=\"text-align:left\"></th>\n<th style=\"text-align:left\"></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\"><a href=\"mailto:dev@tubemq.apache.org\">dev@tubemq.apache.org</a></td>\n<td style=\"text-align:left\">Development-related discussions</td>\n<td [...]
   "link": "/zh-cn/docs/contact.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/contribution.html b/zh-cn/docs/contribution.html
index ea2c231..bac487a 100644
--- a/zh-cn/docs/contribution.html
+++ b/zh-cn/docs/contribution.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <p>We use a review-then-commit workflow in TubeMQ for all contributions.</p>
 <p><strong>For larger contributions or those that affect multiple components:</strong></p>
 <ol>
@@ -39,14 +39,22 @@ and project management tool, as well as a way to communicate among a very divers
 <h2>Design</h2>
 <p>To avoid potential frustration during the code review cycle, we encourage you to clearly scope and design non-trivial contributions with the TubeMQ community before you start coding.</p>
 <p>We are using &quot;TubeMQ Improvement Proposals&quot; for managing major changes to TubeMQ. The list of all proposals is maintained in the TubeMQ wiki at <a href="https://cwiki.apache.org/confluence/display/TUBEMQ/TubeMQ+Improvement+Proposals">this page</a>.</p>
-<h2>Code</h2>
-<p>TBD</p>
-<h2>Review</h2>
-<p>TBD</p>
 <h2>Commit (committers only)</h2>
 <p>Once the code has been peer reviewed by a committer, the next step is for the committer to merge it into the Github repo.</p>
 <p>Pull requests should not be merged before the review has approved from at least 1 committer.</p>
 <p>For more about merging pull request, please refer to <a href="https://cwiki.apache.org/confluence/display/TUBEMQ/Merging+Pull+Requests">this page</a></p>
+<h2>Website Contributor List</h2>
+<p>We are very pleased to announce some contributors here. They have made a lot of contributions in the translation of TubeMQ. Thanks again to the following participants.</p>
+<ul>
+<li>deepEvolution</li>
+<li>missy</li>
+<li>min.yang</li>
+<li>goson</li>
+<li>stillcoolme</li>
+<li>tboy</li>
+<li>viviel</li>
+<li>yuecai.liu</li>
+</ul>
 </div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><div class="cols-container"><div class="col col-24"><p>Apache TubeMQ (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with othe [...]
 	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
 	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
diff --git a/zh-cn/docs/contribution.json b/zh-cn/docs/contribution.json
index 1dcad06..9594a0b 100644
--- a/zh-cn/docs/contribution.json
+++ b/zh-cn/docs/contribution.json
@@ -1,6 +1,6 @@
 {
   "filename": "contribution.md",
-  "__html": "<p>The Apache TubeMQ(incubating) community welcomes contributions from anyone with a passion for distributed systems! TubeMQ has many different opportunities for contributions -- write new examples/tutorials, add new user-facing libraries or participate on the documentation effort.</p>\n<p>We use a review-then-commit workflow in TubeMQ for all contributions.</p>\n<p><strong>For larger contributions or those that affect multiple components:</strong></p>\n<ol>\n<li><strong>Eng [...]
+  "__html": "<p>The Apache TubeMQ(incubating) community welcomes contributions from anyone with a passion for distributed systems! TubeMQ has many different opportunities for contributions -- write new examples/tutorials, add new user-facing libraries or participate on the documentation effort.</p>\n<p>We use a review-then-commit workflow in TubeMQ for all contributions.</p>\n<p><strong>For larger contributions or those that affect multiple components:</strong></p>\n<ol>\n<li><strong>Eng [...]
   "link": "/zh-cn/docs/contribution.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/tubemq_config_introduction.html b/zh-cn/docs/deployment.html
similarity index 87%
copy from zh-cn/docs/tubemq_config_introduction.html
copy to zh-cn/docs/deployment.html
index 5665970..06d6365 100644
--- a/zh-cn/docs/tubemq_config_introduction.html
+++ b/zh-cn/docs/deployment.html
@@ -4,20 +4,50 @@
 <head>
 	<meta charset="UTF-8">
 	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-	<meta name="keywords" content="tubemq_config_introduction" />
-	<meta name="description" content="tubemq_config_introduction" />
+	<meta name="keywords" content="deployment" />
+	<meta name="description" content="deployment" />
 	<!-- 网页标签标题 -->
-	<title>tubemq_config_introduction</title>
+	<title>deployment</title>
 	<link rel="shortcut icon" href="/img/apache.ico"/>
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
-<p>The TubeMQ server includes two modules for the Master and the Broker. The Master also includes a Web front-end module for external page access (this part is stored in the resources). Considering the actual deployment, two modules are often deployed in the same machine, TubeMQ. The contents of the three parts of the two modules are packaged and delivered to the operation and maintenance; the client does not include the lib package of the server part and is delivered to the user separat [...]
-<p>Master and Broker use the ini configuration file format, and the relevant configuration files are placed in the master.ini and broker.ini files in the tubemq-server-3.8.0/conf/ directory.</p>
-<p>Their configuration is defined by a set of configuration units. The Master configuration consists of four mandatory units: [master], [zookeeper], [bdbStore], and optional [tlsSetting]. The Broker configuration is mandatory. Broker], [zookeeper] and optional [tlsSetting] consist of a total of 3 configuration units; in actual use, you can also combine the contents of the two configuration files into one ini file.</p>
-<p>In addition to the back-end system configuration file, the Master also stores the Web front-end page module in the resources. The root directory velocity.properties file of the resources is the Web front-end page configuration file of the Master.</p>
-<h2>Configuration item details:</h2>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+<p>The TubeMQ server includes two modules for the Master and the Broker. The Master also includes a Web front-end module for external page access (this part is stored in the resources). Considering the actual deployment, two modules are often deployed in the same machine, TubeMQ. The contents of the three parts of the two modules are packaged and delivered to the operation and maintenance; the client does not include the lib package of the server part and is delivered to the user separately.
+Master and Broker use the ini configuration file format, and the relevant configuration files are placed in the master.ini and broker.ini files in the tubemq-server-3.8.0/conf/ directory.
+Their configuration is defined by a set of configuration units. The Master configuration consists of four mandatory units: [master], [zookeeper], [bdbStore], and optional [tlsSetting]. The Broker configuration is mandatory. Broker], [zookeeper] and optional [tlsSetting] consist of a total of 3 configuration units; in actual use, you can also combine the contents of the two configuration files into one ini file.
+In addition to the back-end system configuration file, the Master also stores the Web front-end page module in the resources. The root directory velocity.properties file of the resources is the Web front-end page configuration file of the Master.</p>
+<h3>Master</h3>
+<p>In real production environment, you need to run multiple master services on different servers for high availability purpose. Here's
+the introduction of availability level.</p>
+<table>
+<thead>
+<tr>
+<th>HA Level</th>
+<th>Master Number</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>High</td>
+<td>3 masters</td>
+<td>After any master crashed, the cluster meta data is still in read/write state and can accept new producers/consumers.</td>
+</tr>
+<tr>
+<td>Medium</td>
+<td>2 masters</td>
+<td>After one master crashed, the cluster meta data is in read only state. There's no affect on existing producers and consumers.</td>
+</tr>
+<tr>
+<td>Minimum</td>
+<td>1 master</td>
+<td>After the master crashed, there's no affect on existing producer and consumer.</td>
+</tr>
+</tbody>
+</table>
+<p>Please notice that the master servers should be clock synchronized.</p>
+<h3>Master Configuration item details:</h3>
 <h3>master.ini file:</h3>
 <p>[master]</p>
 <blockquote>
@@ -372,6 +402,9 @@
 </tr>
 </tbody>
 </table>
+<h3>Broker</h3>
+<p>In real production environment, you need to run multiple at least 2 broker services on different servers for high availability purpose.</p>
+<h3>Broker Configuration item details:</h3>
 <h3>broker.ini file:</h3>
 <p>[broker]</p>
 <blockquote>
@@ -649,8 +682,6 @@
 </tr>
 </tbody>
 </table>
-<hr>
-<p><a href="#top">Back to top</a></p>
 </div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><div class="cols-container"><div class="col col-24"><p>Apache TubeMQ (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with othe [...]
 	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
 	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
diff --git a/zh-cn/docs/deployment.json b/zh-cn/docs/deployment.json
new file mode 100644
index 0000000..564e221
--- /dev/null
+++ b/zh-cn/docs/deployment.json
@@ -0,0 +1,6 @@
+{
+  "filename": "deployment.md",
+  "__html": "<h2>Deployment</h2>\n<p>The TubeMQ server includes two modules for the Master and the Broker. The Master also includes a Web front-end module for external page access (this part is stored in the resources). Considering the actual deployment, two modules are often deployed in the same machine, TubeMQ. The contents of the three parts of the two modules are packaged and delivered to the operation and maintenance; the client does not include the lib package of the server part an [...]
+  "link": "/zh-cn/docs/deployment.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/http_access_API_definition.html b/zh-cn/docs/http_access_API_definition.html
index 0ee0f79..ee83bf8 100644
--- a/zh-cn/docs/http_access_API_definition.html
+++ b/zh-cn/docs/http_access_API_definition.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <h2>Master metadata configuration API</h2>
 <h3><code>admin_online_broker_configure</code></h3>
 <p>The online configuration of the Brokers are new or offline. The configuration of Topics are distributed to related Brokers as well.</p>
diff --git a/zh-cn/docs/producer_example.html b/zh-cn/docs/producer_example.html
new file mode 100644
index 0000000..d77a28f
--- /dev/null
+++ b/zh-cn/docs/producer_example.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="producer_example" />
+	<meta name="description" content="producer_example" />
+	<!-- 网页标签标题 -->
+	<title>producer_example</title>
+	<link rel="shortcut icon" href="/img/apache.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+<p>TubeMQ provides two ways to initialize session factory, TubeSingleSessionFactory and TubeMultiSessionFactory:</p>
+<ul>
+<li>TubeSingleSessionFactory creates only one session in the lifecycle, this is very useful in streaming scenarios.</li>
+<li>TubeMultiSessionFactory creates new session on every call.</li>
+</ul>
+<ol>
+<li>TubeSingleSessionFactory
+<ul>
+<li>
+<p>Send Message Synchronously</p>
+<pre><code>public final class SyncProducerExample {
+
+   public static void main(String[] args) throws Exception{
+       final String localHostIP = &quot;127.0.0.1&quot;;
+       final String masterHostAndPort = &quot;localhost:8000&quot;;
+       final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+       final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+       final MessageProducer messageProducer = messageSessionFactory.createProducer();
+       final String topic = &quot;test&quot;;
+       final String body = &quot;This is a test message from single-session-factory!&quot;;
+       byte[] bodyData = StringUtils.getBytesUtf8(body);
+       messageProducer.publish(topic);
+       Message message = new Message(topic, bodyData);
+       MessageSentResult result = messageProducer.sendMessage(message);
+       if (result.isSuccess()) {
+           System.out.println(&quot;sync send message : &quot; + message);
+       }
+       messageProducer.shutdown();
+   }
+}
+</code></pre>
+</li>
+<li>
+<p>Send Message Asynchronously</p>
+<pre><code>public final class AsyncProducerExample {
+
+    public static void main(String[] args) throws Throwable {
+        final String localHostIP = &quot;127.0.0.1&quot;;
+        final String masterHostAndPort = &quot;localhost:8000&quot;;
+        final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+        final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+        final MessageProducer messageProducer = messageSessionFactory.createProducer();
+        final String topic = &quot;test&quot;;
+        final String body = &quot;async send message from single-session-factory!&quot;;
+        byte[] bodyData = StringUtils.getBytesUtf8(body);
+        messageProducer.publish(topic);
+        Message message = new Message(topic, bodyData);
+        messageProducer.sendMessage(message, new MessageSentCallback(){
+            @Override
+            public void onMessageSent(MessageSentResult result) {
+                if (result.isSuccess()) {
+                    System.out.println(&quot;async send message : &quot; + message);
+                } else {
+                    System.out.println(&quot;async send message failed : &quot; + result.getErrMsg());
+                }
+            }
+            @Override
+            public void onException(Throwable e) {
+                System.out.println(&quot;async send message error : &quot; + e);
+            }
+        });
+        messageProducer.shutdown();
+    }
+}
+</code></pre>
+</li>
+<li>
+<p>Send Message With Attributes</p>
+<pre><code>public final class ProducerWithAttributeExample {
+
+    public static void main(String[] args) throws Throwable {
+        final String localHostIP = &quot;127.0.0.1&quot;;
+        final String masterHostAndPort = &quot;localhost:8000&quot;;
+        final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+        final MessageSessionFactory messageSessionFactory = new TubeSingleSessionFactory(clientConfig);
+        final MessageProducer messageProducer = messageSessionFactory.createProducer();
+        final String topic = &quot;test&quot;;
+        final String body = &quot;send message with attribute from single-session-factory!&quot;;
+        byte[] bodyData = StringUtils.getBytesUtf8(body);
+        messageProducer.publish(topic);
+        Message message = new Message(topic, bodyData);
+        //set attribute
+        message.setAttrKeyVal(&quot;test_key&quot;, &quot;test value&quot;);
+        //msgType is used for consumer filtering, and msgTime(accurate to minute) is used as the pipe to send and receive statistics
+        SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyyMMddHHmm&quot;);
+        message.putSystemHeader(&quot;test&quot;, sdf.format(new Date()));
+        messageProducer.sendMessage(message);
+        messageProducer.shutdown();
+    }
+}
+</code></pre>
+</li>
+</ul>
+</li>
+</ol>
+<ul>
+<li>
+<p>TubeMultiSessionFactory</p>
+<pre><code>public class MultiSessionProducerExample {
+    
+    public static void main(String[] args) throws Exception{
+        final int SESSION_FACTORY_NUM = 10;
+        final String localHostIP = &quot;127.0.0.1&quot;;
+        final String masterHostAndPort = &quot;localhost:8000&quot;;
+        final TubeClientConfig clientConfig = new TubeClientConfig(localHostIP, masterHostAndPort);
+        final List&lt;MessageSessionFactory&gt; sessionFactoryList = new ArrayList&lt;&gt;(SESSION_FACTORY_NUM);
+        final ExecutorService sendExecutorService = Executors.newFixedThreadPool(SESSION_FACTORY_NUM);
+        final CountDownLatch latch = new CountDownLatch(SESSION_FACTORY_NUM);
+        for (int i = 0; i &lt; SESSION_FACTORY_NUM; i++) {
+            TubeMultiSessionFactory tubeMultiSessionFactory = new TubeMultiSessionFactory(clientConfig);
+            sessionFactoryList.add(tubeMultiSessionFactory);
+            MessageProducer producer = tubeMultiSessionFactory.createProducer();
+            Sender sender = new Sender(producer, latch);
+            sendExecutorService.submit(sender);
+        }
+        latch.await();
+        sendExecutorService.shutdownNow();
+        for(MessageSessionFactory sessionFactory : sessionFactoryList){
+            sessionFactory.shutdown();
+        }
+    }
+
+    private static class Sender implements Runnable {
+        
+        private MessageProducer producer;
+        
+        private CountDownLatch latch;
+
+        public Sender(MessageProducer producer, CountDownLatch latch) {
+            this.producer = producer;
+            this.latch = latch;
+        }
+
+        @Override
+        public void run() {
+            final String topic = &quot;test&quot;;
+            try {
+                producer.publish(topic);
+                final byte[] bodyData = StringUtils.getBytesUtf8(&quot;This is a test message from multi-session factory&quot;);
+                Message message = new Message(topic, bodyData);
+                producer.sendMessage(message);
+                producer.shutdown();
+            } catch (Throwable ex) {
+                System.out.println(&quot;send message error : &quot; + ex);
+            } finally {
+                latch.countDown();
+            }
+        }
+    }
+}
+</code></pre>
+</li>
+</ul>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><div class="cols-container"><div class="col col-24"><p>Apache TubeMQ (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with othe [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script src="https://buttons.github.io/buttons.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
diff --git a/zh-cn/docs/producer_example.json b/zh-cn/docs/producer_example.json
new file mode 100644
index 0000000..12ed82c
--- /dev/null
+++ b/zh-cn/docs/producer_example.json
@@ -0,0 +1,6 @@
+{
+  "filename": "producer_example.md",
+  "__html": "<h2>Producer Example</h2>\n<p>TubeMQ provides two ways to initialize session factory, TubeSingleSessionFactory and TubeMultiSessionFactory:</p>\n<ul>\n<li>TubeSingleSessionFactory creates only one session in the lifecycle, this is very useful in streaming scenarios.</li>\n<li>TubeMultiSessionFactory creates new session on every call.</li>\n</ul>\n<ol>\n<li>TubeSingleSessionFactory\n<ul>\n<li>\n<p>Send Message Synchronously</p>\n<pre><code>public final class SyncProducerExamp [...]
+  "link": "/zh-cn/docs/producer_example.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/tubemq_user_guide.html b/zh-cn/docs/quick_start.html
similarity index 87%
copy from zh-cn/docs/tubemq_user_guide.html
copy to zh-cn/docs/quick_start.html
index 27f5212..4aea203 100644
--- a/zh-cn/docs/tubemq_user_guide.html
+++ b/zh-cn/docs/quick_start.html
@@ -4,16 +4,15 @@
 <head>
 	<meta charset="UTF-8">
 	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-	<meta name="keywords" content="tubemq_user_guide" />
-	<meta name="description" content="tubemq_user_guide" />
+	<meta name="keywords" content="quick_start" />
+	<meta name="description" content="quick_start" />
 	<!-- 网页标签标题 -->
-	<title>tubemq_user_guide</title>
+	<title>quick_start</title>
 	<link rel="shortcut icon" href="/img/apache.ico"/>
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
-<h2>Prerequisites</h2>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <ul>
 <li>Java 1.7 or 1.8(Java 9 and above haven't been verified yet)</li>
 <li>Maven</li>
@@ -157,37 +156,6 @@ server IPs in this way, assume the ip is <code>192.168.1.2</code>:</p>
 <h5>/etc/hosts</h5>
 <pre><code>192.168.1.2 192-168-1-2
 </code></pre>
-<h2>High Availability</h2>
-<p>In the example above, we run the services on a single node. However, in real production environment, you
-need to run multiple master services on different servers for high availability purpose. Here's
-the introduction of availability level.</p>
-<table>
-<thead>
-<tr>
-<th>HA Level</th>
-<th>Master Number</th>
-<th>Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>High</td>
-<td>3 masters</td>
-<td>After any master crashed, the cluster meta data is still in read/write state and can accept new producers/consumers.</td>
-</tr>
-<tr>
-<td>Medium</td>
-<td>2 masters</td>
-<td>After one master crashed, the cluster meta data is in read only state. There's no affect on existing producers and consumers.</td>
-</tr>
-<tr>
-<td>Minimum</td>
-<td>1 master</td>
-<td>After the master crashed, there's no affect on existing producer and consumer.</td>
-</tr>
-</tbody>
-</table>
-<p>Please notice that the master servers should be clock synchronized.</p>
 <h2>Start Master</h2>
 <p>After update the config file, please go to the <code>bin</code> folder and run this command to start
 the master service.</p>
@@ -195,12 +163,12 @@ the master service.</p>
 </code></pre>
 <p>You should be able to access <code>http://your-master-ip:8080/config/topic_list.htm</code> to see the
 web GUI now.</p>
-<p><img src="./img/tubemq-console-gui.png" alt="TubeMQ Console GUI"></p>
+<p><img src="img/tubemq-console-gui.png" alt="TubeMQ Console GUI"></p>
 <h2>Start Broker</h2>
 <p>Before we start a broker service, we need to configure it on master web GUI first.</p>
 <p>Go to the <code>Broker List</code> page, click <code>Add Single Broker</code>, and input the new broker
 information.</p>
-<p><img src="./img/tubemq-add-broker-1.png" alt="Add Broker 1"></p>
+<p><img src="img/tubemq-add-broker-1.png" alt="Add Broker 1"></p>
 <p>In this example, we only need to input broker IP and authToken:</p>
 <ol>
 <li>broker IP: broker server ip</li>
@@ -208,27 +176,27 @@ information.</p>
 <code>confModAuthToken</code> field in your <code>master.ini</code> file.</li>
 </ol>
 <p>Click the online link to activate the new added broker.</p>
-<p><img src="./img/tubemq-add-broker-2.png" alt="Add Broker 2"></p>
+<p><img src="img/tubemq-add-broker-2.png" alt="Add Broker 2"></p>
 <p>Go to the broker server, under the <code>bin</code> folder run this command to start the broker service</p>
 <pre><code class="language-bash">./broker.sh start
 </code></pre>
 <p>Refresh the GUI broker list page, you can see that the broker now is registered.</p>
 <p>After the sub-state of the broker changed to <code>idle</code>, we can add topics to that broker.</p>
-<p><img src="./img/tubemq-add-broker-3.png" alt="Add Broker 3"></p>
+<p><img src="img/tubemq-add-broker-3.png" alt="Add Broker 3"></p>
 <h2>Add Topic</h2>
 <p>We can add or manage the cluster topics on the web GUI. To add a new topic, go to the
 topic list page and click the add new topic button</p>
-<p><img src="./img/tubemq-add-topic-1.png" alt="Add Topic 1"></p>
+<p><img src="img/tubemq-add-topic-1.png" alt="Add Topic 1"></p>
 <p>Then select the brokers which you want to deploy the topics to.</p>
-<p><img src="./img/tubemq-add-topic-5.png" alt="Add Topic 5"></p>
+<p><img src="img/tubemq-add-topic-5.png" alt="Add Topic 5"></p>
 <p>We can see the publish and subscribe state of the new added topic is still grey. We need
 to go to the broker list page to reload the broker configuration.</p>
-<p><img src="./img/tubemq-add-topic-6.png" alt="Add Topic 6"></p>
-<p><img src="./img/tubemq-add-topic-2.png" alt="Add Topic 2"></p>
+<p><img src="img/tubemq-add-topic-6.png" alt="Add Topic 6"></p>
+<p><img src="img/tubemq-add-topic-2.png" alt="Add Topic 2"></p>
 <p>When the broker sub-state changed to idle, go to the topic list page. We can see
 that the topic publish/subscribe state is active now.</p>
-<p><img src="./img/tubemq-add-topic-3.png" alt="Add Topic 3"></p>
-<p><img src="./img/tubemq-add-topic-4.png" alt="Add Topic 4"></p>
+<p><img src="img/tubemq-add-topic-3.png" alt="Add Topic 3"></p>
+<p><img src="img/tubemq-add-topic-4.png" alt="Add Topic 4"></p>
 <p>Now we can use the topic to send messages.</p>
 <h2>Demo</h2>
 <p>Now we can run the example to test our cluster. First let's run the produce data demo. Please don't
diff --git a/zh-cn/docs/quick_start.json b/zh-cn/docs/quick_start.json
new file mode 100644
index 0000000..4880541
--- /dev/null
+++ b/zh-cn/docs/quick_start.json
@@ -0,0 +1,6 @@
+{
+  "filename": "quick_start.md",
+  "__html": "<h2>Prerequisites</h2>\n<ul>\n<li>Java 1.7 or 1.8(Java 9 and above haven't been verified yet)</li>\n<li>Maven</li>\n<li><a href=\"https://github.com/protocolbuffers/protobuf/releases/tag/v2.5.0\">protoc 2.5.0</a></li>\n</ul>\n<h2>Build</h2>\n<h3>Build distribution tarball</h3>\n<p>Go to the project root, and run</p>\n<pre><code class=\"language-bash\">mvn clean package -DskipTests\n</code></pre>\n<p>If you want to build each module of the project separately, you need to run  [...]
+  "link": "/zh-cn/docs/quick_start.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/tubemq_basic_introduction_cn.html b/zh-cn/docs/tubemq_basic_introduction_cn.html
index 1d335cf..bb2261d 100644
--- a/zh-cn/docs/tubemq_basic_introduction_cn.html
+++ b/zh-cn/docs/tubemq_basic_introduction_cn.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <blockquote>
 <p>TubeMQ是腾讯大数据在2013年开始研发的分布式消息中间件系统(MQ),专注服务大数据场景下海量数据的高性能存储和传输。经过近7年上万亿的海量数据沉淀,较之于众多的开源MQ组件,TubeMQ在海量实践(稳定性+性能)和低成本方面有一定的优势,近期我们在开源TubeMQ的相关代码及设计,更多资料正在陆续整理和上传之中。更多疑问,请联系: <a href="mailto:gosonzhang@tencent.com">gosonzhang@tencent.com</a>, <a href="mailto:junpingdu@tencent.com">junpingdu@tencent.com</a></p>
 </blockquote>
diff --git a/zh-cn/docs/tubemq_clients_cn.html b/zh-cn/docs/tubemq_clients_cn.html
index 8d35e67..58c524d 100644
--- a/zh-cn/docs/tubemq_clients_cn.html
+++ b/zh-cn/docs/tubemq_clients_cn.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <hr>
 <h3><strong>1. 基础对象接介绍:</strong></h3>
 <h4><strong>a) MessageSessionFactory(消息会话工厂):</strong></h4>
diff --git a/zh-cn/docs/tubemq_config_introduction.html b/zh-cn/docs/tubemq_config_introduction.html
index 5665970..1b49cd8 100644
--- a/zh-cn/docs/tubemq_config_introduction.html
+++ b/zh-cn/docs/tubemq_config_introduction.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <p>The TubeMQ server includes two modules for the Master and the Broker. The Master also includes a Web front-end module for external page access (this part is stored in the resources). Considering the actual deployment, two modules are often deployed in the same machine, TubeMQ. The contents of the three parts of the two modules are packaged and delivered to the operation and maintenance; the client does not include the lib package of the server part and is delivered to the user separat [...]
 <p>Master and Broker use the ini configuration file format, and the relevant configuration files are placed in the master.ini and broker.ini files in the tubemq-server-3.8.0/conf/ directory.</p>
 <p>Their configuration is defined by a set of configuration units. The Master configuration consists of four mandatory units: [master], [zookeeper], [bdbStore], and optional [tlsSetting]. The Broker configuration is mandatory. Broker], [zookeeper] and optional [tlsSetting] consist of a total of 3 configuration units; in actual use, you can also combine the contents of the two configuration files into one ini file.</p>
diff --git a/zh-cn/docs/tubemq_console_introduction_cn.html b/zh-cn/docs/tubemq_console_introduction_cn.html
index ac08068..138812f 100644
--- a/zh-cn/docs/tubemq_console_introduction_cn.html
+++ b/zh-cn/docs/tubemq_console_introduction_cn.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <h2>管控台关系</h2>
 <p>​        TubeMQ管控台是管理TubeMQ集群的简单运营工具,包括集群里的Master、Broker,以及Broker上部署的Topic元数据等与TubeMQ系统相关的运营数据及操作。需要说明的是,当前提供的TubeMQ前台所提供的功能没有涵盖TubeMQ所提供的功能范围,大家可以参照《TubeMQ HTTP访问接口定义.xls》定义自行实现符合业务需要的管控前台。TubeMQ管控台的访问地址为http://portal:webport/config/topic_list.htm:
 <img src="img/console/1568169770714.png" alt="">
diff --git a/zh-cn/docs/tubemq_error_status_introduction_cn.html b/zh-cn/docs/tubemq_error_status_introduction_cn.html
index 2d917ad..4170f93 100644
--- a/zh-cn/docs/tubemq_error_status_introduction_cn.html
+++ b/zh-cn/docs/tubemq_error_status_introduction_cn.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <p>​        TubeMQ采用的是 错误码(errCode) + 错误详情(errMsg) 相结合的方式返回具体的操作结果。首先根据错误码确定是哪类问题,然后根据错误详情来确定具体的错误原因。表格汇总了所有的错误码以及运行中大家可能遇到的错误详情的相关对照。</p>
 <h2>错误码</h2>
 <table>
diff --git a/zh-cn/docs/tubemq_perf_test_vs_Kafka_cn.html b/zh-cn/docs/tubemq_perf_test_vs_Kafka_cn.html
index a098870..34d2567 100644
--- a/zh-cn/docs/tubemq_perf_test_vs_Kafka_cn.html
+++ b/zh-cn/docs/tubemq_perf_test_vs_Kafka_cn.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <h2>背景</h2>
 <p>TubeMQ是腾讯大数据自研的分布式消息中间件。其系统架构思想源于<a href="http://kafka.apache.org/">Apache Kafka</a>。在实现上,则完全采取自适应的方式,结合实战做了很多优化及研发工作,如分区管理、分配机制和全新节点通讯流程,自主开发高性能的底层RPC通讯模块等。
 这些实现使得TubeMQ在保证实时性和一致性的前提下,具有很好的健壮性及更高的吞吐能力。结合目前主流消息中间件使用情况,以Kafka为参照做性能对比测试,对比常规应用场景下两套系统性能。</p>
diff --git a/zh-cn/docs/tubemq_user_guide.html b/zh-cn/docs/tubemq_user_guide.html
index 27f5212..5bd46b4 100644
--- a/zh-cn/docs/tubemq_user_guide.html
+++ b/zh-cn/docs/tubemq_user_guide.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/documentation.css" />
 </head>
 <body>
-	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><a href="//www.apache.org"><img class="logo apache" style="width:120px" src="/img/asf_logo.svg"/></a><div class="logo-split"></div><img class="logo tube" style="width:72px" src="/img/Tube logo.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-sw [...]
 <h2>Prerequisites</h2>
 <ul>
 <li>Java 1.7 or 1.8(Java 9 and above haven't been verified yet)</li>