You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@eventmesh.apache.org by mi...@apache.org on 2021/06/26 08:55:36 UTC

[incubator-eventmesh] branch 1.2.0-release updated: update 1.2.0-release branch code (#399)

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

mikexue pushed a commit to branch 1.2.0-release
in repository https://gitbox.apache.org/repos/asf/incubator-eventmesh.git


The following commit(s) were added to refs/heads/1.2.0-release by this push:
     new ad3f7ff  update 1.2.0-release branch code (#399)
ad3f7ff is described below

commit ad3f7ff0aba8b48a6458d2e2ee2b8cae9ba79d47
Author: mike_xwm <mi...@126.com>
AuthorDate: Sat Jun 26 16:55:30 2021 +0800

    update 1.2.0-release branch code (#399)
    
    * update build.gradle and gradle.properties for publish to maven repository (#330)
    
    * [ISSUE #325]Update gradle configuration for publishing package to maven repository
    
    * update build.gradle
    
    * update build.gradle and gradle.properties
    
    * update build.gradle and gradle.properties for publish to maven repository
    
    * Update README.md
    
    * Update README.zh-CN.md
    
    * update quickstart md files for gradle version (#332)
    
    * [ISSUE #325]Update gradle configuration for publishing package to maven repository
    
    * update build.gradle
    
    * update build.gradle and gradle.properties
    
    * update build.gradle and gradle.properties for publish to maven repository
    
    * * update gradle version for instructions
    * fix: dist task exception
    
    * remove dead docs
    
    Signed-off-by: qqeasonchen <qq...@gmail.com>
    
    * [ISSUE #329]Missing Log4j dependency (#336)
    
    * [ISSUE #325]Update gradle configuration for publishing package to maven repository
    
    * update build.gradle
    
    * update build.gradle and gradle.properties
    
    * update build.gradle and gradle.properties for publish to maven repository
    
    * * update gradle version for instructions
    * fix: dist task exception
    
    * [ISSUE #329]Missing Log4j dependency
    
    * [ISSUE #331] Fix dead links in docs (#334)
    
    fixed #331
    
    * Doc modification #328 (#335)
    
    change vm params
    
    * Update README.md
    
    * [Issue #337] Fix Http Test Subscriber startup issue by moving the Thread.sleep into the child thread (#338)
    
    * [Issue #337] Fix HttpSubscriber startup issue
    
    * [Issue #337] test commit
    
    * [Issue #337] revert test commit
    
    Co-authored-by: j00441484 <ji...@huawei.com>
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook (#343)
    
    * [Issue #337] Fix HttpSubscriber startup issue
    
    * [Issue #337] test commit
    
    * [Issue #337] revert test commit
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook
    
    * [Issue #337] Address code review comment for Subscriber Demo App
    
    Co-authored-by: j00441484 <ji...@huawei.com>
    
    * [ISSUE #348] Setup automated workflows for greetings (#347)
    
    * Setup automated workflows for greetings
    
    * Remove '@apache/eventmesh-committers'
    
    * Add LGTM Badges ISSUE#353 (#354)
    
    LGTM is a variant analysis platform that automatically checks code for real CVEs and vulnerabilities. Learn more at https://lgtm.com/help/lgtm/about-lgtm .
    
    Here are some alerts in our project reported by LGTM: https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/?mode=list
    
    I'd like to add LGTM badges in the README.md, it makes easier for people who want to get alerts and then contribute to EventMesh.
    
    * [ISSUE #355] Setup Github workflows for CodeQL scans (#356)
    
    * Setup CodeQL scans
    
    * disable autorun
    
    * add a step for setting up JDK
    
    * add codeql
    
    * fix step Build
    
    * fix strategy
    
    * add events: schedule & workflow_dispatch
    
    * [Issue #344] Fixing racing condition issue in SubscribeProcessor and UnSubscribeProcessor (#345)
    
    * [Issue #337] Fix HttpSubscriber startup issue
    
    * [Issue #337] test commit
    
    * [Issue #337] revert test commit
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook
    
    * [Issue #344] Fixing racing condition issue in SubscribeProcessor and UnSubscribeProcessor
    
    * [Issue #344] Fix import statements
    
    * [Issue #337] Address code review comment for Subscriber Demo App
    
    * [Issue #344] Enhance client registration logic in SubscribeProcessor and UnsubscriberProcessor
    
    * [Issue #344] Minor code clean up in SubscribeProcessor and UnsubscriberProcessor
    
    * [Issue #344] Fix NullPointerException in ConsumerManager occurs during subscribe/unsunscribe iteration testing
    
    * [Issue #344] Fix bugs in subscribe/unsunscribe code path
    
    * [Issue #344] use client.pid instead of client.ip for client comparasion in UnSubscribeProcessor
    
    Co-authored-by: j00441484 <ji...@huawei.com>
    
    * update eventmesh-runtime.png (#358)
    
    * update eventmesh-runtime.png
    
    * [Issue #333] Support multiple load balance strategy in sdk (#342)
    
    * Support multiple load balance strategy in sdk #333
    
    * Fix ut
    
    * add log
    
    * update eventmesh-panels.png (#362)
    
    * [ISSUE #325]Update gradle configuration for publishing package to maven repository
    
    * update build.gradle
    
    * update build.gradle and gradle.properties
    
    * update build.gradle and gradle.properties for publish to maven repository
    
    * * update gradle version for instructions
    * fix: dist task exception
    
    * [ISSUE #329]Missing Log4j dependency
    
    * update eventmesh-runtime.png
    
    * update eventmesh-panels.png
    
    * update eventmesh-panels.png (#363)
    
    * [ISSUE #325]Update gradle configuration for publishing package to maven repository
    
    * update build.gradle
    
    * update build.gradle and gradle.properties
    
    * update build.gradle and gradle.properties for publish to maven repository
    
    * * update gradle version for instructions
    * fix: dist task exception
    
    * [ISSUE #329]Missing Log4j dependency
    
    * update eventmesh-runtime.png
    
    * update eventmesh-panels.png
    
    * Migrate CI to Github Actions and enable coverage report (#365)
    
    * add: requirements for lightweight EventMesh SDK with CloudEvents (#370)
    
    This commit only includes a brief introduction and requirements.
    Design details can be followed up in a later commit.
    
    Signed-off-by: Yuzhou Mao <my...@umich.edu>
    
    * Add files via upload
    
    * Update README.md
    
    * [Issue #368] Fix Racing condition and memory leak issue in EventMesh SDK LiteConsumer and LiteProducer (#369)
    
    * [Issue #337] Fix HttpSubscriber startup issue
    
    * [Issue #337] test commit
    
    * [Issue #337] revert test commit
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook
    
    * [Issue #337] Address code review comment for Subscriber Demo App
    
    * [Issue #368] Fix Racing condition and memory leak issue in EventMesh SDK LiteConsumer and LiteProducer
    
    * [Issue #368] fix build issue
    
    * [Issue #368] use try with resource statement for HttpClient
    
    * [Issue #368] fix TLS1.1 and use TLS1.2 in HttpClient
    
    Co-authored-by: j00441484 <ji...@huawei.com>
    
    * [ISSUE #350]optimize flow control in downstreaming msg (#352)
    
    * modify:optimize flow control in downstreaming msg
    
    * modify:optimize stategy of selecting session in downstream msg
    
    * modify:optimize msg downstream,msg store in session
    
    * modify:fix bug:not a @Sharable handler
    
    * [ISSUE #380] Remove gitee-mirror.yml from Github workflows (#381)
    
    * Update README.md
    
    * [ISSUE #310] add github action for check license (#313)
    
    * add github action for check license
    
    * fix syntax and name ci for Check license
    
    * fix github action branch typo
    
    * [ISSUE #310] Enable Github Actions for license check and fix license headers (#377)
    
    * add github action for check license
    
    * fix syntax and name ci for Check license
    
    * fix github action branch typo
    
    * enable github actions for license check
    
    * add necessary headers
    
    * update badges
    
    Co-authored-by: Lan Liang <gc...@gmail.com>
    
    * [Issue #382] Fix java.lang.NumberFormatException when parsing Long (#383)
    
    * [Issue #337] Fix HttpSubscriber startup issue
    
    * [Issue #337] test commit
    
    * [Issue #337] revert test commit
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook
    
    * [Issue #337] Address code review comment for Subscriber Demo App
    
    * [Issue #368] Fix Racing condition and memory leak issue in EventMesh SDK LiteConsumer and LiteProducer
    
    * [Issue #368] fix build issue
    
    * [Issue #368] use try with resource statement for HttpClient
    
    * [Issue #368] fix TLS1.1 and use TLS1.2 in HttpClient
    
    * [Issue #382] Fix java.lang.NumberFormatException when parsing Long
    
    * [Issue #382] Fix java.lang.NumberFormatException when parsing Integer
    
    Co-authored-by: j00441484 <ji...@huawei.com>
    
    * [ISSUE #378] downstream broadcast msg asynchronously  (#379)
    
    * modify:optimize flow control in downstreaming msg
    
    * modify:optimize stategy of selecting session in downstream msg
    
    * modify:optimize msg downstream,msg store in session
    
    * modify:fix bug:not a @Sharable handler
    
    * modify:downstream broadcast msg asynchronously
    
    closed #378
    
    * [ISSUE #359] Split handler from controller (#359) (#360)
    
    * [ISSUE #359] Split handler from controller (#359)
    
    * add license header
    
    * add ut
    
    * [ISSUE #384] RedirectClientByIpPortHandlerTest.java doesn't have the Apache license header (#385)
    
    close #384
    
    * Update README.md
    
    * Update README.zh-CN.md
    
    * Update README.zh-CN.md
    
    * Update README.zh-CN.md
    
    * [Issue #386] fixing ConsumerGroup Queue Consumer Offset not synced up issue (#387)
    
    * [Issue #337] Fix HttpSubscriber startup issue
    
    * [Issue #337] test commit
    
    * [Issue #337] revert test commit
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook
    
    * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook
    
    * [Issue #337] Address code review comment for Subscriber Demo App
    
    * [Issue #386] fixing ConsumerGroup Queuen Consumer Offset not synced up issue
    
    * [Issue #386] adding license header to new file
    
    * [Issue #386] Fix license header missing issue
    
    Co-authored-by: j00441484 <ji...@huawei.com>
    
    * [ISSUE #366 ] remove custom-format topic concept (#388)
    
    * remove custom-format topic concept
    
    * remove custom-format topic concept
    
    * remove custom-format topic concept
    
    * remove custom-format topic concept
    
    * remove custom-format topic concept
    
    * remove custom-format topic concept
    
    * remove custom-format topic concept
    
    * [ISSUE #366] remove custom concept [dcn&&region] (#390)
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    close #366
    
    * [ISSUE #391] Optimize interface design in eventmesh-connector-api (#392)
    
    * modify:optimize flow control in downstreaming msg
    
    * modify:optimize stategy of selecting session in downstream msg
    
    * modify:optimize msg downstream,msg store in session
    
    * modify:fix bug:not a @Sharable handler
    
    * modify:downstream broadcast msg asynchronously
    
    * modify:remove unneccessary interface in eventmesh-connector-api
    
    * modify:fix conflict
    
    * modify:add license in EventMeshAction
    close #391
    
    * miss group name set for userAgent (#395)
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * remove custom concept{dcn}
    
    * bugfix : miss group set
    
    * bugfix : miss group set
    
    * [ISSUE #393]:perf topic name in test file (#394)
    
    close #393
    
    * support unsubscribe topics while delconsumer in http mode (#396)
    
    * [ISSUE #325]Update gradle configuration for publishing package to maven repository
    
    * update build.gradle
    
    * update build.gradle and gradle.properties
    
    * update build.gradle and gradle.properties for publish to maven repository
    
    * * update gradle version for instructions
    * fix: dist task exception
    
    * [ISSUE #329]Missing Log4j dependency
    
    * update eventmesh-runtime.png
    
    * support unsubscribe topics while delconsumer in http mode
    
    * [ISSUE #397]Remove subscription session failed error (#398)
    
    * [ISSUE #325]Update gradle configuration for publishing package to maven repository
    
    * update build.gradle
    
    * update build.gradle and gradle.properties
    
    * update build.gradle and gradle.properties for publish to maven repository
    
    * * update gradle version for instructions
    * fix: dist task exception
    
    * [ISSUE #329]Missing Log4j dependency
    
    * update eventmesh-runtime.png
    
    * support unsubscribe topics while delconsumer in http mode
    
    * [ISSUE #397]Remove subscription session failed error
    
    * [ISSUE #397]Remove subscription session failed error
    close #397
    
    * update 1.2.0-release branch code
    
    Co-authored-by: Eason Chen <qq...@gmail.com>
    Co-authored-by: Steve Yurong Su <st...@outlook.com>
    Co-authored-by: ruanwenjun <86...@qq.com>
    Co-authored-by: jinrongluo <ka...@gmail.com>
    Co-authored-by: j00441484 <ji...@huawei.com>
    Co-authored-by: Yuzhou Mao <yu...@gmail.com>
    Co-authored-by: lrhkobe <34...@users.noreply.github.com>
    Co-authored-by: Steve Yurong Su <ro...@apache.org>
    Co-authored-by: Lan <li...@163.com>
    Co-authored-by: Lan Liang <gc...@gmail.com>
    Co-authored-by: nanoxiong <xi...@163.com>
    Co-authored-by: keranbingaa <39...@qq.com>
---
 .coveralls.yml                                     |   1 -
 .github/PULL_REQUEST_TEMPLATE.md                   |   1 +
 .github/workflows/ci.yml                           |  84 +++
 .github/workflows/gitee-mirror.yml                 |  60 --
 .github/workflows/greetings.yml                    |  72 ++
 .licenserc.yaml                                    |  41 ++
 .travis.yml                                        |  15 -
 CONTRIBUTING.md                                    |   8 +-
 CONTRIBUTING.zh-CN.md                              |   8 +-
 README.md                                          |  30 +-
 README.zh-CN.md                                    |  35 +-
 build.gradle                                       | 124 ++--
 docker/centos7-jdk8/Dockerfile                     |  19 +
 docker/eventmesh-rocketmq/Dockerfile               |  19 +
 docs/.vuepress/config.js                           |  19 +
 docs/README.md                                     |  15 +-
 docs/_config.yml                                   |  21 +-
 docs/cn/README.md                                  |  17 +-
 docs/cn/features/0-introduction.md                 |  56 --
 docs/cn/features/1-request-response-call.md        |  34 -
 docs/cn/features/10-flow-control.md                |   0
 docs/cn/features/2-dark-launch.md                  |  26 -
 docs/cn/features/3-circuit-break-mechanism.md      |  28 -
 docs/cn/features/4-invoke-service-nearby.md        |  34 -
 docs/cn/features/5-multi-active.md                 |  21 -
 docs/cn/features/6-dynamic-adjust-queue.md         |  38 --
 docs/cn/features/7-isolation-mechanism.md          |  26 -
 docs/cn/features/8-fault-tolerant.md               |  51 --
 docs/cn/features/9-publish-type.md                 |  33 -
 docs/cn/features/https.zh-CN.md                    |   1 -
 .../eventmesh-runtime-quickstart.zh-CN.md          |  16 +-
 .../eventmesh-sdk-java-quickstart.zh-CN.md         |   6 +-
 docs/cn/instructions/quickstart.zh-CN.md           |   6 +-
 docs/en/README.md                                  |  15 +-
 docs/en/features/architecture.md                   |   0
 .../features/eventmesh-cloudevents-sdk-binding.md  |  55 ++
 docs/en/features/request-response-call.md          |   0
 .../instructions/eventmesh-runtime-quickstart.md   |  17 +-
 .../instructions/eventmesh-sdk-java-quickstart.md  |   6 +-
 docs/en/instructions/eventmesh-store-quickstart.md |   2 +-
 docs/eventmesh.md                                  |   2 +-
 docs/images/eventmesh-panels.png                   | Bin 951690 -> 920415 bytes
 docs/images/eventmesh-runtime.png                  | Bin 1562864 -> 1726098 bytes
 docs/images/logo1.png                              | Bin 0 -> 28980 bytes
 docs/images/logo2.png                              | Bin 0 -> 48761 bytes
 eventmesh-common/gradle.properties                 |   2 +-
 .../org/apache/eventmesh/common/Constants.java     |   6 -
 .../java/org/apache/eventmesh/common/IPUtil.java   |   2 +-
 .../eventmesh/common/command/HttpCommand.java      |  15 +-
 .../common/config/CommonConfiguration.java         |  14 -
 .../common/loadbalance/LoadBalanceSelector.java    |  29 +-
 .../common/loadbalance/LoadBalanceType.java        |  50 ++
 .../loadbalance/RandomLoadBalanceSelector.java     |  56 ++
 .../eventmesh/common/loadbalance/Weight.java       |  70 ++
 .../WeightRoundRobinLoadBalanceSelector.java       |  72 ++
 .../eventmesh/common/protocol/SubcriptionType.java |  30 +-
 .../Subscription.java => SubscriptionItem.java}    |  51 +-
 .../common/protocol/SubscriptionMode.java          |  30 +-
 .../http/body/client/HeartbeatRequestBody.java     |  13 +
 .../protocol/http/body/client/RegRequestBody.java  |   9 +-
 .../http/body/client/SubscribeRequestBody.java     |  26 +-
 .../http/body/client/UnSubscribeRequestBody.java   |  17 +-
 .../http/body/message/ReplyMessageRequestBody.java |  15 +-
 .../body/message/SendMessageBatchRequestBody.java  |  14 +
 .../message/SendMessageBatchV2RequestBody.java     |  14 +
 .../http/body/message/SendMessageRequestBody.java  |  15 +-
 .../common/protocol/http/common/ProtocolKey.java   |   4 -
 .../http/header/client/HeartbeatRequestHeader.java |  30 +-
 .../header/client/HeartbeatResponseHeader.java     |  30 +-
 .../http/header/client/RegRequestHeader.java       |  26 -
 .../http/header/client/RegResponseHeader.java      |  31 +-
 .../http/header/client/SubscribeRequestHeader.java |  26 -
 .../header/client/SubscribeResponseHeader.java     |  30 +-
 .../http/header/client/UnRegRequestHeader.java     |  28 -
 .../http/header/client/UnRegResponseHeader.java    |  29 +-
 .../header/client/UnSubscribeRequestHeader.java    |  26 -
 .../header/client/UnSubscribeResponseHeader.java   |  29 +-
 .../header/message/PushMessageRequestHeader.java   |  26 -
 .../header/message/PushMessageResponseHeader.java  |  32 +-
 .../header/message/ReplyMessageRequestHeader.java  |  28 -
 .../header/message/ReplyMessageResponseHeader.java |  32 +-
 .../message/SendMessageBatchRequestHeader.java     |  28 -
 .../message/SendMessageBatchResponseHeader.java    |  32 +-
 .../message/SendMessageBatchV2RequestHeader.java   |  28 -
 .../message/SendMessageBatchV2ResponseHeader.java  |  32 +-
 .../header/message/SendMessageRequestHeader.java   |  28 -
 .../header/message/SendMessageResponseHeader.java  |  32 +-
 .../common/protocol/tcp/Subscription.java          |  12 +-
 .../eventmesh/common/protocol/tcp/UserAgent.java   |  30 +-
 .../loadbalance/RandomLoadBalanceSelectorTest.java |  63 ++
 .../WeightRoundRobinLoadBalanceSelectorTest.java   |  64 ++
 eventmesh-connector-api/gradle.properties          |   2 +-
 .../org/apache/eventmesh/api/EventMeshAction.java  |   8 +-
 .../api/EventMeshAsyncConsumeContext.java          |  36 +-
 .../eventmesh/api/consumer/MeshMQPushConsumer.java |   7 -
 .../eventmesh/api/producer/MeshMQProducer.java     |   9 +-
 eventmesh-connector-rocketmq/gradle.properties     |   2 +-
 .../connector/rocketmq/common/Constants.java       |   5 +-
 .../rocketmq/common/EventMeshConstants.java        |   5 -
 .../rocketmq/consumer/PushConsumerImpl.java        |  57 +-
 .../rocketmq/consumer/RocketMQConsumerImpl.java    |  10 +-
 .../rocketmq/producer/RocketMQProducerImpl.java    |  17 +-
 .../rocketmq/consumer/PushConsumerImplTest.java    |   4 +-
 ...rg.apache.io.openmessaging.MessagingAccessPoint |  19 +
 .../org.apache.io.openmessaging.producer.Producer  |  19 +
 eventmesh-runtime/conf/eventmesh.properties        |   4 +-
 eventmesh-runtime/scripts/client_manage.sh         |  22 +-
 eventmesh-runtime/scripts/session.sh               |   5 +-
 .../admin/controller/ClientManageController.java   | 747 +--------------------
 .../handler/RedirectClientByIpPortHandler.java     | 111 +++
 .../admin/handler/RedirectClientByPathHandler.java | 112 +++
 .../handler/RedirectClientBySubSystemHandler.java  | 112 +++
 .../admin/handler/RejectAllClientHandler.java      |  96 +++
 .../admin/handler/RejectClientByIpPortHandler.java | 107 +++
 .../handler/RejectClientBySubSystemHandler.java    | 122 ++++
 .../admin/handler/ShowClientBySystemHandler.java   |  91 +++
 .../runtime/admin/handler/ShowClientHandler.java   |  92 +++
 .../handler/ShowListenClientByTopicHandler.java    |  92 +++
 .../runtime/boot/AbrstractHTTPServer.java          |  16 +-
 .../runtime/boot/EventMeshHTTPServer.java          |   4 +-
 .../eventmesh/runtime/boot/EventMeshServer.java    |   1 -
 .../eventmesh/runtime/boot/EventMeshTCPServer.java |  23 +-
 .../configuration/EventMeshTCPConfiguration.java   |  26 +-
 .../runtime/constants/DeFiBusConstant.java         |  72 --
 .../runtime/constants/EventMeshConstants.java      |   7 -
 .../core/consumergroup/ConsumerGroupTopicConf.java |  18 +-
 .../runtime/core/plugin/MQConsumerWrapper.java     |  12 -
 .../http/consumer/ConsumerGroupManager.java        |  18 +-
 .../protocol/http/consumer/ConsumerManager.java    |  27 +-
 .../protocol/http/consumer/EventMeshConsumer.java  |  41 +-
 .../protocol/http/consumer/HandleMsgContext.java   |  23 +-
 .../http/processor/BatchSendMessageProcessor.java  |  15 +-
 .../processor/BatchSendMessageV2Processor.java     |  10 +-
 .../http/processor/HeartBeatProcessor.java         |  10 +-
 .../http/processor/ReplyMessageProcessor.java      |   8 +-
 .../http/processor/SendAsyncMessageProcessor.java  |   8 +-
 .../http/processor/SendSyncMessageProcessor.java   |  10 +-
 .../http/processor/SubscribeProcessor.java         |  68 +-
 .../http/processor/UnSubscribeProcessor.java       |  85 ++-
 .../core/protocol/http/processor/inf/Client.java   |   4 -
 .../protocol/http/producer/EventMeshProducer.java  |   3 +-
 .../protocol/http/push/AsyncHTTPPushRequest.java   |   5 +-
 .../tcp/client/group/ClientGroupWrapper.java       | 220 +++---
 .../client/group/ClientSessionGroupMapping.java    | 161 ++---
 .../dispatch/FreePriorityDispatchStrategy.java     |  13 +-
 .../core/protocol/tcp/client/session/Session.java  |  76 +--
 .../tcp/client/session/SessionContext.java         |   5 +-
 .../tcp/client/session/push/ClientAckContext.java  |   5 +-
 .../client/session/push/DownStreamMsgContext.java  |  19 +-
 .../tcp/client/session/push/PushContext.java       |  27 +-
 .../tcp/client/session/push/SessionPusher.java     |  89 ++-
 .../session/push/retry/EventMeshTcpRetryer.java    |  29 +-
 .../core/protocol/tcp/client/task/HelloTask.java   |  10 +
 .../protocol/tcp/client/task/MessageAckTask.java   |  11 +-
 .../tcp/client/task/MessageTransferTask.java       |   4 -
 .../protocol/tcp/client/task/SubscribeTask.java    |  21 +-
 .../protocol/tcp/client/task/UnSubscribeTask.java  |   8 +-
 .../runtime/metrics/tcp/EventMeshTcpMonitor.java   |  11 +-
 .../eventmesh/runtime/util/EventMeshUtil.java      | 106 +--
 .../runtime/util/MessageClientIDSetter.java        | 223 ------
 .../apache/eventmesh/runtime/util/NetUtils.java    |  72 ++
 .../src/test/java/client/EventMeshClient.java      |  10 +-
 .../src/test/java/client/SubClient.java            |  10 +-
 .../test/java/client/common/ClientConstants.java   |   6 +-
 .../src/test/java/client/common/MessageUtils.java  |  40 +-
 .../test/java/client/common/UserAgentUtils.java    |   3 -
 .../test/java/client/impl/EventMeshClientImpl.java |  17 +-
 .../src/test/java/client/impl/SubClientImpl.java   |  37 +-
 .../src/test/java/demo/AsyncSubClient.java         |   4 +-
 .../src/test/java/demo/BroadCastSubClient.java     |   4 +-
 .../src/test/java/demo/CCSubClient.java            |   4 +-
 .../src/test/java/demo/CClientDemo.java            |  16 +-
 .../src/test/java/demo/SyncPubClient.java          |   2 +-
 .../src/test/java/demo/SyncSubClient.java          |   4 +-
 .../handler/RedirectClientByIpPortHandlerTest.java |  59 ++
 eventmesh-sdk-java/gradle.properties               |   2 +-
 .../eventmesh/client/http/AbstractLiteClient.java  |  66 +-
 .../eventmesh/client/http/RemotingServer.java      |   3 +-
 .../client/http/conf/LiteClientConfig.java         |  92 ++-
 .../client/http/consumer/LiteConsumer.java         |  82 +--
 .../http/consumer/context/LiteConsumeContext.java  |  28 +-
 .../client/http/producer/LiteProducer.java         |  55 +-
 .../client/http/util/HttpLoadBalanceUtils.java     |  83 +++
 .../eventmesh/client/tcp/EventMeshClient.java      |   4 +-
 .../eventmesh/client/tcp/SimpleSubClient.java      |   4 +-
 .../eventmesh/client/tcp/common/MessageUtils.java  |  28 +-
 .../client/tcp/impl/DefaultEventMeshClient.java    |   6 +-
 .../client/tcp/impl/SimpleSubClientImpl.java       |  22 +-
 .../client/http/demo/AsyncPublishInstance.java     |   4 +-
 .../client/http/demo/AsyncSyncRequestInstance.java |   4 +-
 .../client/http/demo/SyncRequestInstance.java      |   2 +-
 .../client/http/util/HttpLoadBalanceUtilsTest.java |  47 ++
 .../tcp/common/EventMeshTestCaseTopicSet.java      |   6 +-
 .../client/tcp/common/EventMeshTestUtils.java      |   6 +-
 .../eventmesh/client/tcp/demo/AsyncSubscribe.java  |   4 +-
 .../client/tcp/demo/AsyncSubscribeBroadcast.java   |   4 +-
 .../eventmesh/client/tcp/demo/SyncResponse.java    |   4 +-
 eventmesh-starter/gradle.properties                |   2 +-
 eventmesh-test/gradle.properties                   |   2 +-
 .../eventmesh/http/demo/AsyncPublishInstance.java  |   9 +-
 .../http/demo/AsyncSyncRequestInstance.java        |   4 +-
 .../eventmesh/http/demo/SyncRequestInstance.java   |   2 +-
 .../http/demo/sub/controller/SubController.java    |   7 +
 .../http/demo/sub/service/SubService.java          |  82 ++-
 .../tcp/common/EventMeshTestCaseTopicSet.java      |   6 +-
 .../eventmesh/tcp/common/EventMeshTestUtils.java   |   9 +-
 .../apache/eventmesh/tcp/demo/AsyncSubscribe.java  |   4 +-
 .../tcp/demo/AsyncSubscribeBroadcast.java          |   4 +-
 .../apache/eventmesh/tcp/demo/SyncResponse.java    |   5 +-
 gradle.properties                                  |   2 +-
 gradlew                                            |  26 +-
 gradlew.bat                                        |  25 +-
 install.sh                                         |  18 +
 213 files changed, 3406 insertions(+), 3478 deletions(-)

diff --git a/.coveralls.yml b/.coveralls.yml
deleted file mode 100644
index cf27a37..0000000
--- a/.coveralls.yml
+++ /dev/null
@@ -1 +0,0 @@
-service_name: travis-pro
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..381e4d7
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1 @@
+#TBD
\ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..1d0cbfc
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,84 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+name: "Continuous Integration"
+
+on:
+  push:
+    branches:
+      - develop
+  pull_request:
+    branches:
+      - develop
+  workflow_dispatch:
+
+jobs:
+  build:
+    name: Build
+
+    runs-on: ubuntu-latest
+
+    strategy:
+      fail-fast: false
+      matrix:
+        language:
+          - 'java'
+        java:
+          - 8
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v2
+
+      - name: Initialize CodeQL
+        uses: github/codeql-action/init@v1
+        with:
+          # If you wish to specify custom queries, you can do so here or in a config file.
+          # By default, queries listed here will override any specified in a config file.
+          # Prefix the list here with "+" to use these queries and those in the config file.
+          # queries: ./path/to/local/query, your-org/your-repo/queries@main
+          languages: ${{ matrix.language }}
+
+      - name: Set up JDK ${{ matrix.java }}
+        uses: actions/setup-java@v1
+        with:
+          java-version: ${{ matrix.java }}
+
+      - name: Build
+        run: ./gradlew clean build jacocoTestReport
+
+      - name: Perform CodeQL analysis
+        uses: github/codeql-action/analyze@v1
+
+      - name: Upload coverage report to codecov.io
+        run: bash <(curl -s https://codecov.io/bash) || echo 'Failed to upload coverage report!'
+
+  license-check:
+    name: License Check
+
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v2
+
+      - name: Check license header
+        uses: apache/skywalking-eyes@9bd5feb86b5817aa6072b008f9866a2c3bbc8587
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/gitee-mirror.yml b/.github/workflows/gitee-mirror.yml
deleted file mode 100644
index b29e080..0000000
--- a/.github/workflows/gitee-mirror.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-# 使用 GitHub Action 来解决手动同步到 Gitee 的问题
-# 效果:github repo 代码更新之后,会自动同步至 gitee
-# 使用到的 GitHub Action:https://github.com/Yikun/hub-mirror-action
-
-# This is a basic workflow to help you get started with Actions
-
-name: Gitee Mirror
-
-# Controls when the action will run. Triggers the workflow on push or pull request
-# events but only for the master branch
-on:
-  push:
-    branches:
-      - '*'
-
-jobs:
-  # This workflow contains a single job called "build"
-  build:
-    # The type of runner that the job will run on
-    runs-on: ubuntu-latest
-
-    # Steps represent a sequence of tasks that will be executed as part of the job
-    steps:
-      - name: Mirror the Github organization repos to Gitee.
-        uses: Yikun/hub-mirror-action@master
-        with:
-          src: github/WeBankFinTech
-          dst: gitee/webank
-          # 这里请填写与gitee上公钥匹配的的 ssh private key,参见:https://gitee.com/profile/sshkeys
-          # 填写地址:https://github.com/WeBankFinTech/fes.js/settings/secrets
-          dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
-          # 这里请填写 gitee的令牌,参见:https://gitee.com/profile/personal_access_tokens
-          # 填写地址:https://github.com/WeBankFinTech/fes.js/settings/secrets
-          dst_token: ${{ secrets.GITEE_TOKEN }}
-          # 项目同步白名单,可以选择填写多个,以英文逗号分割
-          static_list: "EventMesh"
-          # 是否强制同步
-          force_update: true
-          # 账号类型:对 luban-h5 而言是 user,因为是个人项目;如果是企业项目,请填写 org,因为是组织下的项目
-          account_type: org
-          clone_style: ssh
-
-  build-and-deploy:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout 🛎️
-        uses: actions/checkout@v2 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly.
-        with:
-          persist-credentials: false
-
-      - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built.
-        run: |
-          yarn install
-          yarn run docs:build
-      - name: Deploy 🚀
-        uses: JamesIves/github-pages-deploy-action@3.7.1
-        with:
-          GITHUB_TOKEN: ${{ secrets.EVENTMESH }}
-          BRANCH: gh-pages
-          FOLDER: docs/.vuepress/dist # The folder the action should deploy.
diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml
new file mode 100644
index 0000000..8883906
--- /dev/null
+++ b/.github/workflows/greetings.yml
@@ -0,0 +1,72 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+name: Greetings
+
+on: [pull_request, issues]
+
+jobs:
+  greeting:
+    name: Greeting
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/first-interaction@v1
+        with:
+          repo-token: ${{ secrets.GITHUB_TOKEN }}
+          issue-message: |
+            Welcome to the Apache EventMesh (incubating) community!!
+            We are glad that you are contributing by opening this issue. :D
+
+            Please make sure to include all the relevant context.
+            We will be here shortly.
+
+            If you are interested in contributing to our project, please let us know!
+            You can check out our contributing guide on [contributing to EventMesh](https://github.com/apache/incubator-eventmesh/blob/develop/CONTRIBUTING.md).
+
+            Want to get closer to the community?
+
+            WeChat Group:
+            ![wechat_qr](https://github.com/apache/incubator-eventmesh/blob/develop/docs/images/mesh-helper.png?raw=true)
+
+            Mailing Lists:
+            | Name | Description |Subscribe	|Unsubscribe|Archive
+            | ----    | ----    |----    | ----    | ----    |
+            |Users	|User support and questions mailing list|	[Subscribe](mailto:users-subscribe@eventmesh.incubator.apache.org)	|[Unsubscribe](mailto:users-unsubscribe@eventmesh.incubator.apache.org)	|[Mail Archives](https://lists.apache.org/list.html?users@eventmesh.apache.org)|
+            |Development	|Development related discussions|	[Subscribe](mailto:dev-subscribe@eventmesh.incubator.apache.org)	|[Unsubscribe](mailto:dev-unsubscribe@eventmesh.incubator.apache.org)	|[Mail Archives](https://lists.apache.org/list.html?dev@eventmesh.apache.org)|
+            |Commits	|All commits to repositories|	[Subscribe](mailto:commits-subscribe@eventmesh.incubator.apache.org)	|[Unsubscribe](mailto:commits-unsubscribe@eventmesh.incubator.apache.org)	|[Mail Archives](https://lists.apache.org/list.html?commits@eventmesh.apache.org)|
+
+          pr-message: |
+            Welcome to the Apache EventMesh (incubating) community!!
+            This is your first PR in our project. We're very excited to have you onboard contributing. Your contributions are greatly appreciated!
+
+            Please make sure that the changes are covered by tests.
+            We will be here shortly.
+            Let us know if you need any help!
+
+            Want to get closer to the community?
+
+            WeChat Group:
+            ![wechat_qr](https://github.com/apache/incubator-eventmesh/blob/develop/docs/images/mesh-helper.png?raw=true)
+
+            Mailing Lists:
+            | Name | Description |Subscribe	|Unsubscribe|Archive
+            | ----    | ----    |----    | ----    | ----    |
+            |Users	|User support and questions mailing list|	[Subscribe](mailto:users-subscribe@eventmesh.incubator.apache.org)	|[Unsubscribe](mailto:users-unsubscribe@eventmesh.incubator.apache.org)	|[Mail Archives](https://lists.apache.org/list.html?users@eventmesh.apache.org)|
+            |Development	|Development related discussions|	[Subscribe](mailto:dev-subscribe@eventmesh.incubator.apache.org)	|[Unsubscribe](mailto:dev-unsubscribe@eventmesh.incubator.apache.org)	|[Mail Archives](https://lists.apache.org/list.html?dev@eventmesh.apache.org)|
+            |Commits	|All commits to repositories|	[Subscribe](mailto:commits-subscribe@eventmesh.incubator.apache.org)	|[Unsubscribe](mailto:commits-unsubscribe@eventmesh.incubator.apache.org)	|[Mail Archives](https://lists.apache.org/list.html?commits@eventmesh.apache.org)|
diff --git a/.licenserc.yaml b/.licenserc.yaml
new file mode 100644
index 0000000..5046f8e
--- /dev/null
+++ b/.licenserc.yaml
@@ -0,0 +1,41 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+header:
+  license:
+    spdx-id: Apache-2.0
+    copyright-owner: Apache Software Foundation
+
+  paths-ignore:
+    - '.github/PULL_REQUEST_TEMPLATE'
+    - '.gitmodules'
+    - '**/.gitkeep'
+    - '**/.gitignore'
+    - '**/*.md'
+    - '**/*.json'
+    - '**/*.ftl'
+    - '**/*.iml'
+    - '**/*.ini'
+    - '**/*.crt'
+    - '**/*.pem'
+    - 'LICENSE'
+    - 'NOTICE'
+    - 'DISCLAIMER-WIP'
+
+  comment: on-failure
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index a6b1867..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-dist: trusty
-
-language: java
-jdk:
-  - oraclejdk8
-
-script:
-  - travis_retry ./gradlew clean build
-
-#after_success:
-#  - ./gradlew clean
-
-env:
-  global:
-    - secure: "T1QAuaAzcB7K8YjAAVVb4P9+W0JAdOFbyBwRxliyyoSZUShlIqa0eE7ioXHXWBP/d5f3XtROse6lq2qILqcU9sFSncKE2vRJlwJ5p7R23WIsCXdV70A9AVE2gLJcIJiOTMwd/YYYzNDrGLp3CSJNcKo8t7t70V2j/11I9xPTOHnaZ8FHGC3d/7bjfR/+g/3d4EOCvV8Vm6ndEmmailmF8OJ/kcbuRbArKIehjUwNDyQZfwAc9+vvPZlHgnQvR1pJ/KiK6muEIi7RQohDq7lMTmcc2LZSYgy/+aqFrmBcQwXScABFmSwysQ4KMXfrCqqMsBdmvno/NoKVGofHHKdym/oauv/G3lxLx5sgM9A7ZSFBK08x08r7u/6TDsTFmQ9LzVFDNo/OLZhxs3dr9x2C9Pa2A7IP1i1oVbbYkwBJv4z6o3khWpQAAY/IWijlCZ9vkjFfqdIXbvlPqamEaFRAmK5I3MVqL [...]
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index bfa29b9..68c870c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -32,7 +32,7 @@ Here are the workflow for contributors:
 7. Create a pull request
 
 Please follow [the pull request template](./.github/PULL_REQUEST_TEMPLATE.md). Please make sure the PR has a
-corresponding issue. [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues)
+corresponding issue. [GitHub Issues](https://github.com/apache/incubator-eventmesh/issues)
 
 After creating a PR, one or more reviewers will be assigned to the pull request. The reviewers will review the code.
 
@@ -41,11 +41,11 @@ message should be clear and concise.
 
 ### Open an issue / PR
 
-We use [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues)
-and [Pull Requests](https://github.com/WeBankFinTech/EventMesh/pulls) for trackers.
+We use [GitHub Issues](https://github.com/apache/incubator-eventmesh/issues)
+and [Pull Requests](https://github.com/apache/incubator-eventmesh/pulls) for trackers.
 
 If you find a typo in a document, find a bug in code, or want new features, or want to give suggestions, you
-can [open an issue on GitHub](https://github.com/WeBankFinTech/EventMesh/issues/new) to report it. Please follow the
+can [open an issue on GitHub](https://github.com/apache/incubator-eventmesh/issues/new) to report it. Please follow the
 guideline message in the issue template.
 
 If you want to contribute, please follow the [contribution workflow](#github-workflow) and create a new pull request. If
diff --git a/CONTRIBUTING.zh-CN.md b/CONTRIBUTING.zh-CN.md
index 03bec9c..742ccbd 100644
--- a/CONTRIBUTING.zh-CN.md
+++ b/CONTRIBUTING.zh-CN.md
@@ -29,7 +29,7 @@
 7. 创建PR合并请求
 
 请遵循[Pull Requests模板](./.github/PULL_REQUEST_TEMPLATE.md).
-请确保PR对应有相应的问题. [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues)
+请确保PR对应有相应的问题. [GitHub Issues](https://github.com/apache/incubator-eventmesh/issues)
 
 创建PR后,将为拉取请求分配一个或多个审阅者。 审阅者将审阅代码。
 
@@ -38,10 +38,10 @@
 ### 打开问题/ PR
 
 我们将使用Issues和Pull Requests作为跟踪器
-[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues)
-[Pull Requests](https://github.com/WeBankFinTech/EventMesh/pulls)
+[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues)
+[Pull Requests](https://github.com/apache/incubator-eventmesh/pulls)
 
-如果您在文档中发现拼写错误,在代码中发现错误,想要新功能或提出建议, 您可以提出问题[在GitHub上打开问题](https://github.com/WeBankFinTech/EventMesh/issues/new)
+如果您在文档中发现拼写错误,在代码中发现错误,想要新功能或提出建议, 您可以提出问题[在GitHub上打开问题](https://github.com/apache/incubator-eventmesh/issues/new)
 请按照问题模板中的准则消息进行操作。
 
 如果您想贡献,请遵循[贡献工作流程](#github-workflow)并创建一个新的拉取请求。 如果您的PR包含较大的更改,例如组件重构或新组件,请写详细文档 有关其设计和使用的信息。
diff --git a/README.md b/README.md
index d6429cc..43cfc86 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,14 @@
-[![Build Status](https://www.travis-ci.org/apache/incubator-eventmesh.svg?branch=develop)](https://www.travis-ci.org/github/apache/incubator-eventmesh)
-[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master)
-[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases)
+# Apache EventMesh (incubating) 
+[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml)
+[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh)
+[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java)
+[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/)
+[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases)
 [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
 
 [点我查看中文版](README.zh-CN.md)
 
+![logo](docs/images/logo2.png)
 ## What is EventMesh?
 EventMesh(incubating) is a dynamic cloud-native eventing infrastruture used to decouple the application and backend middleware layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using diverse technology stacks.
 
@@ -22,17 +26,6 @@ EventMesh(incubating) is a dynamic cloud-native eventing infrastruture used to d
 
 ![architecture2](docs/images/eventmesh-panels.png)
 
-The EventMesh(incubating) allows events from one application to be dynamically routed to any other application.
-General functions of the eventmesh:
-
-* Event driven;
-* Event governance;
-* Event routing;
-* Flow control;
-* Load balance;
-* Pluggable;
-* Cloud native;
-* Gateway
 
 **Support connecting event store:**
 
@@ -41,12 +34,13 @@ General functions of the eventmesh:
 **Components:**
 
 * **eventmesh-runtime** : an middleware to transmit events between event producers and consumers, support cloud native apps and microservices.
-* **eventmesh-sdk-java** : currently supports HTTP and TCP protocols, and will support gRPC in the future.
-* **eventmesh-connector-rocketmq** : an implementation based on OpenMessaging Connector Interface, pub event to or sub event from RocketMQ Event Store.
+* **eventmesh-sdk-java** : currently supports HTTP and TCP protocols.
+* **eventmesh-connector-api** : an api layer based on OpenMessaging api and SPI pluggin, which can be implemented by popular EventStores such as IMDG, Messaging Engine and OSS etc.
+* **eventmesh-connector-rocketmq** : an implementation of eventmesh-connector-api, pub event to or sub event from RocketMQ as EventStore.
 
 **Protocol:**
 
-The protocol of eventmesh is easier and convenient, you can read more [here](docs/en/instructions/eventmesh-runtime-protocol.md)
+The protocol of eventmesh is easier and more convenient, you can read more [here](docs/en/instructions/eventmesh-runtime-protocol.md)
 
 ## RoadMap
 | version | feature |
@@ -54,7 +48,7 @@ The protocol of eventmesh is easier and convenient, you can read more [here](doc
 | v1.0.0  |Support java-sdk , tcp pub/sub, http pub|
 | v1.1.0  |Support RocketMQ as eventstore|
 | v1.1.1  |Support https|
-| v1.2.0  |Support OpenMessaging API,support Plug-in architecture, support http sub, support cloud native deploy|
+| v1.2.0  |Support EventMesh store layer pluggable by OpenMessaging Pub/Sub API, http sub, docker|
 | V1.3.0  |Support CloudEvents, Event Streaming|
 |         |Support Event function,triggers and bindings|
 |         |Support Event orchestration, Servelss workflow|
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 76c450e..8dadfaa 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -1,10 +1,15 @@
-[![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh)
-[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master)
-[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases)
+# Apache EventMesh (incubating)
+[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml)
+[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh)
+[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java)
+[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/)
+[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases)
 [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
 
+![logo](docs/images/logo2.png)
 ## 什么是Event Mesh?
 EventMesh是一个动态的云原生事件驱动架构基础设施,用于分离应用程序和后端中间件层,它支持广泛的用例,包括复杂的混合云、使用了不同技术栈的分布式架构。
+
 ![architecture1](docs/images/eventmesh-multi-runtime.png)
 
 **EventMesh生态:**
@@ -18,15 +23,6 @@ EventMesh是一个动态的云原生事件驱动架构基础设施,用于分
 
 ![architecture2](docs/images/eventmesh-panels.png)
 
-Event Mesh允许将来自一个应用程序的事件动态路由到任何其他应用程序.
-Event Mesh的一般功能:
-* 事件驱动;
-* 事件治理;
-* 动态路由;
-* 云原生;
-* 流控;
-* 负载均衡
-
 **支持连接的事件存储:**
 
 * [RocketMQ](https://github.com/apache/rocketmq):RocketMQ是一个分布式消息流平台,具有低延迟、高性能和可靠性、万亿级容量和灵活的可伸缩性。
@@ -35,7 +31,8 @@ Event Mesh的一般功能:
 
 * **eventmesh-runtime**:一种中间件,用于在事件产生者和使用者之间传输事件,支持云原生应用程序和微服务
 * **eventmesh-sdk-java**:当前支持HTTP和TCP协议,未来会支持gRPC等
-* **eventmesh-connector-rocketmq** : 一种基于OpenMessagingConnector 接口的实现,该实现支持将RocketMQ作为事件存储,实现事件的发布与订阅
+* **eventmesh-connector-api**:一个基于OpenMessaging api和SPI插件机制的接口层,可以有很多不同的事件存储的实现,比如IMDG,Messaging Engine和OSS等
+* **eventmesh-connector-rocketmq** : 一种基于eventmesh-connector-api的实现,该实现支持将RocketMQ作为事件存储,实现事件的发布与订阅
 
 **通信协议:**
 
@@ -47,7 +44,7 @@ eventmesh的通信协议更加简洁方便,详细内容,阅读更多[这里]
 | v1.0.0  |Support java-sdk , tcp pub/sub, http pub|
 | v1.1.0  |Support RocketMQ as eventstore|
 | v1.1.1  |Support https|
-| v1.2.0  |Support OpenMessaging API,support Plug-in architecture, support http sub, support cloud native deploy|
+| v1.2.0  |Support EventMesh store layer pluggable by OpenMessaging Pub/Sub API, http sub, docker|
 | V1.3.0  |Support CloudEvents, Event Streaming|
 |         |Support Event function,triggers and bindings|
 |         |Support Event orchestration, Servelss workflow|
@@ -76,7 +73,15 @@ eventmesh的通信协议更加简洁方便,详细内容,阅读更多[这里]
 ## License
 [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) Copyright (C) Apache Software Foundation
 
-## 联系人
+## 开发社区
 微信群:
 
 ![wechat_qr](docs/images/mesh-helper.png)
+
+Mailing Lists:
+
+| 列表名称 | 描述 |订阅	|取消订阅|邮件列表存档
+| ----    | ----    |----    | ----    | ----    |
+|Users	|用户支持与用户问题|	[点击订阅](mailto:users-subscribe@eventmesh.incubator.apache.org)	|[点击取消订阅](mailto:users-unsubscribe@eventmesh.incubator.apache.org)	|[邮件列表存档](https://lists.apache.org/list.html?users@eventmesh.apache.org)|
+|Development	|开发相关|	[点击订阅](mailto:dev-subscribe@eventmesh.incubator.apache.org)	|[点击取消订阅](mailto:dev-unsubscribe@eventmesh.incubator.apache.org)	|[邮件列表存档](https://lists.apache.org/list.html?dev@eventmesh.apache.org)|
+|Commits	|所有与仓库相关的commits信息通知|	[点击订阅](mailto:commits-subscribe@eventmesh.incubator.apache.org)	|[点击取消订阅](mailto:commits-unsubscribe@eventmesh.incubator.apache.org)	|[邮件列表存档](https://lists.apache.org/list.html?commits@eventmesh.apache.org)|
diff --git a/build.gradle b/build.gradle
index e285ba4..12a2b00 100644
--- a/build.gradle
+++ b/build.gradle
@@ -28,7 +28,6 @@ buildscript {
         maven {
             url "https://plugins.gradle.org/m2/"
         }
-
     }
 
     dependencies {
@@ -41,7 +40,6 @@ allprojects {
     apply plugin: "eclipse"
     apply plugin: "idea"
     apply plugin: "project-reports"
-    apply plugin: "maven"
     apply plugin: "maven-publish"
     apply plugin: "com.github.spotbugs"
     apply plugin: "project-reports"
@@ -50,6 +48,7 @@ allprojects {
     apply plugin: "java-library"
     apply plugin: 'signing'
 
+//    print(project)
 //    if (project.findProperty("jdk") == "1.7") {
 //        sourceCompatibility = 1.7
 //        targetCompatibility = 1.7
@@ -59,12 +58,10 @@ allprojects {
 //        targetCompatibility = 1.8
 //        version = version + "-jdk8"
 //    }
-
     [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
 
     compileJava.options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
 
-
     clean.doFirst {
         delete 'build'
         delete 'dist'
@@ -74,7 +71,6 @@ allprojects {
     if ((project.findProperty("snapshot") instanceof String) && (Boolean.valueOf(project.property("snapshot")))) {
         version = version + "-SNAPSHOT"
     }
-
 }
 
 task tar(type: Tar) {
@@ -97,7 +93,6 @@ task zip(type: Zip) {
     }
 }
 
-
 subprojects {
 
     List fastjson = [
@@ -135,6 +130,13 @@ subprojects {
             "org.slf4j:slf4j-api:1.7.30"
     ]
 
+    List log4j2 = [
+            "org.apache.logging.log4j:log4j-api:2.13.3",
+            "org.apache.logging.log4j:log4j-core:2.13.3",
+            "org.apache.logging.log4j:log4j-slf4j-impl:2.13.3",
+            "org.apache.logging.log4j:log4j-web:2.13.3",
+            "com.lmax:disruptor:3.4.2"
+    ]
 
     List common = [
             "commons-io:commons-io:2.4",
@@ -152,13 +154,12 @@ subprojects {
     ]
 
     dependencies {
-        implementation apache_commons, guava, log, fastjson, jackson, common, httpclient, netty
-        testImplementation apache_commons, guava, log, fastjson, jackson, common, junit, assertj, mock, httpclient, netty
+        implementation apache_commons, guava, log, log4j2, fastjson, jackson, common, httpclient, netty
+        testImplementation apache_commons, guava, log, log4j2, fastjson, jackson, common, junit, assertj, mock, httpclient, netty
         spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.11.0'
         spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.7'
     }
 
-
     sourceSets {
         main {
             java.srcDirs = ['src/main/java']
@@ -176,17 +177,13 @@ subprojects {
 
     jacoco {
         toolVersion = "0.8.6"
-        reportsDir = file("$buildDir/reports/jacoco")
     }
 
     jacocoTestReport {
-//        sourceSets sourceSets.main
-//        executionData files("$buildDir/jacoco/jacocoTest.exec")
-
         reports {
-            xml.enabled false
+            xml.enabled true
             csv.enabled false
-            html.destination file("${buildDir}/reports/jacoco/html")
+            html.enabled false
         }
     }
 
@@ -204,7 +201,7 @@ subprojects {
 //            html.enabled true
 //        }
 //    }
-
+//
 //    sourceSets {
 //        main {
 //            java {
@@ -227,11 +224,8 @@ subprojects {
 //            }
 //
 //        }
-//
-//
 //    }
 
-
     spotbugs {
         //toolVersion = '4.2.3'
         ignoreFailures = true
@@ -295,10 +289,10 @@ subprojects {
     jar {
         manifest {
             attributes("Specification-Version": project.version,
-                    "Specification-Vendor": "Apache",
+                    "Specification-Vendor": "WeBank, Inc.",
                     "Specification-Title": project.name,
                     "Implementation-Version": project.version,
-                    "Implementation-Vendor": "Apache",
+                    "Implementation-Vendor": "WeBank, Inc.",
                     "Implementation-Title": project.name,
                     "Build-Jdk": project.findProperty("jdk")
             )
@@ -325,7 +319,7 @@ subprojects {
             }
             copy {
                 into '../dist/lib'
-                from project.configurations.runtime
+                from project.configurations.runtimeClasspath
                 exclude '**/*.properties*'
                 exclude '**/*testng*.jar'
                 exclude '**/*powermock*.jar'
@@ -383,12 +377,6 @@ subprojects {
         }
     }
 
-    signing {
-        sign packageJavadoc, packageSources, jar
-    }
-
-
-
     repositories {
         maven { url "https://maven.aliyun.com/repository/public" }
         mavenCentral()
@@ -401,56 +389,62 @@ subprojects {
         resolutionStrategy.cacheDynamicVersionsFor 0, TimeUnit.SECONDS
     }
 
-
-    uploadArchives {
-        repositories {
-            mavenDeployer {
-                beforeDeployment {
-                    MavenDeployment deployment -> signing.signPom(deployment)
-                }
-                // 指定上传的路径
-                def releaseRepo = 'https://repository.apache.org/content/repositories/releases/'
-                def snapshotsRepo = 'https://repository.apache.org/content/repositories/snapshots/'
-                repository(url: releaseRepo) {
-                    authentication(userName: apacheUserName, password: apachePassWord)
-                }
-
-                snapshotRepository(url: snapshotsRepo) {
-                    authentication(userName: apacheUserName, password: apachePassWord)
-                }
-
-
-                pom.project {
-                    name 'Apache EventMesh'
-                    packaging 'jar'
-                    // optionally artifactId can be defined here
-                    description 'Apache EventMesh'
-                    url 'https://github.com/apache/incubator-eventmesh'
-
-                    scm {
-                        connection 'scm:git:git@github.com:apache/incubator-eventmesh.git'
-                        developerConnection 'scm:git:git@github.com:apache/incubator-eventmesh.git'
-                        url 'https://github.com/apache/incubator-eventmesh'
+    publishing {
+        publications {
+            mavenJava(MavenPublication) {
+                from components.java
+                artifact packageSources
+                artifact packageJavadoc
+                versionMapping {
+                    usage('java-api') {
+                        fromResolutionOf('runtimeClasspath')
                     }
-
+                    usage('java-runtime') {
+                        fromResolutionResult()
+                    }
+                }
+                pom {
+                    name = 'EventMesh'
+                    description = 'Apache EventMesh'
+                    url = 'https://github.com/apache/incubator-eventmesh'
                     licenses {
                         license {
-                            name 'The Apache License, Version 2.0'
-                            url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                            name = 'The Apache License, Version 2.0'
+                            url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                         }
                     }
-
                     developers {
                         developer {
-                            id 'Apache EventMesh(incubating)'
-                            name 'Apache EventMesh(incubating) of ASF'
-                            url 'https://eventmesh.apache.org/'
+                            id = 'Apache EventMesh(incubating)'
+                            name = 'Apache EventMesh(incubating) of ASF'
+                            url = 'https://eventmesh.apache.org/'
                         }
                     }
+                    scm {
+                        connection = 'scm:git:git@github.com:apache/incubator-eventmesh.git'
+                        developerConnection = 'scm:git:git@github.com:apache/incubator-eventmesh.git'
+                        url = 'https://github.com/apache/incubator-eventmesh'
+                    }
+                }
+            }
+        }
+        repositories {
+            maven {
+                def releasesRepoUrl = 'https://repository.apache.org/content/repositories/releases/'
+                def snapshotsRepoUrl = 'https://repository.apache.org/content/repositories/snapshots/'
+                url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
+                credentials {
+                    username apacheUserName
+                    password apachePassWord
                 }
+
             }
         }
     }
 
+    signing {
+        sign publishing.publications.mavenJava
+    }
+
 }
 
diff --git a/docker/centos7-jdk8/Dockerfile b/docker/centos7-jdk8/Dockerfile
index 546d324..7d96841 100644
--- a/docker/centos7-jdk8/Dockerfile
+++ b/docker/centos7-jdk8/Dockerfile
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
 FROM docker.io/centos:7
 
 MAINTAINER mikexue <mi...@126.com>
diff --git a/docker/eventmesh-rocketmq/Dockerfile b/docker/eventmesh-rocketmq/Dockerfile
index 326cee1..5b61cc4 100644
--- a/docker/eventmesh-rocketmq/Dockerfile
+++ b/docker/eventmesh-rocketmq/Dockerfile
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
 FROM centos7-jdk8:latest
 
 MAINTAINER mikexue mike_xwm@126.com
diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js
index 1f6bad1..870c593 100644
--- a/docs/.vuepress/config.js
+++ b/docs/.vuepress/config.js
@@ -1,3 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 module.exports = {
     title: 'EventMesh',
     description: 'EventMesh',
diff --git a/docs/README.md b/docs/README.md
index 9e8b030..5909122 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,6 +1,9 @@
-[![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh)
-[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master)
-[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases)
+# Apache EventMesh (Incubating)
+[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml)
+[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh)
+[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java)
+[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/)
+[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases)
 [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
 
 [点我查看中文版](cn/README.md)
@@ -63,13 +66,13 @@ Key components:
 
 1. Build and deploy event-store(RocketMQ), see [instruction](https://rocketmq.apache.org/docs/quick-start/).
 2. Build and deploy eventmesh-runtime, see
-   instruction ['eventmesh-runtime quickstart'](instructions/eventmesh-runtime-quickstart.md).
+   instruction ['eventmesh-runtime quickstart'](en/instructions/eventmesh-runtime-quickstart.md).
 3. Run eventmesh-sdk-java demo, see
-   instruction ['eventmesh-sdk-java quickstart'](instructions/eventmesh-sdk-java-quickstart.md).
+   instruction ['eventmesh-sdk-java quickstart'](en/instructions/eventmesh-sdk-java-quickstart.md).
 
 ## Contributing
 
-Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines
+Contributions are always welcomed! Please see [CONTRIBUTING](../CONTRIBUTING.md) for detailed guidelines
 
 You can start with the issues labeled with good first issue.
 [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues)
diff --git a/docs/_config.yml b/docs/_config.yml
index c419263..3ef20c1 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -1 +1,20 @@
-theme: jekyll-theme-cayman
\ No newline at end of file
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+theme: jekyll-theme-cayman
diff --git a/docs/cn/README.md b/docs/cn/README.md
index 8b19f4d..3aae2a3 100644
--- a/docs/cn/README.md
+++ b/docs/cn/README.md
@@ -1,6 +1,9 @@
-[![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh)
-[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master)
-[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases)
+# Apache EventMesh (Incubating)
+[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml)
+[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh)
+[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java)
+[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/)
+[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases)
 [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
 
 ## 什么是Event Mesh?
@@ -56,15 +59,15 @@ Event Mesh允许将来自一个应用程序的事件动态路由到任何其他
 ## 快速开始
 
 1. 构建并部署event-store(RocketMQ), 请参见[说明](https://rocketmq.apache.org/docs/quick-start/)
-2. 构建并部署eventmesh-runtime,请参见说明['eventmesh-runtime quickstart'](   instructions/eventmesh-runtime-quickstart.md)
-3. 运行eventmesh-sdk-java演示,请参见说明['eventmesh-sdk-java quickstart'](instructions/eventmesh-sdk-java-quickstart.md)
+2. 构建并部署eventmesh-runtime,请参见说明['eventmesh-runtime quickstart'](instructions/eventmesh-runtime-quickstart.zh-CN.md)
+3. 运行eventmesh-sdk-java演示,请参见说明['eventmesh-sdk-java quickstart'](instructions/eventmesh-sdk-java-quickstart.zh-CN.md)
 
 ## 贡献
 
-永远欢迎参与共建, 请参阅[贡献](CONTRIBUTING.md)了解详细指南
+永远欢迎参与共建, 请参阅[贡献](../../CONTRIBUTING.zh-CN.md)了解详细指南
 
 您可以从问题开始.
-[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues)
+[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues)
 
 ## License
 
diff --git a/docs/cn/features/0-introduction.md b/docs/cn/features/0-introduction.md
deleted file mode 100644
index 7df6731..0000000
--- a/docs/cn/features/0-introduction.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# DeFiBus
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-**
-DeFiBus=RPC+MQ,是基于开源消息中间件打造的安全可靠的分布式金融级消息总线。DeFibus不仅提供了RPC同步调用,还提供了MQ的异步事件通知、事件组播和广播等常用服务调用和消息模式,同时增加了应用多中心多活、服务就近、灰度发布等分布式场景下的高可用能力。在对于机器故障的容错能力方面的增强,也让消息总线的服务更加稳定可靠,为业务提供7x24的服务。**
-
-### 整体架构
-
-<div align=center>
-
-![architecture1](../../../docs/images/features/a-distributing-architecture-in-financial.png)
-
-</div>
-
-![architecture2](../../../docs/images/features/architecture-p1.png)
-
-DeFiBus主要包括以下几个组件(模块):
-
-* **Broker**:通过轻量的Topic和Queue机制提供消息存储功能。Broker定期将Topic信息上报到NameServer中,同集群中的Broker实例上报的NameServer必须保持一致,避免路由信息不一致。
-
-* **NameServer**:NameServer提供Topic的发现和路由,每一个NameServer接受Broker上报的Topic信息,并维护Topic的路由信息供客户端查询。
-
-* **GSL**:全局服务定位(Global Service
-  Location)服务提供服务级别的路由发现。服务可以部署在不同的区域(比如不同的数据中心、逻辑分区等),服务请求方在请求某一个具体服务时,无需关注服务部署的区域,GSL能够根据服务发现规则自动定位到具体的服务,将服务信息返回给客户端。
-
-* **SGS**:服务治理系统(Service Government
-  System)负责全局的服务管理,包括服务的申请、服务部署规划、服务下线等服务全生命周期的管理。在DeFiBus中,服务与Topic一一对应,Topic的名称由对应的服务按照一定的规则来命名。Topic的创建、更新和删除由SGS统一管理。SGS在服务的部署区域对应的Broker集群中创建Topic之后,将更新全局服务路由数据,供GSL定位服务使用。
-
-* **EventMesh**:服务代理(EventMesh)提供HTTP接入方式,同时允许按照协议规范开发的C、GO、Python等其他语言客户端的接入。
-
-### 服务和Topic的定义
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-DeFiBus把服务和Topic做了一一对应,每个服务必须对应一个Topic。Topic根据服务的唯一ID和服务的部署区域来命名。每个服务需要有服务的唯一标识,可以用数字ID或者字符串来表示。每个部署区域使用3位长度的字符串(限数字和字母构成)表示。  
-Topic按照如下格式来命名:
-
-```
-[区域代码]-[服务唯一ID]
-```
-
-比如,余额查询服务的服务ID为20190001表示,部署在“A10”这个区域,那么该服务在A10区域的Topic就命名为“A10-20190001”。Topic的命名规则
-
-### 特性列表:
-
-* [RPC调用:即“Request-Reply”模式,支持系统间的同步调用](docs/cn/features/1-request-response-call.md)
-* 消息发布/订阅:消息的发布和订阅
-* [灰度发布:服务级别的灰度发布](docs/cn/features/2-dark-launch.md)
-* [熔断机制:应用实例级别的熔断](docs/cn/features/3-circuit-break-mechanism.md)
-* [服务就近:就近进行服务的请求和响应,减少跨区调用](docs/cn/features/4-invoke-service-nearby.md)
-* [应用多活:应用多中心多活](docs/cn/features/5-multi-active.md)
-* [动态扩缩队列 :自适应应用实例数量,动态调整队列个数](docs/cn/features/6-dynamic-adjust-queue.md)
-* [容错机制:故障和错误隔离](docs/cn/features/8-fault-tolerant.md)
-* 服务路由和定位:动态路由及定位(后续开源)
-* 服务代理:HTTP及多语言的代理(后续开源)
-* 服务治理:服务元数据的管理(后续开源)
-* 平滑升级:平滑升级、平滑扩容(后续开源)
\ No newline at end of file
diff --git a/docs/cn/features/1-request-response-call.md b/docs/cn/features/1-request-response-call.md
deleted file mode 100644
index 10166d7..0000000
--- a/docs/cn/features/1-request-response-call.md
+++ /dev/null
@@ -1,34 +0,0 @@
-## 1. Request-Reply同步调用
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Request-Reply同步调用指的是请求方发出一条消息之后,需要响应方在消费完这条消息后回复一个响应结果。
-
-<div align=center>
-
-![RR](../../images/features/RR-call-p1.png)
-
-</div>
-
-整个调用过程包含了两个消息的产生和消费过程。  
-**1.请求方产生请求消息,服务响应方消费这条请求消息**  
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请求方根据服务提供方的协议将请求内容设置到消息体中,并将消息发送到Broker上。服务响应方订阅相应的Topic,从Broker上获取到请求消息,并消费。
-
-**2.服务响应方产生响应消息,请求方接收这条响应消息**  
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-服务响应方收到请求消息后,执行相应的处理,并将请求结果设置到响应消息的消息体中,将响应消息发送到Broker上。请求方接收响应消息的方式采用的是Broker推送的形式,而不是由Producer订阅的方式,从而使得响应消息能够精准回到发出请求消息的实例上。
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-DeFiBus在每条请求消息中增加REPLY_TO属性来唯一标识每一个请求方实例。在创建响应消息时将REPLY_TO属性透传到响应消息中。Broker收到响应消息后,根据REPLY_TO属性,查找出对应的请求方实例的连接,将响应消息推送给该请求方实例。
-
-
----
-
-#### Links:
-
-* [架构介绍](../../../README.md)
-* [Request-Reply调用](docs/cn/features/1-request-response-call.md)
-* [灰度发布](docs/cn/features/2-dark-launch.md)
-* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md)
-* [服务就近](docs/cn/features/4-invoke-service-nearby.md)
-* [应用多活](docs/cn/features/5-multi-active.md)
-* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md)
-* [容错机制](docs/cn/features/8-fault-tolerant.md)
\ No newline at end of file
diff --git a/docs/cn/features/10-flow-control.md b/docs/cn/features/10-flow-control.md
deleted file mode 100644
index e69de29..0000000
diff --git a/docs/cn/features/2-dark-launch.md b/docs/cn/features/2-dark-launch.md
deleted file mode 100644
index 1488386..0000000
--- a/docs/cn/features/2-dark-launch.md
+++ /dev/null
@@ -1,26 +0,0 @@
-## 2.灰度发布
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-同一个消费组中的消费者实例通常订阅的Topic是相同的。在有新业务上线时,我们希望仅仅在个别实例上进行灰度,验证通过之后再进行全量。DeFiBus提供了灰度发布的能力,同一个消费组中,允许不同消费者实例订阅不同的Topic,只有订阅了某个具体Topic的实例才能够收到这个Topic的消息,同消费组中没有订阅这个Topic的实例不会收到消息。
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-假设一个消费组有3个消费者实例,上线初期只涉及到Topic1和Topic2。当业务扩展,需要增加Topic3的订阅时,可以先灰度其中一个实例,验证Topic3在灰度实例上执行正常之后,逐步再替换其他实例。在这期间,实例1和实例2不会收到Topic3的消息。
-
-<div align=center>
-
-![avater](../../images/features/dark-launch-p1.png)
-
-</div>
-
----
-
-#### Links:
-
-* [架构介绍](../../../README.md)
-* [Request-Reply调用](docs/cn/features/1-request-response-call.md)
-* [灰度发布](docs/cn/features/2-dark-launch.md)
-* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md)
-* [服务就近](docs/cn/features/4-invoke-service-nearby.md)
-* [应用多活](docs/cn/features/5-multi-active.md)
-* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md)
-* [容错机制](docs/cn/features/8-fault-tolerant.md)
\ No newline at end of file
diff --git a/docs/cn/features/3-circuit-break-mechanism.md b/docs/cn/features/3-circuit-break-mechanism.md
deleted file mode 100644
index 3ae2f7a..0000000
--- a/docs/cn/features/3-circuit-break-mechanism.md
+++ /dev/null
@@ -1,28 +0,0 @@
-## 3.熔断
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-DeFiBus基于队列来做消费端的负载均衡,对同一个消费组,除广播模式外,每个队列只由一个消费者实例消费。当一个实例处理能力下降或者异常出现消息堆积时,为了避免堆积情况继续加剧,DeFiBus会触发队列的熔断,此时生产者实例在感知到队列熔断之后,会优先把消息发送到其他没有熔断的队列上,暂停往熔断队列上写入新消息。当堆积消除后,熔断被解除,生产者恢复往该队列发送消息。
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-DeFiBus对每个Topic定义了深度的属性,表示Topic的队列允许堆积的最大消息条数。消息堆积数表示队列中尚未下发给消费者实例的消息条数,可由队列中最新一条消息的offset与消费者实例已经获取到的消息的offset的差值计算。
-<div align=center>
-
-![offset](../../../docs/images/features/circuit-break-p1.png)
-
-</div>
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-当Consumer出现异常或者触发了流控,Consumer拉消息过程受阻,队列的DeliverOffset停止不前,新消息持续写入,MaxOffset不断变大,最终MaxOffset与DeliverOffset将超过Topic的最大深度限制,触发队列熔断。
-
----
-
-#### Links:
-
-* [架构介绍](../../../README.md)
-* [Request-Reply调用](docs/cn/features/1-request-response-call.md)
-* [灰度发布](docs/cn/features/2-dark-launch.md)
-* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md)
-* [服务就近](docs/cn/features/4-invoke-service-nearby.md)
-* [应用多活](docs/cn/features/5-multi-active.md)
-* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md)
-* [容错机制](docs/cn/features/8-fault-tolerant.md)
diff --git a/docs/cn/features/4-invoke-service-nearby.md b/docs/cn/features/4-invoke-service-nearby.md
deleted file mode 100644
index 4a24248..0000000
--- a/docs/cn/features/4-invoke-service-nearby.md
+++ /dev/null
@@ -1,34 +0,0 @@
-## 4.服务就近
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-为了保证高可用,服务的部署通常分布在多个机房、区域。我们希望服务之间能够就近调用,减少跨机房跨区域网络访问的时延问题。对此,DeFiBus在Broker和客户端上都增加了区域的属性来标识实例属于哪个区域。对于Producer,消息会优先发往同区域内的Broker集群上;对于Consumer,则优先监听同区域内的Queue;当一个区域内没有Consumer实例监听时,则由其他区域的Consumer实例跨区域监听。
-
-### 就近发送
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在创建Producer时,通过设置```DeFiBusClientConfig.setClusterPrefix("your region")```
-来标识Producer实例所在的区域。Producer在每次发送消息会先选则一个Queue来作为发送的目标队列。当启用就近发送时,Producer优先选择与自己同区域内的Queue,当本区域内没有可用Queue时,则选择其他区域的Queue。
-<div align=center>
-<img src="../../images/features/invoke_nearby-p1.png" width="600" />
-</div>
-
-### 就近监听
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-就近监听指的是Consumer在做负载均衡分配Queue的时候,每个区域内的Queue只由该区域内的Consumer监听和消费,当且仅当一个区域内没有订阅该Topic的Consumer时,由其他区域订阅了该Topic的Consumer跨区域监听和消费这些Queue。虽然Consumer是在同区域内就近消费,但仍通过心跳维持跨区域的连接,以保证能够随时跨区域接管消费。
-
-<div align=center>
-<img src="../../images/features/subscribe-nearby-p1.png" width="600" />
-</div>
-
----
-
-#### Links:
-
-* [架构介绍](../../../README.md)
-* [Request-Reply调用](docs/cn/features/1-request-response-call.md)
-* [灰度发布](docs/cn/features/2-dark-launch.md)
-* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md)
-* [服务就近](docs/cn/features/4-invoke-service-nearby.md)
-* [应用多活](docs/cn/features/5-multi-active.md)
-* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md)
-* [容错机制](docs/cn/features/8-fault-tolerant.md)
\ No newline at end of file
diff --git a/docs/cn/features/5-multi-active.md b/docs/cn/features/5-multi-active.md
deleted file mode 100644
index 9e19d6d..0000000
--- a/docs/cn/features/5-multi-active.md
+++ /dev/null
@@ -1,21 +0,0 @@
-## 5.同城多中心多活
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-同城多中心多活指的是应用的多活,在DeFiBus集群正常运行的情况下,应用部署在多个数据中心,一个数据中心的应用实例全部挂掉后,DeFiBus能够自动将应用流量切换到另一个数据中心的应用实例上,保证应用能够持续稳定地提供服务而不中断。同城多中心多活得益于DeFiBus的服务就近特性,结合应用部署的规划,使得正常情况下服务调用发生在同一个数据中心,当一个中心的应用出现故障时,能够有其他中心的实例接管服务。
-
-<div align=center>
-<img src="../../images/features/tongchengduohuo-p1.png" width="800" />
-</div>
-
----
-
-#### Links:
-
-* [架构介绍](../../../README.md)
-* [Request-Reply调用](docs/cn/features/1-request-response-call.md)
-* [灰度发布](docs/cn/features/2-dark-launch.md)
-* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md)
-* [服务就近](docs/cn/features/4-invoke-service-nearby.md)
-* [应用多活](docs/cn/features/5-multi-active.md)
-* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md)
-* [容错机制](docs/cn/features/8-fault-tolerant.md)
\ No newline at end of file
diff --git a/docs/cn/features/6-dynamic-adjust-queue.md b/docs/cn/features/6-dynamic-adjust-queue.md
deleted file mode 100644
index 287fa7f..0000000
--- a/docs/cn/features/6-dynamic-adjust-queue.md
+++ /dev/null
@@ -1,38 +0,0 @@
-## 自动伸缩Queue
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-在同一个消费组内,每个队列只由一个实例消费。当队列数小于消费者实例数时,会有部分消费者实例分不到队列;反之,当队列数大于消费者实例数时,每个消费者需要消费多个队列。队列数不是消费者实例数的整数倍时,则会出现部分实例需要消费比同组内的其他实例更多的队列,出现负载不均衡问题。
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-DeFiBus提供了队列数量自动调整的特性。当有Consumer新注册或者去注册时,Broker触发队列的自动伸缩,根据当前在线的消费者实例个数,增加或者减少队列个数,使队列个数与消费者实例数保持一致。
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-当队列数需要增加时,首先调整Topic的ReadQueueNum,将可读的队列数扩增;10s之后,再调整Topic的WriteQueueNum,将可写的队列数扩增。这样使得新扩增的队列能够先被消费者感知并监听上,然后才让生产者感知到,往新队列上发送消息,是扩增操作更平滑。
-
-<div align=center>
-<img src="../../images/features/adjust-queue-expand-p1.png" width="500" />
-</div>
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-当队列数需要减少时,首先调整Topic的WriteQueueNum,将可写的队列数缩减;5分钟(默认,可配置)后先检查即将被缩减的队列中是否有消息没有被消费完,如果有,则继续延迟缩减操作,使消费者能够继续消费完队列中的消息;如果没有,则调整ReadQueueNum,将可写的队列数缩减。
-
-<div align=center>
-<img src="../../images/features/adjust-queue-shrink-p1.png" width="500" />
-</div>
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-对于多个消费组订阅相同Topic并且是集群消费模式时,在计算扩缩的队列个数时,以最大的消费组的消费者实例数为准,保证拥有最多实例数的消费组内每个消费者实例都能够分到Queue进行消费。
-
-
----
-
-#### Links:
-
-* [架构介绍](../../../README.md)
-* [Request-Reply调用](docs/cn/features/1-request-response-call.md)
-* [灰度发布](docs/cn/features/2-dark-launch.md)
-* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md)
-* [服务就近](docs/cn/features/4-invoke-service-nearby.md)
-* [应用多活](docs/cn/features/5-multi-active.md)
-* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md)
-* [容错机制](docs/cn/features/8-fault-tolerant.md)
\ No newline at end of file
diff --git a/docs/cn/features/7-isolation-mechanism.md b/docs/cn/features/7-isolation-mechanism.md
deleted file mode 100644
index 3c86bc9..0000000
--- a/docs/cn/features/7-isolation-mechanism.md
+++ /dev/null
@@ -1,26 +0,0 @@
-## 隔离机制
-
-Producer在往Topic发送消息时,会按照MessageQueueSelector定义的选择策略,从Topic的所有MessageQueue中选择一个作为目标队列发送消息。
-当队列发生熔断,或者Broker故障导致队列发送消息异常时,如果没有对这些队列进行特殊处理,下次再轮到发这个队列的时候仍然可能失败。
-
-DeFiBus提供异常队列的隔离机制,当往某个队列发送消息失败时,将队列标记为隔离状态,在隔离过期之前将不再往这个队列发送消息,避免再次失败,降低失败概率。
-
-异常队列隔离机制分为两步:  
-**-发现并标记队列为隔离**  
-在发送回调中更新发送队列的健康状态,如果执行的是onSuccess分支,则标记队列为健康,去除队列的隔离标记;如果执行的是onException分支,则标记队列为隔离状态。
-
-**-不选择隔离中的队列发送消息**  
-在MessageQueueSelector中实现隔离机制的过滤逻辑,每次进行队列的选择时,优先从没有标记为隔离的队列中选择。当所有队列都被标记为隔离时,则从所有队列中选择,保证每次都要选出一个队列。
-
----
-
-#### Links:
-
-* [架构介绍](../../../README.md)
-* [Request-Reply调用](docs/cn/features/1-request-response-call.md)
-* [灰度发布](docs/cn/features/2-dark-launch.md)
-* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md)
-* [服务就近](docs/cn/features/4-invoke-service-nearby.md)
-* [应用多活](docs/cn/features/5-multi-active.md)
-* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md)
-* [容错机制](docs/cn/features/8-fault-tolerant.md)
\ No newline at end of file
diff --git a/docs/cn/features/8-fault-tolerant.md b/docs/cn/features/8-fault-tolerant.md
deleted file mode 100644
index 6814e12..0000000
--- a/docs/cn/features/8-fault-tolerant.md
+++ /dev/null
@@ -1,51 +0,0 @@
-## 8.容错机制
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在金融场景下,对可用性和稳定性的要求非常高,中间件对机器故障、网络故障、应用故障以及中间件本身的故障等常见故障场景需要有容错能力,降低故障带来的影响。
-
-### 隔离机制
-
-##### 1. Producer端的隔离
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-Producer在往Topic发送消息时,会按照MessageQueueSelector定义的选择策略,从Topic的所有MessageQueue中选择一个作为目标队列发送消息。
-当队列发生熔断,或者Broker故障导致队列发送消息异常时,如果没有对这些队列进行特殊处理,下次再轮到发这个队列的时候仍然可能失败。
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeFiBus提供异常队列的隔离机制,当往某个队列发送消息失败时,将队列标记为隔离状态,在隔离过期之前将不再往这个队列发送消息,避免再次失败,降低失败概率。
-
-异常队列隔离机制分为两步:  
-**-发现并标记队列为隔离**  
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-在发送回调中更新发送队列的健康状态,如果执行的是onSuccess分支,则标记队列为健康,去除队列的隔离标记;如果执行的是onException分支,则标记队列为隔离状态。
-
-**-不选择隔离中的队列发送消息**  
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-在MessageQueueSelector中实现隔离机制的过滤逻辑,每次进行队列的选择时,优先从没有标记为隔离的队列中选择。当所有队列都被标记为隔离时,则从所有队列中选择,保证每次都要选出一个队列。
-
-##### 2. Consumer端的隔离
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-Consumer由拉消息线程只负责把拉消息请求以异步发送的形式发送出去。在正常情况下,每次拉消息请求的执行都很快,不会有卡顿。一旦有Broker故障导致PullRequest的执行发生了卡顿,则该Consumer监听的所有Queue都会因为PullRequest执行的延迟而出现消息消费延迟。对于RR同步请求的场景,这种是不能够接受的。
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-创建连接采用的是同步建立连接的策略,线程执行创建新连接时必须等待连接创建完成或者连接超时。当有Broker故障连不上时,就算是异步发送,也会因为同步等待连接建立而阻塞。此时就会出现一个Broker的故障导致其他健康Broker的消息消费出现延迟。
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-DeFiBus在Consumer拉消息的过程中增加了对拉消息任务的隔离,此处的隔离指的是将疑似有问题的任务隔离到另外的线程中执行,保证拉消息线程能够正常处理其他正常的任务。当发现执行拉消息耗时超过设定的阈值时,将该拉消息任务对应的Broker列入“隔离名单”中,在隔离过期之前,隔离Broker的拉消息请求都转交给另外线程执行,避免阻塞拉消息主线程,从而避免故障的Broker影响健康Broker的消息消费时效。
-
-### 连接空闲机制
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当连接的读或者写空闲超过60秒时,将主动断开连接。
-
-
----
-
-#### Links:
-
-* [架构介绍](../../../README.md)
-* [Request-Reply调用](docs/cn/features/1-request-response-call.md)
-* [灰度发布](docs/cn/features/2-dark-launch.md)
-* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md)
-* [服务就近](docs/cn/features/4-invoke-service-nearby.md)
-* [应用多活](docs/cn/features/5-multi-active.md)
-* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md)
-* [容错机制](docs/cn/features/8-fault-tolerant.md)
\ No newline at end of file
diff --git a/docs/cn/features/9-publish-type.md b/docs/cn/features/9-publish-type.md
deleted file mode 100644
index 18ddd6b..0000000
--- a/docs/cn/features/9-publish-type.md
+++ /dev/null
@@ -1,33 +0,0 @@
-## 2. 单播、多播、广播
-
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeFiBus支持单播、多播、广播消费模式。
-
-### 单播
-
-<div align=center>
-
-![unicast](../../images/features/unicast.png)
-
-</div>
-
-单播模式下,topic只被一个消费组监听;接收消息时,消费组内有且仅有一个实例会收到消息。
-
-### 多播
-
-<div align=center>
-
-![multicast](../../images/features/multicast.png)
-
-</div>
-
-多播模式下,topic被多个消费组监听;接收消息时,每个消费组内有且仅有一个实例会收到消息。
-
-### 广播
-
-<div align=center>
-
-![broadcast](../../images/features/broadcast.png)
-
-</div>
-
-广播模式下,监听此topic的每个消费组中的每个实例都需要收到消息。
\ No newline at end of file
diff --git a/docs/cn/features/https.zh-CN.md b/docs/cn/features/https.zh-CN.md
index 044e89b..fa1244f 100644
--- a/docs/cn/features/https.zh-CN.md
+++ b/docs/cn/features/https.zh-CN.md
@@ -9,7 +9,6 @@ config env varible
 -Dssl.server.protocol=TLSv1.1   //默认值 TLSv1.1 
 -Dssl.server.cer=sChat2.jks     //把文件放到启动脚本start.sh 指定的conPath目录下
 -Dssl.server.pass=sNetty
-
 ```
 
 2.在eventmesh-sdk-java 中配置
diff --git a/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md
index b6bc593..adc9703 100644
--- a/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md
+++ b/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md
@@ -7,7 +7,7 @@
 ```
 建议使用64位操作系统,建议使用Linux / Unix;
 64位JDK 1.8+;
-Gradle至少为5.6, 推荐 5.6.*
+Gradle至少为7.0, 推荐 7.0.*
 ```
 
 ### 1.2 下载源码
@@ -19,7 +19,7 @@ Gradle至少为5.6, 推荐 5.6.*
 
 ```$ xslt
 unzip EventMesh-master.zip
-cd / *您的部署路径* /EventMesh-master/eventmesh-runtime
+cd / *您的部署路径* /EventMesh-master
 gradle clean dist tar -x test
 ```
 
@@ -68,11 +68,12 @@ sh start.sh
 **2.3.2 配置VM启动参数**
 
 ```java
--Dlog4j.configurationFile=..\eventmesh-runtime\conf\log4j2.xml
--Deventmesh.log.home=..\eventmesh-runtime\logs
--Deventmesh.home=..\eventmesh-runtime
--DconfPath=..\eventmesh-runtime\conf
+-Dlog4j.configurationFile=eventmesh-runtime/conf/log4j2.xml
+-Deventmesh.log.home=eventmesh-runtime/logs
+-Deventmesh.home=eventmesh-runtime
+-DconfPath=eventmesh-runtime/conf
 ```
+> 注:如果操作系统为Windows, 可能需要将文件分隔符换成\
 
 **2.3.3 配置build.gradle文件**
 
@@ -190,8 +191,7 @@ docker run -d -p 10911:10911 -p 10909:10909 -v `pwd`/data/broker/logs:/root/logs
 
 Windows
 
--
-Windows系统下运行示例可以参考[这里](https://github.com/apache/incubator-eventmesh/blob/develop/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md)
+- Windows系统下运行示例可以参考[这里](https://github.com/apache/incubator-eventmesh/blob/develop/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md)
 
 Linux
 
diff --git a/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md
index 43df033..aa5768a 100644
--- a/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md
+++ b/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md
@@ -16,7 +16,7 @@ TCP 和 Http 示例都在**eventmesh-test**模块下
 
 <h4>异步消息</h4>
 
-- 创建主题FT0-e-80010000-01-1,可以通过rocketmq-console或者rocketmq tools 命令
+- 创建主题TEST-TOPIC-TCP-ASYNC,可以通过rocketmq-console或者rocketmq tools 命令
 
 - 启动消费者,订阅上一步骤已经创建的Topic
 
@@ -32,7 +32,7 @@ TCP 和 Http 示例都在**eventmesh-test**模块下
 
 <h4>广播消息</h4>
 
-- 创建主题FT0-e-80030000-01-3,可以通过rocketmq-console或者rocketmq tools 命令
+- 创建主题TEST-TOPIC-TCP-BROADCAST,可以通过rocketmq-console或者rocketmq tools 命令
 
 - 启动消费端,订阅上一步骤已经创建的Topic
 
@@ -56,7 +56,7 @@ TCP 和 Http 示例都在**eventmesh-test**模块下
 
 > 生产者将事件发送给下游即可,无需等待响应
 
-- 创建主题FT0-e-80010001-01-1,可以通过rocketmq-console或者rocketmq tools 命令
+- 创建主题TEST-TOPIC-HTTP-ASYNC,可以通过rocketmq-console或者rocketmq tools 命令
 
 - 启动消费端,订阅Topic
 
diff --git a/docs/cn/instructions/quickstart.zh-CN.md b/docs/cn/instructions/quickstart.zh-CN.md
index d5f3840..e14bf12 100644
--- a/docs/cn/instructions/quickstart.zh-CN.md
+++ b/docs/cn/instructions/quickstart.zh-CN.md
@@ -10,15 +10,15 @@ Gradle至少为5.6, 推荐 5.6.*
 
 ### 部署eventmesh-store
 
-阅读更多[这里](eventmesh-store-quickstart.md)
+阅读更多[这里](eventmesh-store-quickstart.zh-CN.md)
 
 ### 部署eventmesh-runtime
 
-阅读更多[这里](eventmesh-runtime-quickstart.md)
+阅读更多[这里](eventmesh-runtime-quickstart.zh-CN.md)
 
 ### 运行eventmesh sdk演示
 
-阅读更多[这里](eventmesh-sdk-java-quickstart.md)
+阅读更多[这里](eventmesh-sdk-java-quickstart.zh-CN.md)
 
 ### 通信协议
 
diff --git a/docs/en/README.md b/docs/en/README.md
index 254cd2a..1b8d3c1 100644
--- a/docs/en/README.md
+++ b/docs/en/README.md
@@ -1,9 +1,12 @@
-[![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh)
-[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master)
-[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases)
+# Apache EventMesh (Incubating)
+[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml)
+[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh)
+[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java)
+[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/)
+[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases)
 [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
 
-[点我查看中文版](/cn/README.md)
+[点我查看中文版](../cn/README.md)
 
 ## What is Event Mesh?
 
@@ -72,10 +75,10 @@ Key components:
 
 ## Contributing
 
-Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines
+Contributions are always welcomed! Please see [CONTRIBUTING](../../CONTRIBUTING.md) for detailed guidelines
 
 You can start with the issues labeled with good first issue.
-[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues)
+[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues)
 
 ## License
 
diff --git a/docs/en/features/architecture.md b/docs/en/features/architecture.md
deleted file mode 100644
index e69de29..0000000
diff --git a/docs/en/features/eventmesh-cloudevents-sdk-binding.md b/docs/en/features/eventmesh-cloudevents-sdk-binding.md
new file mode 100644
index 0000000..3c1224f
--- /dev/null
+++ b/docs/en/features/eventmesh-cloudevents-sdk-binding.md
@@ -0,0 +1,55 @@
+# Lightweight EventMesh SDK (CloudEvents)
+
+## Introduction
+
+[EventMesh(incubating)](https://github.com/apache/incubator-eventmesh) is a dynamic
+cloud-native eventing infrastructure.
+
+[CloudEvents](https://github.com/cloudevents/spec) is a specification for describing
+event data in common formats to provide interoperability across services, platforms and systems.
+
+As of May 2021, EventMesh contains the following
+major components: `eventmesh-runtime`, `eventmesh-sdk-java` and `eventmesh-connector-rocketmq`.
+For a customer to use EventMesh, `eventmesh-runtime` can be deployed as microservices to transmit
+customer's events between event producers and consumers. Customer's applications can then interact
+with `eventmesh-runtime` using `eventmesh-sdk-java` to publish/subscribe for events on given topics.
+
+CloudEvents support has been a highly desired feature by EventMesh users. There are many reasons
+for users to prefer using a SDK with CloudEvents support:
+- CloudEvents is a more widely accepted and supported way to describe events. `eventmesh-sdk-java`
+  currently uses the `LiteMessage` structure to describe events, which is less standardized.
+- CloudEvents's Java SDK has a wider range of distribution methods. For example, EventMesh users
+  currently need to use the SDK tarball or build from source for every EventMesh release. With
+  CloudEvents support, it's easier for users to take a dependency on EventMesh's SDK using CloudEvents's
+  public distributions (e.g. through a Maven configuration).
+- CloudEvents's SDK supports multiple languages. Although EventMesh currently only supports a Java SDK,
+  in future if more languages need to be supported, the extensions can be easier with experience on
+  binding Java SDK with CloudEvents.
+
+## Requirements
+
+### Functional Requirements
+
+| Requirement ID | Requirement Description | Comments |
+| -------------- | ----------------------- | -------- |
+| F-1            | EventMesh users should be able to depend on a public SDK to publish/subscribe events in CloudEvents format | Functionality |
+| F-2            | EventMesh users should continue to have access to existing EventMesh client features (e.g. load balancing) with an SDK that supports CloudEvent | Feature Parity |
+| F-3            | EventMesh developers should be able to sync `eventmesh-sdk-java` and an SDK with CloudEvents support without much effort/pain | Maintainability |
+
+### Performance Requirements
+
+| Requirement ID | Requirement Description | Comments |
+| -------------- | ----------------------- | -------- |
+| P-1            | Client side latency for SDK with CloudEvents support should be similar to current SDK | |
+
+## Design Details
+
+Binding with the CloudEvents Java SDK (similar to what Kafka already did, see Reference for more details)
+should be an easy way to achieve the requirements.
+
+Design details TBD.
+
+## Appendix
+
+### References
+- https://cloudevents.github.io/sdk-java/kafka
diff --git a/docs/en/features/request-response-call.md b/docs/en/features/request-response-call.md
deleted file mode 100644
index e69de29..0000000
diff --git a/docs/en/instructions/eventmesh-runtime-quickstart.md b/docs/en/instructions/eventmesh-runtime-quickstart.md
index 3b1e109..0536e5b 100644
--- a/docs/en/instructions/eventmesh-runtime-quickstart.md
+++ b/docs/en/instructions/eventmesh-runtime-quickstart.md
@@ -7,7 +7,7 @@
 ```
 64bit OS, Linux/Unix is recommended;
 64bit JDK 1.8+;
-Gradle at least 5.6, eg 5.6.*
+Gradle at least 7.0, eg 7.0.*
 ```
 
 ### 1.2 download sources
@@ -19,8 +19,8 @@ You will get **EventMesh-master.zip**
 
 ```$xslt
 unzip EventMesh-master.zip
-cd /*YOUR DEPLOY PATH*/EventMesh-master/eventmesh-runtime
-gradle clean tar -x test
+cd /*YOUR DEPLOY PATH*/EventMesh-master
+gradle clean dist tar -x test
 ```
 
 You will get **EventMesh_1.2.0.tar.gz** in directory /* YOUR DEPLOY PATH */EventMesh-master/build
@@ -63,17 +63,18 @@ Same with 1.2
 - eventmesh-sdk-java : eventmesh java client sdk
 - eventmesh-starter : eventmesh project local start entry
 
-ps:The loading of connector plugin follows the Java SPI mechanism, it's necessary to configure the mapping file of
+> ps: The loading of connector plugin follows the Java SPI mechanism, it's necessary to configure the mapping file of
 related interface and implementation class under /main/resources/meta-inf/services in the corresponding module
 
 **2.3.2 Configure VM Options**
 
 ```java
--Dlog4j.configurationFile=..\eventmesh-runtime\conf\log4j2.xml
--Deventmesh.log.home=..\eventmesh-runtime\logs
--Deventmesh.home=..\eventmesh-runtime
--DconfPath=..\eventmesh-runtime\conf
+-Dlog4j.configurationFile=eventmesh-runtime/conf/log4j2.xml
+-Deventmesh.log.home=eventmesh-runtime/logs
+-Deventmesh.home=eventmesh-runtime
+-DconfPath=eventmesh-runtime/conf
 ```
+> ps: If you use Windows, you may need to replace the file separator to \
 
 **2.3.3 Configure build.gradle file**
 
diff --git a/docs/en/instructions/eventmesh-sdk-java-quickstart.md b/docs/en/instructions/eventmesh-sdk-java-quickstart.md
index a754502..53eb673 100644
--- a/docs/en/instructions/eventmesh-sdk-java-quickstart.md
+++ b/docs/en/instructions/eventmesh-sdk-java-quickstart.md
@@ -17,7 +17,7 @@ the `resources` directory
 
 #### Async msg
 
-- create topic FT0-e-80010000-01-1 on rocketmq-console
+- create topic TEST-TOPIC-TCP-ASYNC on rocketmq-console
 
 - start consumer ,subscribe topic in previous step.
 
@@ -33,7 +33,7 @@ Run the main method of org.apache.eventmesh.tcp.demo.AsyncPublish
 
 #### Broadcast msg
 
-- create topic FT0-e-80030000-01-3 on rocketmq-console
+- create topic TEST-TOPIC-TCP-BROADCAST on rocketmq-console
 
 - start consumer ,subscribe topic in previous step.
 
@@ -57,7 +57,7 @@ Run the main method of org.apache.eventmesh.tcp.demo.AsyncPublishBroadcast
 
 > producer send the event to consumer and don't need waiting response msg from consumer
 
-- create topic FT0-e-80010001-01-1 on rocketmq-console
+- create topic TEST-TOPIC-HTTP-ASYNC on rocketmq-console
 
 - start consumer, subscribe topic
 
diff --git a/docs/en/instructions/eventmesh-store-quickstart.md b/docs/en/instructions/eventmesh-store-quickstart.md
index b5fd94f..74158e8 100644
--- a/docs/en/instructions/eventmesh-store-quickstart.md
+++ b/docs/en/instructions/eventmesh-store-quickstart.md
@@ -16,7 +16,7 @@ You will get **DefiBus-master.zip**
 
 ### build sources
 
-The eventmesh-store takes DeFiBus for example at the follwing parts, because eventmesh depends on defibus as store layer
+The eventmesh-store takes DeFiBus for example at the following parts, because eventmesh depends on defibus as store layer
 by default, other implements such as Rocketmq etc. is coming soon.
 
 ```
diff --git a/docs/eventmesh.md b/docs/eventmesh.md
index 9460476..432c093 100644
--- a/docs/eventmesh.md
+++ b/docs/eventmesh.md
@@ -30,7 +30,7 @@ EventMesh允许将来自一个应用程序的事件动态路由到任何其他
 ## 开源地址
 
 * https://github.com/WeBankFinTech/DeFiBus
-* https://github.com/WeBankFinTech/EventMesh
+* https://github.com/apache/incubator-eventmesh
 * https://gitee.com/WeBank/DeFiBus
 * https://gitee.com/WeBank/EventMesh
 
diff --git a/docs/images/eventmesh-panels.png b/docs/images/eventmesh-panels.png
index 7abab98..898dbb4 100644
Binary files a/docs/images/eventmesh-panels.png and b/docs/images/eventmesh-panels.png differ
diff --git a/docs/images/eventmesh-runtime.png b/docs/images/eventmesh-runtime.png
index b826c12..a87a8d6 100644
Binary files a/docs/images/eventmesh-runtime.png and b/docs/images/eventmesh-runtime.png differ
diff --git a/docs/images/logo1.png b/docs/images/logo1.png
new file mode 100644
index 0000000..00cba89
Binary files /dev/null and b/docs/images/logo1.png differ
diff --git a/docs/images/logo2.png b/docs/images/logo2.png
new file mode 100644
index 0000000..2480208
Binary files /dev/null and b/docs/images/logo2.png differ
diff --git a/eventmesh-common/gradle.properties b/eventmesh-common/gradle.properties
index 1f92fb3..72ea1ac 100644
--- a/eventmesh-common/gradle.properties
+++ b/eventmesh-common/gradle.properties
@@ -15,5 +15,5 @@
 # limitations under the License.
 #
 group=org.apache.eventmesh
-version=1.2.0
+version=1.2.0-release
 jdk=1.8
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/Constants.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/Constants.java
index 937859a..c2457ad 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/Constants.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/Constants.java
@@ -21,10 +21,6 @@ public class Constants {
 
     public static final String DEFAULT_CHARSET = "UTF-8";
 
-    public static final String TARGET_EVENTMESH_REGION = "TARGET_EVENTMESH_REGION";
-
-    public static final String CONSTANTS_DEFAULT_REGION_KEY = "default";
-
     public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
 
     public static final String LANGUAGE_JAVA = "JAVA";
@@ -47,8 +43,6 @@ public class Constants {
 
     public static final String CONSTANTS_INSTANCE_DESC_IDC = "idc";
 
-    public static final String CONSTANTS_INSTANCE_DESC_DCN = "dcn";
-
     public static final String CONSTANTS_INSTANCE_DESC_SYSID = "sysId";
 
     public static final String CONSTANTS_INSTANCE_DESC_IP = "ip";
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/IPUtil.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/IPUtil.java
index 4cd19e4..5165deb 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/IPUtil.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/IPUtil.java
@@ -35,7 +35,7 @@ public class IPUtil {
     public static String getLocalAddress() {
         // if the progress works under docker environment
         // return the host ip about this docker located from environment value
-        String dockerHostIp = System.getenv("webank_docker_host_ip");
+        String dockerHostIp = System.getenv("docker_host_ip");
         if (dockerHostIp != null && !"".equals(dockerHostIp))
             return dockerHostIp;
 
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/command/HttpCommand.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/command/HttpCommand.java
index 3117956..d36a1ae 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/command/HttpCommand.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/command/HttpCommand.java
@@ -17,19 +17,9 @@
 
 package org.apache.eventmesh.common.command;
 
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
 import com.alibaba.fastjson.JSON;
-
 import io.netty.buffer.Unpooled;
-import io.netty.handler.codec.http.DefaultFullHttpResponse;
-import io.netty.handler.codec.http.HttpHeaderNames;
-import io.netty.handler.codec.http.HttpHeaderValues;
-import io.netty.handler.codec.http.HttpHeaders;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import io.netty.handler.codec.http.HttpVersion;
-
+import io.netty.handler.codec.http.*;
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.eventmesh.common.Constants;
@@ -38,6 +28,9 @@ import org.apache.eventmesh.common.protocol.http.body.Body;
 import org.apache.eventmesh.common.protocol.http.header.BaseResponseHeader;
 import org.apache.eventmesh.common.protocol.http.header.Header;
 
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+
 public class HttpCommand {
 
     private static AtomicLong requestId = new AtomicLong(0);
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java
index 931f41b..08a44cb 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java
@@ -31,9 +31,7 @@ import org.apache.commons.lang3.StringUtils;
 
 public class CommonConfiguration {
     public String eventMeshEnv = "P";
-    public String eventMeshRegion = "";
     public String eventMeshIDC = "FT";
-    public String eventMeshDCN = "1C0";
     public String eventMeshCluster = "LS";
     public String eventMeshName = "";
     public String sysID = "5477";
@@ -68,10 +66,6 @@ public class CommonConfiguration {
             Preconditions.checkState(StringUtils.isNotEmpty(eventMeshEnvStr), String.format("%s error", ConfKeys.KEYS_EVENTMESH_ENV));
             eventMeshEnv = StringUtils.deleteWhitespace(eventMeshEnvStr);
 
-            String eventMeshRegionStr = configurationWraper.getProp(ConfKeys.KEYS_EVENTMESH_REGION);
-            Preconditions.checkState(StringUtils.isNotEmpty(eventMeshRegionStr), String.format("%s error", ConfKeys.KEYS_EVENTMESH_REGION));
-            eventMeshRegion = StringUtils.deleteWhitespace(eventMeshRegionStr);
-
             String sysIdStr = configurationWraper.getProp(ConfKeys.KEYS_EVENTMESH_SYSID);
             Preconditions.checkState(StringUtils.isNotEmpty(sysIdStr) && StringUtils.isNumeric(sysIdStr), String.format("%s error", ConfKeys.KEYS_EVENTMESH_SYSID));
             sysID = StringUtils.deleteWhitespace(sysIdStr);
@@ -88,10 +82,6 @@ public class CommonConfiguration {
             Preconditions.checkState(StringUtils.isNotEmpty(eventMeshIDCStr), String.format("%s error", ConfKeys.KEYS_EVENTMESH_IDC));
             eventMeshIDC = StringUtils.deleteWhitespace(eventMeshIDCStr);
 
-            String eventMeshDCNStr = configurationWraper.getProp(ConfKeys.KEYS_EVENTMESH_DCN);
-            Preconditions.checkState(StringUtils.isNotEmpty(eventMeshDCNStr), String.format("%s error", ConfKeys.KEYS_EVENTMESH_DCN));
-            eventMeshDCN = StringUtils.deleteWhitespace(eventMeshDCNStr);
-
             eventMeshServerIp = configurationWraper.getProp(ConfKeys.KEYS_EVENTMESH_SERVER_HOST_IP);
             if (StringUtils.isBlank(eventMeshServerIp)) {
                 eventMeshServerIp = getLocalAddr();
@@ -102,12 +92,8 @@ public class CommonConfiguration {
     static class ConfKeys {
         public static String KEYS_EVENTMESH_ENV = "eventMesh.server.env";
 
-        public static String KEYS_EVENTMESH_REGION = "eventMesh.server.region";
-
         public static String KEYS_EVENTMESH_IDC = "eventMesh.server.idc";
 
-        public static String KEYS_EVENTMESH_DCN = "eventMesh.server.dcn";
-
         public static String KEYS_EVENTMESH_SYSID = "eventMesh.sysid";
 
         public static String KEYS_EVENTMESH_SERVER_CLUSTER = "eventMesh.server.cluster";
diff --git a/eventmesh-runtime/src/test/java/client/common/ClientConstants.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/LoadBalanceSelector.java
similarity index 63%
copy from eventmesh-runtime/src/test/java/client/common/ClientConstants.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/LoadBalanceSelector.java
index 6c34774..3bee08c 100644
--- a/eventmesh-runtime/src/test/java/client/common/ClientConstants.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/LoadBalanceSelector.java
@@ -15,19 +15,30 @@
  * limitations under the License.
  */
 
-package client.common;
+package org.apache.eventmesh.common.loadbalance;
 
-
-public interface ClientConstants {
+/**
+ * LoadBalance Interface
+ *
+ * <p> see {@link RandomLoadBalanceSelector}
+ * <p> see {@link WeightRoundRobinLoadBalanceSelector}
+ *
+ * @param <T> Target type
+ */
+public interface LoadBalanceSelector<T> {
 
     /**
-     * CLIENT HEART BEAT TIME
+     * Select one
+     *
+     * @return target
      */
-    int HEARTBEAT = 1000 * 60;
+    T select();
 
-    long DEFAULT_TIMEOUT_IN_MILLISECONDS = 3000;
+    /**
+     * load balance type see {@link LoadBalanceType}
+     *
+     * @return load balance type of the selector
+     */
+    LoadBalanceType getType();
 
-    String SYNC_TOPIC = "FT0-s-80000000-01-0";
-    String ASYNC_TOPIC = "FT0-e-80010000-01-1";
-    String BROADCAST_TOPIC = "FT0-e-80030000-01-3";
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/LoadBalanceType.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/LoadBalanceType.java
new file mode 100644
index 0000000..858a69b
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/LoadBalanceType.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.eventmesh.common.loadbalance;
+
+public enum LoadBalanceType {
+    RANDOM(0, "random load balance strategy"),
+    WEIGHT_ROUND_ROBIN(1, "weight round robin load balance strategy");
+
+    private int code;
+    private String desc;
+
+    LoadBalanceType(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/RandomLoadBalanceSelector.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/RandomLoadBalanceSelector.java
new file mode 100644
index 0000000..fc741a5
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/RandomLoadBalanceSelector.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.common.loadbalance;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.RandomUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ * This selector use random strategy.
+ * Each selection will randomly give one from the given list
+ *
+ * @param <T>
+ */
+public class RandomLoadBalanceSelector<T> implements LoadBalanceSelector<T> {
+
+    private final Logger logger = LoggerFactory.getLogger(RandomLoadBalanceSelector.class);
+
+    private final List<T> clusterGroup;
+
+    public RandomLoadBalanceSelector(List<T> clusterGroup) {
+        this.clusterGroup = clusterGroup;
+    }
+
+    @Override
+    public T select() {
+        if (CollectionUtils.isEmpty(clusterGroup)) {
+            logger.warn("No servers available");
+            return null;
+        }
+        return clusterGroup.get(RandomUtils.nextInt(0, clusterGroup.size()));
+    }
+
+    @Override
+    public LoadBalanceType getType() {
+        return LoadBalanceType.RANDOM;
+    }
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/Weight.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/Weight.java
new file mode 100644
index 0000000..e793955
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/Weight.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.common.loadbalance;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class Weight<T> {
+
+    private T target;
+
+    private final int weight;
+
+    private final AtomicInteger currentWeight;
+
+    public Weight(T target, int weight) {
+        this.target = target;
+        this.weight = weight;
+        this.currentWeight = new AtomicInteger(0);
+    }
+
+    public void decreaseTotal(int total) {
+        currentWeight.addAndGet(-1 * total);
+    }
+
+    public void increaseCurrentWeight() {
+        currentWeight.addAndGet(weight);
+    }
+
+
+    public T getTarget() {
+        return target;
+    }
+
+    public void setTarget(T target) {
+        this.target = target;
+    }
+
+    public int getWeight() {
+        return weight;
+    }
+
+
+    public AtomicInteger getCurrentWeight() {
+        return currentWeight;
+    }
+
+    @Override
+    public String toString() {
+        return "Wight{" +
+                "target=" + target +
+                ", weight=" + weight +
+                ", currentWeight=" + currentWeight +
+                '}';
+    }
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/WeightRoundRobinLoadBalanceSelector.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/WeightRoundRobinLoadBalanceSelector.java
new file mode 100644
index 0000000..d6f2009
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/WeightRoundRobinLoadBalanceSelector.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.common.loadbalance;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ * This selector use the weighted round robin strategy to select from list.
+ * If the weight is greater, the probability of being selected is larger.
+ *
+ * @param <T>
+ */
+public class WeightRoundRobinLoadBalanceSelector<T> implements LoadBalanceSelector<T> {
+
+    private final Logger logger = LoggerFactory.getLogger(WeightRoundRobinLoadBalanceSelector.class);
+
+    private final List<Weight<T>> clusterGroup;
+
+    private final int totalWeight;
+
+    public WeightRoundRobinLoadBalanceSelector(List<Weight<T>> clusterGroup) {
+        int totalWeight = 0;
+        for (Weight<T> weight : clusterGroup) {
+            totalWeight += weight.getWeight();
+        }
+        this.clusterGroup = clusterGroup;
+        this.totalWeight = totalWeight;
+    }
+
+
+    @Override
+    @SuppressWarnings("ConstantConditions")
+    public T select() {
+        if (CollectionUtils.isEmpty(clusterGroup)) {
+            logger.warn("No servers available");
+            return null;
+        }
+        Weight<T> targetWeight = null;
+        for (Weight<T> weight : clusterGroup) {
+            weight.increaseCurrentWeight();
+            if (targetWeight == null || targetWeight.getCurrentWeight().get() < weight.getCurrentWeight().get()) {
+                targetWeight = weight;
+            }
+        }
+        targetWeight.decreaseTotal(totalWeight);
+        return targetWeight.getTarget();
+    }
+
+    @Override
+    public LoadBalanceType getType() {
+        return LoadBalanceType.WEIGHT_ROUND_ROBIN;
+    }
+}
diff --git a/eventmesh-runtime/src/test/java/client/common/ClientConstants.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubcriptionType.java
similarity index 68%
copy from eventmesh-runtime/src/test/java/client/common/ClientConstants.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubcriptionType.java
index 6c34774..6b6cb16 100644
--- a/eventmesh-runtime/src/test/java/client/common/ClientConstants.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubcriptionType.java
@@ -15,19 +15,29 @@
  * limitations under the License.
  */
 
-package client.common;
-
-
-public interface ClientConstants {
+package org.apache.eventmesh.common.protocol;
 
+public enum SubcriptionType {
+    /**
+     * SYNC
+     */
+    SYNC("SYNC"),
     /**
-     * CLIENT HEART BEAT TIME
+     * ASYNC
      */
-    int HEARTBEAT = 1000 * 60;
+    ASYNC("ASYNC");
+
+    private String type;
+
+    SubcriptionType(String type) {
+        this.type = type;
+    }
 
-    long DEFAULT_TIMEOUT_IN_MILLISECONDS = 3000;
+    public String getType() {
+        return type;
+    }
 
-    String SYNC_TOPIC = "FT0-s-80000000-01-0";
-    String ASYNC_TOPIC = "FT0-e-80010000-01-1";
-    String BROADCAST_TOPIC = "FT0-e-80030000-01-3";
+    public void setType(String type) {
+        this.type = type;
+    }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/Subscription.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubscriptionItem.java
similarity index 50%
copy from eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/Subscription.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubscriptionItem.java
index 83b0dc9..abcc22c 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/Subscription.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubscriptionItem.java
@@ -15,36 +15,57 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.common.protocol.tcp;
+package org.apache.eventmesh.common.protocol;
 
-import java.util.LinkedList;
-import java.util.List;
+public class SubscriptionItem {
 
-public class Subscription {
+    private String topic;
 
-    private List<String> topicList = new LinkedList<>();
+    private SubscriptionMode mode;
 
-    public Subscription() {
+    private SubcriptionType type;
+
+    public SubscriptionItem() {
+    }
+
+    public SubscriptionItem(String topic, SubscriptionMode mode, SubcriptionType type) {
+        this.topic = topic;
+        this.mode = mode;
+        this.type = type;
     }
 
-    public Subscription(List<String> topicList) {
-        this.topicList = topicList;
+    public SubcriptionType getType() {
+        return type;
     }
 
-    public List<String> getTopicList() {
-        return topicList;
+    public void setType(SubcriptionType type) {
+        this.type = type;
     }
 
-    public void setTopicList(List<String> topicList) {
-        this.topicList = topicList;
+    public String getTopic() {
+        return topic;
+    }
+
+    public void setTopic(String topic) {
+        this.topic = topic;
+    }
+
+    public SubscriptionMode getMode() {
+        return mode;
+    }
+
+    public void setMode(SubscriptionMode mode) {
+        this.mode = mode;
     }
 
     @Override
     public String toString() {
-        return "Subscription{" +
-                "topicList=" + topicList +
+        return "SubscriptionItem{" +
+                "topic=" + topic +
+                ", mode=" + mode +
+                ", type=" + type +
                 '}';
     }
+}
 
 
-}
diff --git a/eventmesh-runtime/src/test/java/client/common/ClientConstants.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubscriptionMode.java
similarity index 66%
copy from eventmesh-runtime/src/test/java/client/common/ClientConstants.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubscriptionMode.java
index 6c34774..ad4b751 100644
--- a/eventmesh-runtime/src/test/java/client/common/ClientConstants.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubscriptionMode.java
@@ -15,19 +15,31 @@
  * limitations under the License.
  */
 
-package client.common;
+package org.apache.eventmesh.common.protocol;
 
+public enum SubscriptionMode {
 
-public interface ClientConstants {
-
     /**
-     * CLIENT HEART BEAT TIME
+     * broadcast
+     */
+    BROADCASTING("BROADCASTING"),
+    /**
+     * clustering
      */
-    int HEARTBEAT = 1000 * 60;
+    CLUSTERING("CLUSTERING");
+
+    private String mode;
+
+    SubscriptionMode(String mode) {
+        this.mode = mode;
+    }
+
+    public String getMode() {
+        return mode;
+    }
 
-    long DEFAULT_TIMEOUT_IN_MILLISECONDS = 3000;
+    public void setMode(String mode) {
+        this.mode = mode;
+    }
 
-    String SYNC_TOPIC = "FT0-s-80000000-01-0";
-    String ASYNC_TOPIC = "FT0-e-80010000-01-1";
-    String BROADCAST_TOPIC = "FT0-e-80030000-01-3";
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java
index 5c3d1ea..751b632 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java
@@ -31,7 +31,9 @@ public class HeartbeatRequestBody extends Body {
 
     public static final String CLIENTTYPE = "clientType";
     public static final String HEARTBEATENTITIES = "heartbeatEntities";
+    public static final String CONSUMERGROUP = "consumerGroup";
 
+    private String consumerGroup;
 
     private String clientType;
 
@@ -53,9 +55,18 @@ public class HeartbeatRequestBody extends Body {
         this.heartbeatEntities = heartbeatEntities;
     }
 
+    public String getConsumerGroup() {
+        return consumerGroup;
+    }
+
+    public void setConsumerGroup(String consumerGroup) {
+        this.consumerGroup = consumerGroup;
+    }
+
     public static HeartbeatRequestBody buildBody(Map<String, Object> bodyParam) {
         HeartbeatRequestBody body = new HeartbeatRequestBody();
         body.setClientType(MapUtils.getString(bodyParam, CLIENTTYPE));
+        body.setConsumerGroup(MapUtils.getString(bodyParam, CONSUMERGROUP));
         body.setHeartbeatEntities(JSONArray.parseArray(MapUtils.getString(bodyParam, HEARTBEATENTITIES), HeartbeatEntity.class));
         return body;
     }
@@ -64,6 +75,7 @@ public class HeartbeatRequestBody extends Body {
     public Map<String, Object> toMap() {
         Map<String, Object> map = new HashMap<String, Object>();
         map.put(CLIENTTYPE, clientType);
+        map.put(CONSUMERGROUP, consumerGroup);
         map.put(HEARTBEATENTITIES, JSON.toJSONString(heartbeatEntities));
         return map;
     }
@@ -90,6 +102,7 @@ public class HeartbeatRequestBody extends Body {
     public String toString() {
         StringBuilder sb = new StringBuilder();
         sb.append("heartbeatRequestBody={")
+                .append("consumerGroup=").append(consumerGroup).append(",")
                 .append("clientType=").append(clientType).append("}");
         return sb.toString();
     }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/RegRequestBody.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/RegRequestBody.java
index 41c5c5a..78bb684 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/RegRequestBody.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/RegRequestBody.java
@@ -25,6 +25,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 
 import org.apache.commons.collections4.MapUtils;
+import org.apache.eventmesh.common.protocol.SubscriptionItem;
 import org.apache.eventmesh.common.protocol.http.body.Body;
 
 public class RegRequestBody extends Body {
@@ -39,13 +40,13 @@ public class RegRequestBody extends Body {
 
     private String endPoint;
 
-    private List<String> topics;
+    private List<SubscriptionItem> topics;
 
-    public List<String> getTopics() {
+    public List<SubscriptionItem> getTopics() {
         return topics;
     }
 
-    public void setTopics(List<String> topics) {
+    public void setTopics(List<SubscriptionItem> topics) {
         this.topics = topics;
     }
 
@@ -69,7 +70,7 @@ public class RegRequestBody extends Body {
         RegRequestBody body = new RegRequestBody();
         body.setClientType(MapUtils.getString(bodyParam, CLIENTTYPE));
         body.setEndPoint(MapUtils.getString(bodyParam, ENDPOINT));
-        body.setTopics(JSONArray.parseArray(MapUtils.getString(bodyParam, TOPICS), String.class));
+        body.setTopics(JSONArray.parseArray(MapUtils.getString(bodyParam, TOPICS), SubscriptionItem.class));
         return body;
     }
 
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java
index 6a37cc5..72e2e91 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java
@@ -25,6 +25,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 
 import org.apache.commons.collections4.MapUtils;
+import org.apache.eventmesh.common.protocol.SubscriptionItem;
 import org.apache.eventmesh.common.protocol.http.body.Body;
 
 public class SubscribeRequestBody extends Body {
@@ -33,17 +34,27 @@ public class SubscribeRequestBody extends Body {
 
     public static final String URL = "url";
 
-    private List<String> topics;
+    public static final String CONSUMERGROUP = "consumerGroup";
+
+    private List<SubscriptionItem> topics;
 
     private String url;
 
-    private String topic;
+    private String consumerGroup;
+
+    public String getConsumerGroup() {
+        return consumerGroup;
+    }
+
+    public void setConsumerGroup(String consumerGroup) {
+        this.consumerGroup = consumerGroup;
+    }
 
-    public List<String> getTopics() {
+    public List<SubscriptionItem> getTopics() {
         return topics;
     }
 
-    public void setTopics(List<String> topics) {
+    public void setTopics(List<SubscriptionItem> topics) {
         this.topics = topics;
     }
 
@@ -58,7 +69,8 @@ public class SubscribeRequestBody extends Body {
     public static SubscribeRequestBody buildBody(Map<String, Object> bodyParam) {
         SubscribeRequestBody body = new SubscribeRequestBody();
         body.setUrl(MapUtils.getString(bodyParam, URL));
-        body.setTopics(JSONArray.parseArray(MapUtils.getString(bodyParam, TOPIC), String.class));
+        body.setTopics(JSONArray.parseArray(MapUtils.getString(bodyParam, TOPIC), SubscriptionItem.class));
+        body.setConsumerGroup(MapUtils.getString(bodyParam, CONSUMERGROUP));
         return body;
     }
 
@@ -67,13 +79,15 @@ public class SubscribeRequestBody extends Body {
         Map<String, Object> map = new HashMap<String, Object>();
         map.put(URL, url);
         map.put(TOPIC, JSON.toJSONString(topics));
+        map.put(CONSUMERGROUP, consumerGroup);
         return map;
     }
 
     @Override
     public String toString() {
         return "subscribeBody{" +
-                "url='" + url + '\'' +
+                "consumerGroup='" + consumerGroup + '\'' +
+                ", url='" + url + '\'' +
                 ", topics=" + topics +
                 '}';
     }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java
index e690f7e..756f1a9 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java
@@ -33,10 +33,14 @@ public class UnSubscribeRequestBody extends Body {
 
     public static final String URL = "url";
 
+    public static final String CONSUMERGROUP = "consumerGroup";
+
     private List<String> topics;
 
     private String url;
 
+    private String consumerGroup;
+
     public List<String> getTopics() {
         return topics;
     }
@@ -53,10 +57,19 @@ public class UnSubscribeRequestBody extends Body {
         this.url = url;
     }
 
+    public String getConsumerGroup() {
+        return consumerGroup;
+    }
+
+    public void setConsumerGroup(String consumerGroup) {
+        this.consumerGroup = consumerGroup;
+    }
+
     public static UnSubscribeRequestBody buildBody(Map<String, Object> bodyParam) {
         UnSubscribeRequestBody body = new UnSubscribeRequestBody();
         body.setUrl(MapUtils.getString(bodyParam, URL));
         body.setTopics(JSONArray.parseArray(MapUtils.getString(bodyParam, TOPIC), String.class));
+        body.setConsumerGroup(MapUtils.getString(bodyParam, CONSUMERGROUP));
         return body;
     }
 
@@ -65,13 +78,15 @@ public class UnSubscribeRequestBody extends Body {
         Map<String, Object> map = new HashMap<String, Object>();
         map.put(URL, url);
         map.put(TOPIC, JSON.toJSONString(topics));
+        map.put(CONSUMERGROUP, consumerGroup);
         return map;
     }
 
     @Override
     public String toString() {
         return "unSubscribeRequestBody{" +
-                "url='" + url + '\'' +
+                "consumerGroup='" + consumerGroup + '\'' +
+                ", url='" + url + '\'' +
                 ", topics=" + topics +
                 '}';
     }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java
index ddd29e5..e2de019 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java
@@ -29,12 +29,12 @@ import org.apache.eventmesh.common.protocol.http.body.Body;
 
 public class ReplyMessageRequestBody extends Body {
 
-
     public static final String ORIGTOPIC = "origTopic";
     public static final String BIZSEQNO = "bizSeqNo";
     public static final String UNIQUEID = "uniqueId";
     public static final String CONTENT = "content";
     public static final String EXTFIELDS = "extFields";
+    public static final String PRODUCERGROUP = "producerGroup";
 
     private String bizSeqNo;
 
@@ -46,6 +46,8 @@ public class ReplyMessageRequestBody extends Body {
 
     private HashMap<String, String> extFields;
 
+    private String producerGroup;
+
     public String getOrigTopic() {
         return origTopic;
     }
@@ -86,6 +88,14 @@ public class ReplyMessageRequestBody extends Body {
         this.extFields = extFields;
     }
 
+    public String getProducerGroup() {
+        return producerGroup;
+    }
+
+    public void setProducerGroup(String producerGroup) {
+        this.producerGroup = producerGroup;
+    }
+
     @SuppressWarnings("unchecked")
     public static ReplyMessageRequestBody buildBody(Map<String, Object> bodyParam) {
         ReplyMessageRequestBody body = new ReplyMessageRequestBody();
@@ -97,6 +107,7 @@ public class ReplyMessageRequestBody extends Body {
         if (StringUtils.isNotBlank(extFields)) {
             body.setExtFields((HashMap<String, String>) JSONObject.parseObject(extFields, HashMap.class));
         }
+        body.setProducerGroup(MapUtils.getString(bodyParam, PRODUCERGROUP));
         return body;
     }
 
@@ -108,6 +119,7 @@ public class ReplyMessageRequestBody extends Body {
                 .append("uniqueId=").append(uniqueId).append(",")
                 .append("origTopic=").append(origTopic).append(",")
                 .append("content=").append(content).append(",")
+                .append("producerGroup=").append(producerGroup).append(",")
                 .append("extFields=").append(extFields).append("}");
         return sb.toString();
     }
@@ -120,6 +132,7 @@ public class ReplyMessageRequestBody extends Body {
         map.put(UNIQUEID, uniqueId);
         map.put(CONTENT, content);
         map.put(EXTFIELDS, JSON.toJSONString(extFields));
+        map.put(PRODUCERGROUP, producerGroup);
         return map;
     }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java
index ced6bef..576e352 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java
@@ -33,6 +33,7 @@ public class SendMessageBatchRequestBody extends Body {
     public static final String BATCHID = "batchId";
     public static final String CONTENTS = "contents";
     public static final String SIZE = "size";
+    public static final String PRODUCERGROUP = "producerGroup";
 
     private String batchId;
 
@@ -40,6 +41,8 @@ public class SendMessageBatchRequestBody extends Body {
 
     private String size;
 
+    private String producerGroup;
+
     public SendMessageBatchRequestBody() {
     }
 
@@ -67,12 +70,21 @@ public class SendMessageBatchRequestBody extends Body {
         this.size = size;
     }
 
+    public String getProducerGroup() {
+        return producerGroup;
+    }
+
+    public void setProducerGroup(String producerGroup) {
+        this.producerGroup = producerGroup;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
         sb.append("sendMessageBatchRequestBody={")
                 .append("batchId=").append(batchId).append(",")
                 .append("size=").append(size).append(",")
+                .append("producerGroup=").append(producerGroup).append(",")
                 .append("contents=").append(JSON.toJSONString(contents)).append("}");
         return sb.toString();
     }
@@ -111,6 +123,7 @@ public class SendMessageBatchRequestBody extends Body {
             body.setContents(JSONArray.parseArray(contents, BatchMessageEntity.class));
         }
         body.setSize(size);
+        body.setProducerGroup(MapUtils.getString(bodyParam, PRODUCERGROUP));
         return body;
     }
 
@@ -120,6 +133,7 @@ public class SendMessageBatchRequestBody extends Body {
         map.put(BATCHID, batchId);
         map.put(SIZE, size);
         map.put(CONTENTS, contents);
+        map.put(PRODUCERGROUP, producerGroup);
         return map;
     }
 
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java
index dc46adc..8f97cf1 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java
@@ -30,6 +30,7 @@ public class SendMessageBatchV2RequestBody extends Body {
     public static final String MSG = "msg";
     public static final String TAG = "tag";
     public static final String TTL = "ttl";
+    public static final String PRODUCERGROUP = "producerGroup";
 
     private String bizSeqNo;
 
@@ -41,6 +42,8 @@ public class SendMessageBatchV2RequestBody extends Body {
 
     private String ttl;
 
+    private String producerGroup;
+
     public String getBizSeqNo() {
         return bizSeqNo;
     }
@@ -81,6 +84,14 @@ public class SendMessageBatchV2RequestBody extends Body {
         this.ttl = ttl;
     }
 
+    public String getProducerGroup() {
+        return producerGroup;
+    }
+
+    public void setProducerGroup(String producerGroup) {
+        this.producerGroup = producerGroup;
+    }
+
     public static SendMessageBatchV2RequestBody buildBody(final Map<String, Object> bodyParam) {
         String bizSeqno = MapUtils.getString(bodyParam,
                 BIZSEQNO);
@@ -98,6 +109,7 @@ public class SendMessageBatchV2RequestBody extends Body {
         body.setTag(tag);
         body.setTtl(ttl);
         body.setTopic(topic);
+        body.setProducerGroup(MapUtils.getString(bodyParam, PRODUCERGROUP));
         return body;
     }
 
@@ -109,6 +121,7 @@ public class SendMessageBatchV2RequestBody extends Body {
         map.put(MSG, msg);
         map.put(TAG, tag);
         map.put(TTL, ttl);
+        map.put(PRODUCERGROUP, producerGroup);
         return map;
     }
 
@@ -120,6 +133,7 @@ public class SendMessageBatchV2RequestBody extends Body {
                 .append("topic=").append(topic).append(",")
                 .append("tag=").append(tag).append(",")
                 .append("ttl=").append(ttl).append(",")
+                .append("producerGroup=").append(producerGroup).append(",")
                 .append("msg=").append(msg).append("}");
         return sb.toString();
     }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java
index 840e2f7..5c302e8 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java
@@ -35,7 +35,7 @@ public class SendMessageRequestBody extends Body {
     public static final String TTL = "ttl";
     public static final String TAG = "tag";
     public static final String EXTFIELDS = "extFields";
-
+    public static final String PRODUCERGROUP = "producerGroup";
 
     private String topic;
 
@@ -51,6 +51,8 @@ public class SendMessageRequestBody extends Body {
 
     private HashMap<String, String> extFields;
 
+    private String producerGroup;
+
     public String getTopic() {
         return topic;
     }
@@ -107,6 +109,14 @@ public class SendMessageRequestBody extends Body {
         this.tag = tag;
     }
 
+    public String getProducerGroup() {
+        return producerGroup;
+    }
+
+    public void setProducerGroup(String producerGroup) {
+        this.producerGroup = producerGroup;
+    }
+
     @SuppressWarnings("unchecked")
     public static SendMessageRequestBody buildBody(Map<String, Object> bodyParam) {
         SendMessageRequestBody body = new SendMessageRequestBody();
@@ -120,6 +130,7 @@ public class SendMessageRequestBody extends Body {
         if (StringUtils.isNotBlank(extFields)) {
             body.setExtFields((HashMap<String, String>) JSONObject.parseObject(extFields, HashMap.class));
         }
+        body.setProducerGroup(MapUtils.getString(bodyParam, PRODUCERGROUP));
         return body;
     }
 
@@ -133,6 +144,7 @@ public class SendMessageRequestBody extends Body {
         map.put(TAG, tag);
         map.put(CONTENT, content);
         map.put(EXTFIELDS, extFields);
+        map.put(PRODUCERGROUP, producerGroup);
         return map;
     }
 
@@ -146,6 +158,7 @@ public class SendMessageRequestBody extends Body {
                 .append("content=").append(content).append(",")
                 .append("ttl=").append(ttl).append(",")
                 .append("tag=").append(tag).append(",")
+                .append("producerGroup=").append(producerGroup).append(",")
                 .append("extFields=").append(extFields).append("}");
         return sb.toString();
     }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/common/ProtocolKey.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/common/ProtocolKey.java
index c6cb15d..12e79ad 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/common/ProtocolKey.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/common/ProtocolKey.java
@@ -26,9 +26,7 @@ public class ProtocolKey {
     public static class ClientInstanceKey {
         ////////////////////////////////////协议层请求方描述///////////
         public static final String ENV = "Env";
-        public static final String REGION = "Region";
         public static final String IDC = "Idc";
-        public static final String DCN = "Dcn";
         public static final String SYS = "Sys";
         public static final String PID = "Pid";
         public static final String IP = "Ip";
@@ -42,9 +40,7 @@ public class ProtocolKey {
         public static final String EVENTMESHCLUSTER = "EventMeshCluster";
         public static final String EVENTMESHIP = "EventMeshIp";
         public static final String EVENTMESHENV = "EventMeshEnv";
-        public static final String EVENTMESHREGION = "EventMeshRegion";
         public static final String EVENTMESHIDC = "EventMeshIdc";
-        public static final String EVENTMESHDCN = "EventMeshDcn";
     }
 
 
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java
index e189823..5cd0724 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java
@@ -41,15 +41,9 @@ public class HeartbeatRequestHeader extends Header {
     //请求方所在环境编号
     private String env;
 
-    //请求方所在区域编码
-    private String region;
-
     //请求方所在IDC
     private String idc;
 
-    //请求方所在DCN
-    private String dcn;
-
     //请求方的子系统
     private String sys;
 
@@ -59,6 +53,8 @@ public class HeartbeatRequestHeader extends Header {
     //请求方的IP
     private String ip;
 
+    private String producerGroup;
+
     //请求方的USERNAME
     private String username = "username";
 
@@ -97,14 +93,6 @@ public class HeartbeatRequestHeader extends Header {
         this.env = env;
     }
 
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
     public String getIdc() {
         return idc;
     }
@@ -113,14 +101,6 @@ public class HeartbeatRequestHeader extends Header {
         this.idc = idc;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getSys() {
         return sys;
     }
@@ -168,9 +148,7 @@ public class HeartbeatRequestHeader extends Header {
         map.put(ProtocolKey.LANGUAGE, language);
         map.put(ProtocolKey.VERSION, version);
         map.put(ProtocolKey.ClientInstanceKey.ENV, env);
-        map.put(ProtocolKey.ClientInstanceKey.REGION, region);
         map.put(ProtocolKey.ClientInstanceKey.IDC, idc);
-        map.put(ProtocolKey.ClientInstanceKey.DCN, dcn);
         map.put(ProtocolKey.ClientInstanceKey.SYS, sys);
         map.put(ProtocolKey.ClientInstanceKey.PID, pid);
         map.put(ProtocolKey.ClientInstanceKey.IP, ip);
@@ -187,9 +165,7 @@ public class HeartbeatRequestHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version).append(",")
                 .append("env=").append(env).append(",")
-                .append("region=").append(region).append(",")
                 .append("idc=").append(idc).append(",")
-                .append("dcn=").append(dcn).append(",")
                 .append("sys=").append(sys).append(",")
                 .append("pid=").append(pid).append(",")
                 .append("ip=").append(ip).append(",")
@@ -206,9 +182,7 @@ public class HeartbeatRequestHeader extends Header {
                 ? Constants.LANGUAGE_JAVA : MapUtils.getString(headerParam, ProtocolKey.LANGUAGE);
         header.setLanguage(lan);
         header.setEnv(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.ENV));
-        header.setRegion(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.REGION));
         header.setIdc(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IDC));
-        header.setDcn(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.DCN));
         header.setSys(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.SYS));
         header.setPid(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PID));
         header.setIp(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IP));
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java
index 3863498..e0d6e99 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java
@@ -34,12 +34,8 @@ public class HeartbeatResponseHeader extends Header {
 
     private String eventMeshEnv;
 
-    private String eventMeshRegion;
-
     private String eventMeshIdc;
 
-    private String eventMeshDcn;
-
     public int getCode() {
         return code;
     }
@@ -72,14 +68,6 @@ public class HeartbeatResponseHeader extends Header {
         this.eventMeshEnv = eventMeshEnv;
     }
 
-    public String getEventMeshRegion() {
-        return eventMeshRegion;
-    }
-
-    public void setEventMeshRegion(String eventMeshRegion) {
-        this.eventMeshRegion = eventMeshRegion;
-    }
-
     public String getEventMeshIdc() {
         return eventMeshIdc;
     }
@@ -88,24 +76,14 @@ public class HeartbeatResponseHeader extends Header {
         this.eventMeshIdc = eventMeshIdc;
     }
 
-    public String getEventMeshDcn() {
-        return eventMeshDcn;
-    }
-
-    public void setEventMeshDcn(String eventMeshDcn) {
-        this.eventMeshDcn = eventMeshDcn;
-    }
-
     public static HeartbeatResponseHeader buildHeader(Integer requestCode, String eventMeshCluster,
-                                                      String eventMeshIp, String eventMeshEnv, String eventMeshRegion,
-                                                      String eventMeshDcn, String eventMeshIDC) {
+                                                      String eventMeshIp, String eventMeshEnv,
+                                                      String eventMeshIDC) {
         HeartbeatResponseHeader heartbeatResponseHeader = new HeartbeatResponseHeader();
         heartbeatResponseHeader.setCode(requestCode);
         heartbeatResponseHeader.setEventMeshCluster(eventMeshCluster);
-        heartbeatResponseHeader.setEventMeshDcn(eventMeshDcn);
         heartbeatResponseHeader.setEventMeshIp(eventMeshIp);
         heartbeatResponseHeader.setEventMeshEnv(eventMeshEnv);
-        heartbeatResponseHeader.setEventMeshRegion(eventMeshRegion);
         heartbeatResponseHeader.setEventMeshIdc(eventMeshIDC);
         return heartbeatResponseHeader;
     }
@@ -116,9 +94,7 @@ public class HeartbeatResponseHeader extends Header {
         sb.append("heartbeatResponseHeader={")
                 .append("code=").append(code).append(",")
                 .append("eventMeshEnv=").append(eventMeshEnv).append(",")
-                .append("eventMeshRegion=").append(eventMeshRegion).append(",")
                 .append("eventMeshIdc=").append(eventMeshIdc).append(",")
-                .append("eventMeshDcn=").append(eventMeshDcn).append(",")
                 .append("eventMeshCluster=").append(eventMeshCluster).append(",")
                 .append("eventMeshIp=").append(eventMeshIp).append("}");
         return sb.toString();
@@ -131,9 +107,7 @@ public class HeartbeatResponseHeader extends Header {
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER, eventMeshCluster);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshIp);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshEnv);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, eventMeshRegion);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshIdc);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, eventMeshDcn);
         return map;
     }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/RegRequestHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/RegRequestHeader.java
index 2dbcd6f..0ee7cab 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/RegRequestHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/RegRequestHeader.java
@@ -37,12 +37,8 @@ public class RegRequestHeader extends Header {
 
     private String env;
 
-    private String region;
-
     private String idc;
 
-    private String dcn;
-
     private String sys;
 
     private String pid;
@@ -61,9 +57,7 @@ public class RegRequestHeader extends Header {
                 ? Constants.LANGUAGE_JAVA : MapUtils.getString(headerParam, ProtocolKey.LANGUAGE);
         header.setLanguage(lan);
         header.setEnv(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.ENV));
-        header.setRegion(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.REGION));
         header.setIdc(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IDC));
-        header.setDcn(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.DCN));
         header.setSys(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.SYS));
         header.setPid(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PID));
         header.setIp(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IP));
@@ -104,14 +98,6 @@ public class RegRequestHeader extends Header {
         this.env = env;
     }
 
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
     public String getIdc() {
         return idc;
     }
@@ -120,14 +106,6 @@ public class RegRequestHeader extends Header {
         this.idc = idc;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getSys() {
         return sys;
     }
@@ -175,9 +153,7 @@ public class RegRequestHeader extends Header {
         map.put(ProtocolKey.LANGUAGE, language);
         map.put(ProtocolKey.VERSION, version);
         map.put(ProtocolKey.ClientInstanceKey.ENV, env);
-        map.put(ProtocolKey.ClientInstanceKey.REGION, region);
         map.put(ProtocolKey.ClientInstanceKey.IDC, idc);
-        map.put(ProtocolKey.ClientInstanceKey.DCN, dcn);
         map.put(ProtocolKey.ClientInstanceKey.SYS, sys);
         map.put(ProtocolKey.ClientInstanceKey.PID, pid);
         map.put(ProtocolKey.ClientInstanceKey.IP, ip);
@@ -194,9 +170,7 @@ public class RegRequestHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version).append(",")
                 .append("env=").append(env).append(",")
-                .append("region=").append(region).append(",")
                 .append("idc=").append(idc).append(",")
-                .append("dcn=").append(dcn).append(",")
                 .append("sys=").append(sys).append(",")
                 .append("pid=").append(pid).append(",")
                 .append("ip=").append(ip).append(",")
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/RegResponseHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/RegResponseHeader.java
index d0257cc..503a527 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/RegResponseHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/RegResponseHeader.java
@@ -38,15 +38,9 @@ public class RegResponseHeader extends Header {
     //处理该次Request请求的eventMesh所在的环境编号
     private String eventMeshEnv;
 
-    //处理该次Request请求的eventMesh所在区域
-    private String eventMeshRegion;
-
     //处理该次Request请求的eventMesh所在IDC
     private String eventMeshIdc;
 
-    //处理该次Request请求的eventMesh所在DCN
-    private String eventMeshDcn;
-
     public int getCode() {
         return code;
     }
@@ -79,14 +73,6 @@ public class RegResponseHeader extends Header {
         this.eventMeshEnv = eventMeshEnv;
     }
 
-    public String getEventMeshRegion() {
-        return eventMeshRegion;
-    }
-
-    public void setEventMeshRegion(String eventMeshRegion) {
-        this.eventMeshRegion = eventMeshRegion;
-    }
-
     public String getEventMeshIdc() {
         return eventMeshIdc;
     }
@@ -95,24 +81,13 @@ public class RegResponseHeader extends Header {
         this.eventMeshIdc = eventMeshIdc;
     }
 
-    public String getEventMeshDcn() {
-        return eventMeshDcn;
-    }
-
-    public void setEventMeshDcn(String eventMeshDcn) {
-        this.eventMeshDcn = eventMeshDcn;
-    }
-
     public static RegResponseHeader buildHeader(Integer requestCode, String eventMeshCluster,
-                                                String eventMeshIp, String eventMeshEnv, String eventMeshRegion,
-                                                String eventMeshDcn, String eventMeshIDC) {
+                                                String eventMeshIp, String eventMeshEnv, String eventMeshIDC) {
         RegResponseHeader regResponseHeader = new RegResponseHeader();
         regResponseHeader.setCode(requestCode);
         regResponseHeader.setEventMeshCluster(eventMeshCluster);
-        regResponseHeader.setEventMeshDcn(eventMeshDcn);
         regResponseHeader.setEventMeshIp(eventMeshIp);
         regResponseHeader.setEventMeshEnv(eventMeshEnv);
-        regResponseHeader.setEventMeshRegion(eventMeshRegion);
         regResponseHeader.setEventMeshIdc(eventMeshIDC);
         return regResponseHeader;
     }
@@ -123,9 +98,7 @@ public class RegResponseHeader extends Header {
         sb.append("regResponseHeader={")
                 .append("code=").append(code).append(",")
                 .append("eventMeshEnv=").append(eventMeshEnv).append(",")
-                .append("eventMeshRegion=").append(eventMeshRegion).append(",")
                 .append("eventMeshIdc=").append(eventMeshIdc).append(",")
-                .append("eventMeshDcn=").append(eventMeshDcn).append(",")
                 .append("eventMeshCluster=").append(eventMeshCluster).append(",")
                 .append("eventMeshIp=").append(eventMeshIp).append("}");
         return sb.toString();
@@ -138,9 +111,7 @@ public class RegResponseHeader extends Header {
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER, eventMeshCluster);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshIp);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshEnv);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, eventMeshRegion);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshIdc);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, eventMeshDcn);
         return map;
     }
 
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java
index 9fffa22..6143e4b 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java
@@ -37,12 +37,8 @@ public class SubscribeRequestHeader extends Header {
 
     private String env;
 
-    private String region;
-
     private String idc;
 
-    private String dcn;
-
     private String sys;
 
     private String pid;
@@ -61,9 +57,7 @@ public class SubscribeRequestHeader extends Header {
                 ? Constants.LANGUAGE_JAVA : MapUtils.getString(headerParam, ProtocolKey.LANGUAGE);
         header.setLanguage(lan);
         header.setEnv(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.ENV));
-        header.setRegion(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.REGION));
         header.setIdc(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IDC));
-        header.setDcn(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.DCN));
         header.setSys(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.SYS));
         header.setPid(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PID));
         header.setIp(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IP));
@@ -104,14 +98,6 @@ public class SubscribeRequestHeader extends Header {
         this.env = env;
     }
 
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
     public String getIdc() {
         return idc;
     }
@@ -120,14 +106,6 @@ public class SubscribeRequestHeader extends Header {
         this.idc = idc;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getSys() {
         return sys;
     }
@@ -175,9 +153,7 @@ public class SubscribeRequestHeader extends Header {
         map.put(ProtocolKey.LANGUAGE, language);
         map.put(ProtocolKey.VERSION, version);
         map.put(ProtocolKey.ClientInstanceKey.ENV, env);
-        map.put(ProtocolKey.ClientInstanceKey.REGION, region);
         map.put(ProtocolKey.ClientInstanceKey.IDC, idc);
-        map.put(ProtocolKey.ClientInstanceKey.DCN, dcn);
         map.put(ProtocolKey.ClientInstanceKey.SYS, sys);
         map.put(ProtocolKey.ClientInstanceKey.PID, pid);
         map.put(ProtocolKey.ClientInstanceKey.IP, ip);
@@ -194,9 +170,7 @@ public class SubscribeRequestHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version).append(",")
                 .append("env=").append(env).append(",")
-                .append("region=").append(region).append(",")
                 .append("idc=").append(idc).append(",")
-                .append("dcn=").append(dcn).append(",")
                 .append("sys=").append(sys).append(",")
                 .append("pid=").append(pid).append(",")
                 .append("ip=").append(ip).append(",")
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java
index dbd9bb0..f21fbce 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java
@@ -33,12 +33,8 @@ public class SubscribeResponseHeader extends Header {
 
     private String eventMeshEnv;
 
-    private String eventMeshRegion;
-
     private String eventMeshIdc;
 
-    private String eventMeshDcn;
-
     public int getCode() {
         return code;
     }
@@ -71,14 +67,6 @@ public class SubscribeResponseHeader extends Header {
         this.eventMeshEnv = eventMeshEnv;
     }
 
-    public String getEventMeshRegion() {
-        return eventMeshRegion;
-    }
-
-    public void setEventMeshRegion(String eventMeshRegion) {
-        this.eventMeshRegion = eventMeshRegion;
-    }
-
     public String getEventMeshIdc() {
         return eventMeshIdc;
     }
@@ -87,24 +75,14 @@ public class SubscribeResponseHeader extends Header {
         this.eventMeshIdc = eventMeshIdc;
     }
 
-    public String getEventMeshDcn() {
-        return eventMeshDcn;
-    }
-
-    public void setEventMeshDcn(String eventMeshDcn) {
-        this.eventMeshDcn = eventMeshDcn;
-    }
-
     public static SubscribeResponseHeader buildHeader(Integer requestCode, String eventMeshCluster,
-                                                      String eventMeshIp, String eventMeshEnv, String eventMeshRegion,
-                                                      String eventMeshDcn, String eventMeshIDC) {
+                                                      String eventMeshIp, String eventMeshEnv,
+                                                      String eventMeshIDC) {
         SubscribeResponseHeader subscribeResponseHeader = new SubscribeResponseHeader();
         subscribeResponseHeader.setCode(requestCode);
         subscribeResponseHeader.setEventMeshCluster(eventMeshCluster);
-        subscribeResponseHeader.setEventMeshDcn(eventMeshDcn);
         subscribeResponseHeader.setEventMeshIp(eventMeshIp);
         subscribeResponseHeader.setEventMeshEnv(eventMeshEnv);
-        subscribeResponseHeader.setEventMeshRegion(eventMeshRegion);
         subscribeResponseHeader.setEventMeshIdc(eventMeshIDC);
         return subscribeResponseHeader;
     }
@@ -115,9 +93,7 @@ public class SubscribeResponseHeader extends Header {
         sb.append("subscribeResponseHeader={")
                 .append("code=").append(code).append(",")
                 .append("eventMeshEnv=").append(eventMeshEnv).append(",")
-                .append("eventMeshRegion=").append(eventMeshRegion).append(",")
                 .append("eventMeshIdc=").append(eventMeshIdc).append(",")
-                .append("eventMeshDcn=").append(eventMeshDcn).append(",")
                 .append("eventMeshCluster=").append(eventMeshCluster).append(",")
                 .append("eventMeshIp=").append(eventMeshIp).append("}");
         return sb.toString();
@@ -131,8 +107,6 @@ public class SubscribeResponseHeader extends Header {
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshIp);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshEnv);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshIdc);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, eventMeshRegion);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, eventMeshDcn);
         return map;
     }
 
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java
index 9e040d2..09c3a6d 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java
@@ -41,15 +41,9 @@ public class UnRegRequestHeader extends Header {
     //请求方所在环境编号
     private String env;
 
-    //请求方所在区域编码
-    private String region;
-
     //请求方所在IDC
     private String idc;
 
-    //请求方所在DCN
-    private String dcn;
-
     //请求方的子系统
     private String sys;
 
@@ -73,9 +67,7 @@ public class UnRegRequestHeader extends Header {
                 ? Constants.LANGUAGE_JAVA : MapUtils.getString(headerParam, ProtocolKey.LANGUAGE);
         header.setLanguage(lan);
         header.setEnv(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.ENV));
-        header.setRegion(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.REGION));
         header.setIdc(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IDC));
-        header.setDcn(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.DCN));
         header.setSys(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.SYS));
         header.setPid(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PID));
         header.setIp(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IP));
@@ -116,14 +108,6 @@ public class UnRegRequestHeader extends Header {
         this.env = env;
     }
 
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
     public String getIdc() {
         return idc;
     }
@@ -132,14 +116,6 @@ public class UnRegRequestHeader extends Header {
         this.idc = idc;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getSys() {
         return sys;
     }
@@ -187,9 +163,7 @@ public class UnRegRequestHeader extends Header {
         map.put(ProtocolKey.LANGUAGE, language);
         map.put(ProtocolKey.VERSION, version);
         map.put(ProtocolKey.ClientInstanceKey.ENV, env);
-        map.put(ProtocolKey.ClientInstanceKey.REGION, region);
         map.put(ProtocolKey.ClientInstanceKey.IDC, idc);
-        map.put(ProtocolKey.ClientInstanceKey.DCN, dcn);
         map.put(ProtocolKey.ClientInstanceKey.SYS, sys);
         map.put(ProtocolKey.ClientInstanceKey.PID, pid);
         map.put(ProtocolKey.ClientInstanceKey.IP, ip);
@@ -206,9 +180,7 @@ public class UnRegRequestHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version).append(",")
                 .append("env=").append(env).append(",")
-                .append("region=").append(region).append(",")
                 .append("idc=").append(idc).append(",")
-                .append("dcn=").append(dcn).append(",")
                 .append("sys=").append(sys).append(",")
                 .append("pid=").append(pid).append(",")
                 .append("ip=").append(ip).append(",")
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java
index d009228..4338c03 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java
@@ -34,12 +34,8 @@ public class UnRegResponseHeader extends Header {
 
     private String eventMeshEnv;
 
-    private String eventMeshRegion;
-
     private String eventMeshIdc;
 
-    private String eventMeshDcn;
-
     public int getCode() {
         return code;
     }
@@ -72,14 +68,6 @@ public class UnRegResponseHeader extends Header {
         this.eventMeshEnv = eventMeshEnv;
     }
 
-    public String getEventMeshRegion() {
-        return eventMeshRegion;
-    }
-
-    public void setEventMeshRegion(String eventMeshRegion) {
-        this.eventMeshRegion = eventMeshRegion;
-    }
-
     public String getEventMeshIdc() {
         return eventMeshIdc;
     }
@@ -88,24 +76,13 @@ public class UnRegResponseHeader extends Header {
         this.eventMeshIdc = eventMeshIdc;
     }
 
-    public String getEventMeshDcn() {
-        return eventMeshDcn;
-    }
-
-    public void setEventMeshDcn(String eventMeshDcn) {
-        this.eventMeshDcn = eventMeshDcn;
-    }
-
     public static UnRegResponseHeader buildHeader(Integer requestCode, String eventMeshCluster,
-                                                  String eventMeshIp, String eventMeshEnv, String eventMeshRegion,
-                                                  String eventMeshDcn, String eventMeshIDC) {
+                                                  String eventMeshIp, String eventMeshEnv, String eventMeshIDC) {
         UnRegResponseHeader regResponseHeader = new UnRegResponseHeader();
         regResponseHeader.setCode(requestCode);
         regResponseHeader.setEventMeshCluster(eventMeshCluster);
-        regResponseHeader.setEventMeshDcn(eventMeshDcn);
         regResponseHeader.setEventMeshIp(eventMeshIp);
         regResponseHeader.setEventMeshEnv(eventMeshEnv);
-        regResponseHeader.setEventMeshRegion(eventMeshRegion);
         regResponseHeader.setEventMeshIdc(eventMeshIDC);
         return regResponseHeader;
     }
@@ -116,9 +93,7 @@ public class UnRegResponseHeader extends Header {
         sb.append("nnRegResponseHeader={")
                 .append("code=").append(code).append(",")
                 .append("eventMeshEnv=").append(eventMeshEnv).append(",")
-                .append("eventMeshRegion=").append(eventMeshRegion).append(",")
                 .append("eventMeshIdc=").append(eventMeshIdc).append(",")
-                .append("eventMeshDcn=").append(eventMeshDcn).append(",")
                 .append("eventMeshCluster=").append(eventMeshCluster).append(",")
                 .append("eventMeshIp=").append(eventMeshIp).append("}");
         return sb.toString();
@@ -132,8 +107,6 @@ public class UnRegResponseHeader extends Header {
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshIp);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshEnv);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshIdc);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, eventMeshRegion);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, eventMeshDcn);
         return map;
     }
 
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java
index 0c505ee..f5b3456 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java
@@ -37,12 +37,8 @@ public class UnSubscribeRequestHeader extends Header {
 
     private String env;
 
-    private String region;
-
     private String idc;
 
-    private String dcn;
-
     private String sys;
 
     private String pid;
@@ -61,9 +57,7 @@ public class UnSubscribeRequestHeader extends Header {
                 ? Constants.LANGUAGE_JAVA : MapUtils.getString(headerParam, ProtocolKey.LANGUAGE);
         header.setLanguage(lan);
         header.setEnv(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.ENV));
-        header.setRegion(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.REGION));
         header.setIdc(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IDC));
-        header.setDcn(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.DCN));
         header.setSys(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.SYS));
         header.setPid(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PID));
         header.setIp(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IP));
@@ -104,14 +98,6 @@ public class UnSubscribeRequestHeader extends Header {
         this.env = env;
     }
 
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
     public String getIdc() {
         return idc;
     }
@@ -120,14 +106,6 @@ public class UnSubscribeRequestHeader extends Header {
         this.idc = idc;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getSys() {
         return sys;
     }
@@ -175,9 +153,7 @@ public class UnSubscribeRequestHeader extends Header {
         map.put(ProtocolKey.LANGUAGE, language);
         map.put(ProtocolKey.VERSION, version);
         map.put(ProtocolKey.ClientInstanceKey.ENV, env);
-        map.put(ProtocolKey.ClientInstanceKey.REGION, region);
         map.put(ProtocolKey.ClientInstanceKey.IDC, idc);
-        map.put(ProtocolKey.ClientInstanceKey.DCN, dcn);
         map.put(ProtocolKey.ClientInstanceKey.SYS, sys);
         map.put(ProtocolKey.ClientInstanceKey.PID, pid);
         map.put(ProtocolKey.ClientInstanceKey.IP, ip);
@@ -194,9 +170,7 @@ public class UnSubscribeRequestHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version).append(",")
                 .append("env=").append(env).append(",")
-                .append("region=").append(region).append(",")
                 .append("idc=").append(idc).append(",")
-                .append("dcn=").append(dcn).append(",")
                 .append("sys=").append(sys).append(",")
                 .append("pid=").append(pid).append(",")
                 .append("ip=").append(ip).append(",")
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java
index f6e15be..f263823 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java
@@ -33,12 +33,8 @@ public class UnSubscribeResponseHeader extends Header {
 
     private String eventMeshEnv;
 
-    private String eventMeshRegion;
-
     private String eventMeshIdc;
 
-    private String eventMeshDcn;
-
     public int getCode() {
         return code;
     }
@@ -71,14 +67,6 @@ public class UnSubscribeResponseHeader extends Header {
         this.eventMeshEnv = eventMeshEnv;
     }
 
-    public String getEventMeshRegion() {
-        return eventMeshRegion;
-    }
-
-    public void setEventMeshRegion(String eventMeshRegion) {
-        this.eventMeshRegion = eventMeshRegion;
-    }
-
     public String getEventMeshIdc() {
         return eventMeshIdc;
     }
@@ -87,24 +75,13 @@ public class UnSubscribeResponseHeader extends Header {
         this.eventMeshIdc = eventMeshIdc;
     }
 
-    public String getEventMeshDcn() {
-        return eventMeshDcn;
-    }
-
-    public void setEventMeshDcn(String eventMeshDcn) {
-        this.eventMeshDcn = eventMeshDcn;
-    }
-
     public static UnSubscribeResponseHeader buildHeader(Integer requestCode, String eventMeshCluster,
-                                                        String eventMeshIp, String eventMeshEnv, String eventMeshRegion,
-                                                        String eventMeshDcn, String eventMeshIDC) {
+                                                        String eventMeshIp, String eventMeshEnv, String eventMeshIDC) {
         UnSubscribeResponseHeader unSubscribeResponseHeader = new UnSubscribeResponseHeader();
         unSubscribeResponseHeader.setCode(requestCode);
         unSubscribeResponseHeader.setEventMeshCluster(eventMeshCluster);
-        unSubscribeResponseHeader.setEventMeshDcn(eventMeshDcn);
         unSubscribeResponseHeader.setEventMeshIp(eventMeshIp);
         unSubscribeResponseHeader.setEventMeshEnv(eventMeshEnv);
-        unSubscribeResponseHeader.setEventMeshRegion(eventMeshRegion);
         unSubscribeResponseHeader.setEventMeshIdc(eventMeshIDC);
         return unSubscribeResponseHeader;
     }
@@ -115,9 +92,7 @@ public class UnSubscribeResponseHeader extends Header {
         sb.append("unSubscribeResponseHeader={")
                 .append("code=").append(code).append(",")
                 .append("eventMeshEnv=").append(eventMeshEnv).append(",")
-                .append("eventMeshRegion=").append(eventMeshRegion).append(",")
                 .append("eventMeshIdc=").append(eventMeshIdc).append(",")
-                .append("eventMeshDcn=").append(eventMeshDcn).append(",")
                 .append("eventMeshCluster=").append(eventMeshCluster).append(",")
                 .append("eventMeshIp=").append(eventMeshIp).append("}");
         return sb.toString();
@@ -131,8 +106,6 @@ public class UnSubscribeResponseHeader extends Header {
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshIp);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshEnv);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshIdc);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, eventMeshRegion);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, eventMeshDcn);
         return map;
     }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java
index e0b3fa9..18f6cfc 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java
@@ -44,12 +44,8 @@ public class PushMessageRequestHeader extends Header {
 
     private String eventMeshEnv;
 
-    private String eventMeshRegion;
-
     private String eventMeshIdc;
 
-    private String eventMeshDcn;
-
     public int getCode() {
         return code;
     }
@@ -82,14 +78,6 @@ public class PushMessageRequestHeader extends Header {
         this.eventMeshEnv = eventMeshEnv;
     }
 
-    public String getEventMeshRegion() {
-        return eventMeshRegion;
-    }
-
-    public void setEventMeshRegion(String eventMeshRegion) {
-        this.eventMeshRegion = eventMeshRegion;
-    }
-
     public String getEventMeshIdc() {
         return eventMeshIdc;
     }
@@ -98,14 +86,6 @@ public class PushMessageRequestHeader extends Header {
         this.eventMeshIdc = eventMeshIdc;
     }
 
-    public String getEventMeshDcn() {
-        return eventMeshDcn;
-    }
-
-    public void setEventMeshDcn(String eventMeshDcn) {
-        this.eventMeshDcn = eventMeshDcn;
-    }
-
     public String getLanguage() {
         return language;
     }
@@ -129,9 +109,7 @@ public class PushMessageRequestHeader extends Header {
         pushMessageRequestHeader.setVersion(ProtocolVersion.get(MapUtils.getString(headerParam, ProtocolKey.VERSION)));
         pushMessageRequestHeader.setEventMeshCluster(MapUtils.getString(headerParam, ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER));
         pushMessageRequestHeader.setEventMeshIp(MapUtils.getString(headerParam, ProtocolKey.EventMeshInstanceKey.EVENTMESHIP));
-        pushMessageRequestHeader.setEventMeshDcn(MapUtils.getString(headerParam, ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN));
         pushMessageRequestHeader.setEventMeshEnv(MapUtils.getString(headerParam, ProtocolKey.EventMeshInstanceKey.EVENTMESHENV));
-        pushMessageRequestHeader.setEventMeshRegion(MapUtils.getString(headerParam, ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION));
         pushMessageRequestHeader.setEventMeshIdc(MapUtils.getString(headerParam, ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC));
         return pushMessageRequestHeader;
     }
@@ -145,9 +123,7 @@ public class PushMessageRequestHeader extends Header {
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER, eventMeshCluster);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshIp);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshEnv);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, eventMeshRegion);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshIdc);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, eventMeshDcn);
         return map;
     }
 
@@ -159,9 +135,7 @@ public class PushMessageRequestHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version.getVersion()).append(",")
                 .append("eventMeshEnv=").append(eventMeshEnv).append(",")
-                .append("eventMeshRegion=").append(eventMeshRegion).append(",")
                 .append("eventMeshIdc=").append(eventMeshIdc).append(",")
-                .append("eventMeshDcn=").append(eventMeshDcn).append(",")
                 .append("eventMeshCluster=").append(eventMeshCluster).append(",")
                 .append("eventMeshIp=").append(eventMeshIp).append("}");
         return sb.toString();
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java
index 9571ba5..2f8fc63 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java
@@ -40,15 +40,9 @@ public class PushMessageResponseHeader extends Header {
     //请求方所在环境编号
     private String env;
 
-    //请求方所在区域编码
-    private String region;
-
     //请求方所在IDC
     private String idc;
 
-    //请求方所在DCN
-    private String dcn;
-
     //请求方的子系统
     private String sys;
 
@@ -112,14 +106,6 @@ public class PushMessageResponseHeader extends Header {
         this.env = env;
     }
 
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
     public String getIdc() {
         return idc;
     }
@@ -128,14 +114,6 @@ public class PushMessageResponseHeader extends Header {
         this.idc = idc;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getSys() {
         return sys;
     }
@@ -160,16 +138,14 @@ public class PushMessageResponseHeader extends Header {
         this.ip = ip;
     }
 
-    public static PushMessageResponseHeader buildHeader(int requestCode, String clientEnv, String clientRegion, String clientIDC,
-                                                        String clientDCN, String clientSysId, String clientPid, String clientIP) {
+    public static PushMessageResponseHeader buildHeader(int requestCode, String clientEnv, String clientIDC,
+                                                        String clientSysId, String clientPid, String clientIP) {
         PushMessageResponseHeader pushMessageResponseHeader = new PushMessageResponseHeader();
         pushMessageResponseHeader.setCode(requestCode);
         pushMessageResponseHeader.setVersion(ProtocolVersion.V1);
         pushMessageResponseHeader.setLanguage(Constants.LANGUAGE_JAVA);
         pushMessageResponseHeader.setEnv(clientEnv);
-        pushMessageResponseHeader.setRegion(clientRegion);
         pushMessageResponseHeader.setIdc(clientIDC);
-        pushMessageResponseHeader.setDcn(clientDCN);
         pushMessageResponseHeader.setSys(clientSysId);
         pushMessageResponseHeader.setPid(clientPid);
         pushMessageResponseHeader.setIp(clientIP);
@@ -184,9 +160,7 @@ public class PushMessageResponseHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version).append(",")
                 .append("env=").append(env).append(",")
-                .append("region=").append(region).append(",")
                 .append("idc=").append(idc).append(",")
-                .append("dcn=").append(dcn).append(",")
                 .append("sys=").append(sys).append(",")
                 .append("pid=").append(pid).append(",")
                 .append("ip=").append(ip).append(",")
@@ -202,9 +176,7 @@ public class PushMessageResponseHeader extends Header {
         map.put(ProtocolKey.LANGUAGE, language);
         map.put(ProtocolKey.VERSION, version);
         map.put(ProtocolKey.ClientInstanceKey.ENV, env);
-        map.put(ProtocolKey.ClientInstanceKey.REGION, region);
         map.put(ProtocolKey.ClientInstanceKey.IDC, idc);
-        map.put(ProtocolKey.ClientInstanceKey.DCN, dcn);
         map.put(ProtocolKey.ClientInstanceKey.SYS, sys);
         map.put(ProtocolKey.ClientInstanceKey.PID, pid);
         map.put(ProtocolKey.ClientInstanceKey.IP, ip);
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java
index 3a25164..e7d347e 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java
@@ -41,15 +41,9 @@ public class ReplyMessageRequestHeader extends Header {
     //请求方所在环境编号
     private String env;
 
-    //请求方所在区域编码
-    private String region;
-
     //请求方所在IDC
     private String idc;
 
-    //请求方所在DCN
-    private String dcn;
-
     //请求方的子系统
     private String sys;
 
@@ -113,14 +107,6 @@ public class ReplyMessageRequestHeader extends Header {
         this.env = env;
     }
 
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
     public String getIdc() {
         return idc;
     }
@@ -129,14 +115,6 @@ public class ReplyMessageRequestHeader extends Header {
         this.idc = idc;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getSys() {
         return sys;
     }
@@ -169,9 +147,7 @@ public class ReplyMessageRequestHeader extends Header {
                 ? Constants.LANGUAGE_JAVA : MapUtils.getString(headerParam, ProtocolKey.LANGUAGE);
         header.setLanguage(lan);
         header.setEnv(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.ENV));
-        header.setRegion(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.REGION));
         header.setIdc(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IDC));
-        header.setDcn(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.DCN));
         header.setSys(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.SYS));
         header.setPid(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PID));
         header.setIp(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IP));
@@ -187,9 +163,7 @@ public class ReplyMessageRequestHeader extends Header {
         map.put(ProtocolKey.LANGUAGE, language);
         map.put(ProtocolKey.VERSION, version);
         map.put(ProtocolKey.ClientInstanceKey.ENV, env);
-        map.put(ProtocolKey.ClientInstanceKey.REGION, region);
         map.put(ProtocolKey.ClientInstanceKey.IDC, idc);
-        map.put(ProtocolKey.ClientInstanceKey.DCN, dcn);
         map.put(ProtocolKey.ClientInstanceKey.SYS, sys);
         map.put(ProtocolKey.ClientInstanceKey.PID, pid);
         map.put(ProtocolKey.ClientInstanceKey.IP, ip);
@@ -206,9 +180,7 @@ public class ReplyMessageRequestHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version).append(",")
                 .append("env=").append(env).append(",")
-                .append("region=").append(region).append(",")
                 .append("idc=").append(idc).append(",")
-                .append("dcn=").append(dcn).append(",")
                 .append("sys=").append(sys).append(",")
                 .append("pid=").append(pid).append(",")
                 .append("ip=").append(ip).append(",")
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java
index fb2f42f..33fd373 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java
@@ -38,15 +38,9 @@ public class ReplyMessageResponseHeader extends Header {
     //处理该次Request请求的eventMesh所在的环境编号
     private String eventMeshEnv;
 
-    //处理该次Request请求的eventMesh所在区域
-    private String eventMeshRegion;
-
     //处理该次Request请求的eventMesh所在IDC
     private String eventMeshIdc;
 
-    //处理该次Request请求的eventMesh所在DCN
-    private String eventMeshDcn;
-
     public int getCode() {
         return code;
     }
@@ -79,14 +73,6 @@ public class ReplyMessageResponseHeader extends Header {
         this.eventMeshEnv = eventMeshEnv;
     }
 
-    public String getEventMeshRegion() {
-        return eventMeshRegion;
-    }
-
-    public void setEventMeshRegion(String eventMeshRegion) {
-        this.eventMeshRegion = eventMeshRegion;
-    }
-
     public String getEventMeshIdc() {
         return eventMeshIdc;
     }
@@ -95,24 +81,14 @@ public class ReplyMessageResponseHeader extends Header {
         this.eventMeshIdc = eventMeshIdc;
     }
 
-    public String getEventMeshDcn() {
-        return eventMeshDcn;
-    }
-
-    public void setEventMeshDcn(String eventMeshDcn) {
-        this.eventMeshDcn = eventMeshDcn;
-    }
-
     public static ReplyMessageResponseHeader buildHeader(Integer requestCode, String eventMeshCluster,
-                                                         String eventMeshIp, String eventMeshEnv, String eventMeshRegion,
-                                                         String eventMeshDcn, String eventMeshIDC) {
+                                                         String eventMeshIp, String eventMeshEnv,
+                                                         String eventMeshIDC) {
         ReplyMessageResponseHeader replyMessageResponseHeader = new ReplyMessageResponseHeader();
         replyMessageResponseHeader.setCode(requestCode);
         replyMessageResponseHeader.setEventMeshCluster(eventMeshCluster);
-        replyMessageResponseHeader.setEventMeshDcn(eventMeshDcn);
         replyMessageResponseHeader.setEventMeshIp(eventMeshIp);
         replyMessageResponseHeader.setEventMeshEnv(eventMeshEnv);
-        replyMessageResponseHeader.setEventMeshRegion(eventMeshRegion);
         replyMessageResponseHeader.setEventMeshIdc(eventMeshIDC);
         return replyMessageResponseHeader;
     }
@@ -123,9 +99,7 @@ public class ReplyMessageResponseHeader extends Header {
         sb.append("replyMessageResponseHeader={")
                 .append("code=").append(code).append(",")
                 .append("eventMeshEnv=").append(eventMeshEnv).append(",")
-                .append("eventMeshRegion=").append(eventMeshRegion).append(",")
                 .append("eventMeshIdc=").append(eventMeshIdc).append(",")
-                .append("eventMeshDcn=").append(eventMeshDcn).append(",")
                 .append("eventMeshCluster=").append(eventMeshCluster).append(",")
                 .append("eventMeshIp=").append(eventMeshIp).append("}");
         return sb.toString();
@@ -139,8 +113,6 @@ public class ReplyMessageResponseHeader extends Header {
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshIp);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshEnv);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshIdc);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, eventMeshRegion);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, eventMeshDcn);
         return map;
     }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java
index fd62cce..f981ceb 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java
@@ -42,15 +42,9 @@ public class SendMessageBatchRequestHeader extends Header {
     //请求方所在环境编号
     private String env;
 
-    //请求方所在区域编码
-    private String region;
-
     //请求方所在IDC
     private String idc;
 
-    //请求方所在DCN
-    private String dcn;
-
     //请求方的子系统
     private String sys;
 
@@ -114,14 +108,6 @@ public class SendMessageBatchRequestHeader extends Header {
         this.env = env;
     }
 
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
     public String getIdc() {
         return idc;
     }
@@ -130,14 +116,6 @@ public class SendMessageBatchRequestHeader extends Header {
         this.idc = idc;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getSys() {
         return sys;
     }
@@ -170,9 +148,7 @@ public class SendMessageBatchRequestHeader extends Header {
                 ? Constants.LANGUAGE_JAVA : MapUtils.getString(headerParam, ProtocolKey.LANGUAGE);
         header.setLanguage(lan);
         header.setEnv(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.ENV));
-        header.setRegion(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.REGION));
         header.setIdc(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IDC));
-        header.setDcn(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.DCN));
         header.setSys(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.SYS));
         header.setPid(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PID));
         header.setIp(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IP));
@@ -188,9 +164,7 @@ public class SendMessageBatchRequestHeader extends Header {
         map.put(ProtocolKey.LANGUAGE, language);
         map.put(ProtocolKey.VERSION, version);
         map.put(ProtocolKey.ClientInstanceKey.ENV, env);
-        map.put(ProtocolKey.ClientInstanceKey.REGION, region);
         map.put(ProtocolKey.ClientInstanceKey.IDC, idc);
-        map.put(ProtocolKey.ClientInstanceKey.DCN, dcn);
         map.put(ProtocolKey.ClientInstanceKey.SYS, sys);
         map.put(ProtocolKey.ClientInstanceKey.PID, pid);
         map.put(ProtocolKey.ClientInstanceKey.IP, ip);
@@ -207,9 +181,7 @@ public class SendMessageBatchRequestHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version).append(",")
                 .append("env=").append(env).append(",")
-                .append("region=").append(region).append(",")
                 .append("idc=").append(idc).append(",")
-                .append("dcn=").append(dcn).append(",")
                 .append("sys=").append(sys).append(",")
                 .append("pid=").append(pid).append(",")
                 .append("ip=").append(ip).append(",")
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java
index c008ed3..d06660e 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java
@@ -38,15 +38,9 @@ public class SendMessageBatchResponseHeader extends Header {
     //处理该次Request请求的eventMesh所在的环境编号
     private String eventMeshEnv;
 
-    //处理该次Request请求的eventMesh所在区域
-    private String eventMeshRegion;
-
     //处理该次Request请求的eventMesh所在IDC
     private String eventMeshIdc;
 
-    //处理该次Request请求的eventMesh所在DCN
-    private String eventMeshDcn;
-
     public int getCode() {
         return code;
     }
@@ -79,14 +73,6 @@ public class SendMessageBatchResponseHeader extends Header {
         this.eventMeshEnv = eventMeshEnv;
     }
 
-    public String getEventMeshRegion() {
-        return eventMeshRegion;
-    }
-
-    public void setEventMeshRegion(String eventMeshRegion) {
-        this.eventMeshRegion = eventMeshRegion;
-    }
-
     public String getEventMeshIdc() {
         return eventMeshIdc;
     }
@@ -95,23 +81,13 @@ public class SendMessageBatchResponseHeader extends Header {
         this.eventMeshIdc = eventMeshIdc;
     }
 
-    public String getEventMeshDcn() {
-        return eventMeshDcn;
-    }
-
-    public void setEventMeshDcn(String eventMeshDcn) {
-        this.eventMeshDcn = eventMeshDcn;
-    }
-
     public static SendMessageBatchResponseHeader buildHeader(Integer requestCode, String eventMeshCluster,
-                                                             String eventMeshIp, String eventMeshEnv, String eventMeshRegion,
-                                                             String eventMeshDcn, String eventMeshIDC) {
+                                                             String eventMeshIp, String eventMeshEnv,
+                                                             String eventMeshIDC) {
         SendMessageBatchResponseHeader sendMessageBatchResponseHeader = new SendMessageBatchResponseHeader();
         sendMessageBatchResponseHeader.setCode(requestCode);
         sendMessageBatchResponseHeader.setEventMeshCluster(eventMeshCluster);
-        sendMessageBatchResponseHeader.setEventMeshDcn(eventMeshDcn);
         sendMessageBatchResponseHeader.setEventMeshEnv(eventMeshEnv);
-        sendMessageBatchResponseHeader.setEventMeshRegion(eventMeshRegion);
         sendMessageBatchResponseHeader.setEventMeshIdc(eventMeshIDC);
         sendMessageBatchResponseHeader.setEventMeshIp(eventMeshIp);
         return sendMessageBatchResponseHeader;
@@ -123,9 +99,7 @@ public class SendMessageBatchResponseHeader extends Header {
         sb.append("sendMessageBatchResponseHeader={")
                 .append("code=").append(code).append(",")
                 .append("eventMeshEnv=").append(eventMeshEnv).append(",")
-                .append("eventMeshRegion=").append(eventMeshRegion).append(",")
                 .append("eventMeshIdc=").append(eventMeshIdc).append(",")
-                .append("eventMeshDcn=").append(eventMeshDcn).append(",")
                 .append("eventMeshCluster=").append(eventMeshCluster).append(",")
                 .append("eventMeshIp=").append(eventMeshIp).append("}");
         return sb.toString();
@@ -138,9 +112,7 @@ public class SendMessageBatchResponseHeader extends Header {
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER, eventMeshCluster);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshIp);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshEnv);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, eventMeshRegion);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshIdc);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, eventMeshDcn);
         return map;
     }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java
index 8722d68..1e7468e 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java
@@ -41,15 +41,9 @@ public class SendMessageBatchV2RequestHeader extends Header {
     //请求方所在环境编号
     private String env;
 
-    //请求方所在区域编码
-    private String region;
-
     //请求方所在IDC
     private String idc;
 
-    //请求方所在DCN
-    private String dcn;
-
     //请求方的子系统
     private String sys;
 
@@ -113,14 +107,6 @@ public class SendMessageBatchV2RequestHeader extends Header {
         this.env = env;
     }
 
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
     public String getIdc() {
         return idc;
     }
@@ -129,14 +115,6 @@ public class SendMessageBatchV2RequestHeader extends Header {
         this.idc = idc;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getSys() {
         return sys;
     }
@@ -169,9 +147,7 @@ public class SendMessageBatchV2RequestHeader extends Header {
                 ? Constants.LANGUAGE_JAVA : MapUtils.getString(headerParam, ProtocolKey.LANGUAGE);
         header.setLanguage(lan);
         header.setEnv(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.ENV));
-        header.setRegion(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.REGION));
         header.setIdc(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IDC));
-        header.setDcn(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.DCN));
         header.setSys(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.SYS));
         header.setPid(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PID));
         header.setIp(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IP));
@@ -187,9 +163,7 @@ public class SendMessageBatchV2RequestHeader extends Header {
         map.put(ProtocolKey.LANGUAGE, language);
         map.put(ProtocolKey.VERSION, version);
         map.put(ProtocolKey.ClientInstanceKey.ENV, env);
-        map.put(ProtocolKey.ClientInstanceKey.REGION, region);
         map.put(ProtocolKey.ClientInstanceKey.IDC, idc);
-        map.put(ProtocolKey.ClientInstanceKey.DCN, dcn);
         map.put(ProtocolKey.ClientInstanceKey.SYS, sys);
         map.put(ProtocolKey.ClientInstanceKey.PID, pid);
         map.put(ProtocolKey.ClientInstanceKey.IP, ip);
@@ -206,9 +180,7 @@ public class SendMessageBatchV2RequestHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version).append(",")
                 .append("env=").append(env).append(",")
-                .append("region=").append(region).append(",")
                 .append("idc=").append(idc).append(",")
-                .append("dcn=").append(dcn).append(",")
                 .append("sys=").append(sys).append(",")
                 .append("pid=").append(pid).append(",")
                 .append("ip=").append(ip).append(",")
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java
index c284fc0..1544381 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java
@@ -37,15 +37,9 @@ public class SendMessageBatchV2ResponseHeader extends Header {
     //处理该次Request请求的eventMesh所在的环境编号
     private String eventMeshEnv;
 
-    //处理该次Request请求的eventMesh所在区域
-    private String eventMeshRegion;
-
     //处理该次Request请求的eventMesh所在IDC
     private String eventMeshIdc;
 
-    //处理该次Request请求的eventMesh所在DCN
-    private String eventMeshDcn;
-
     public int getCode() {
         return code;
     }
@@ -78,14 +72,6 @@ public class SendMessageBatchV2ResponseHeader extends Header {
         this.eventMeshEnv = eventMeshEnv;
     }
 
-    public String getEventMeshRegion() {
-        return eventMeshRegion;
-    }
-
-    public void setEventMeshRegion(String eventMeshRegion) {
-        this.eventMeshRegion = eventMeshRegion;
-    }
-
     public String getEventMeshIdc() {
         return eventMeshIdc;
     }
@@ -94,23 +80,13 @@ public class SendMessageBatchV2ResponseHeader extends Header {
         this.eventMeshIdc = eventMeshIdc;
     }
 
-    public String getEventMeshDcn() {
-        return eventMeshDcn;
-    }
-
-    public void setEventMeshDcn(String eventMeshDcn) {
-        this.eventMeshDcn = eventMeshDcn;
-    }
-
     public static SendMessageBatchV2ResponseHeader buildHeader(Integer requestCode, String eventMeshCluster,
-                                                               String eventMeshIp, String eventMeshEnv, String eventMeshRegion,
-                                                               String eventMeshDcn, String eventMeshIDC) {
+                                                               String eventMeshIp, String eventMeshEnv,
+                                                               String eventMeshIDC) {
         SendMessageBatchV2ResponseHeader header = new SendMessageBatchV2ResponseHeader();
         header.setCode(requestCode);
         header.setEventMeshCluster(eventMeshCluster);
-        header.setEventMeshDcn(eventMeshDcn);
         header.setEventMeshEnv(eventMeshEnv);
-        header.setEventMeshRegion(eventMeshRegion);
         header.setEventMeshIdc(eventMeshIDC);
         header.setEventMeshIp(eventMeshIp);
         return header;
@@ -122,9 +98,7 @@ public class SendMessageBatchV2ResponseHeader extends Header {
         sb.append("sendMessageBatchV2ResponseHeader={")
                 .append("code=").append(code).append(",")
                 .append("eventMeshEnv=").append(eventMeshEnv).append(",")
-                .append("eventMeshRegion=").append(eventMeshRegion).append(",")
                 .append("eventMeshIdc=").append(eventMeshIdc).append(",")
-                .append("eventMeshDcn=").append(eventMeshDcn).append(",")
                 .append("eventMeshCluster=").append(eventMeshCluster).append(",")
                 .append("eventMeshIp=").append(eventMeshIp).append("}");
         return sb.toString();
@@ -137,9 +111,7 @@ public class SendMessageBatchV2ResponseHeader extends Header {
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER, eventMeshCluster);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshIp);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshEnv);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, eventMeshRegion);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshIdc);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, eventMeshDcn);
         return map;
     }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java
index 3a1778f..8512529 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java
@@ -41,15 +41,9 @@ public class SendMessageRequestHeader extends Header {
     //请求方所在环境编号
     private String env;
 
-    //请求方所在区域编码
-    private String region;
-
     //请求方所在IDC
     private String idc;
 
-    //请求方所在DCN
-    private String dcn;
-
     //请求方的子系统
     private String sys;
 
@@ -113,14 +107,6 @@ public class SendMessageRequestHeader extends Header {
         this.env = env;
     }
 
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
     public String getIdc() {
         return idc;
     }
@@ -129,14 +115,6 @@ public class SendMessageRequestHeader extends Header {
         this.idc = idc;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getSys() {
         return sys;
     }
@@ -169,9 +147,7 @@ public class SendMessageRequestHeader extends Header {
                 ? Constants.LANGUAGE_JAVA : MapUtils.getString(headerParam, ProtocolKey.LANGUAGE);
         header.setLanguage(lan);
         header.setEnv(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.ENV));
-        header.setRegion(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.REGION));
         header.setIdc(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IDC));
-        header.setDcn(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.DCN));
         header.setSys(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.SYS));
         header.setPid(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PID));
         header.setIp(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IP));
@@ -187,9 +163,7 @@ public class SendMessageRequestHeader extends Header {
         map.put(ProtocolKey.LANGUAGE, language);
         map.put(ProtocolKey.VERSION, version);
         map.put(ProtocolKey.ClientInstanceKey.ENV, env);
-        map.put(ProtocolKey.ClientInstanceKey.REGION, region);
         map.put(ProtocolKey.ClientInstanceKey.IDC, idc);
-        map.put(ProtocolKey.ClientInstanceKey.DCN, dcn);
         map.put(ProtocolKey.ClientInstanceKey.SYS, sys);
         map.put(ProtocolKey.ClientInstanceKey.PID, pid);
         map.put(ProtocolKey.ClientInstanceKey.IP, ip);
@@ -206,9 +180,7 @@ public class SendMessageRequestHeader extends Header {
                 .append("language=").append(language).append(",")
                 .append("version=").append(version).append(",")
                 .append("env=").append(env).append(",")
-                .append("region=").append(region).append(",")
                 .append("idc=").append(idc).append(",")
-                .append("dcn=").append(dcn).append(",")
                 .append("sys=").append(sys).append(",")
                 .append("pid=").append(pid).append(",")
                 .append("ip=").append(ip).append(",")
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java
index 2f14bd6..caa5eed 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java
@@ -38,15 +38,9 @@ public class SendMessageResponseHeader extends Header {
     //处理该次Request请求的eventMesh所在的环境编号
     private String eventMeshEnv;
 
-    //处理该次Request请求的eventMesh所在区域
-    private String eventMeshRegion;
-
     //处理该次Request请求的eventMesh所在IDC
     private String eventMeshIdc;
 
-    //处理该次Request请求的eventMesh所在DCN
-    private String eventMeshDcn;
-
     public int getCode() {
         return code;
     }
@@ -79,14 +73,6 @@ public class SendMessageResponseHeader extends Header {
         this.eventMeshEnv = eventMeshEnv;
     }
 
-    public String getEventMeshRegion() {
-        return eventMeshRegion;
-    }
-
-    public void setEventMeshRegion(String eventMeshRegion) {
-        this.eventMeshRegion = eventMeshRegion;
-    }
-
     public String getEventMeshIdc() {
         return eventMeshIdc;
     }
@@ -95,24 +81,14 @@ public class SendMessageResponseHeader extends Header {
         this.eventMeshIdc = eventMeshIdc;
     }
 
-    public String getEventMeshDcn() {
-        return eventMeshDcn;
-    }
-
-    public void setEventMeshDcn(String eventMeshDcn) {
-        this.eventMeshDcn = eventMeshDcn;
-    }
-
     public static SendMessageResponseHeader buildHeader(Integer requestCode, String eventMeshCluster,
-                                                        String eventMeshIp, String eventMeshEnv, String eventMeshRegion,
-                                                        String eventMeshDcn, String eventMeshIDC) {
+                                                        String eventMeshIp, String eventMeshEnv,
+                                                        String eventMeshIDC) {
         SendMessageResponseHeader sendMessageResponseHeader = new SendMessageResponseHeader();
         sendMessageResponseHeader.setCode(requestCode);
         sendMessageResponseHeader.setEventMeshCluster(eventMeshCluster);
-        sendMessageResponseHeader.setEventMeshDcn(eventMeshDcn);
         sendMessageResponseHeader.setEventMeshIp(eventMeshIp);
         sendMessageResponseHeader.setEventMeshEnv(eventMeshEnv);
-        sendMessageResponseHeader.setEventMeshRegion(eventMeshRegion);
         sendMessageResponseHeader.setEventMeshIdc(eventMeshIDC);
         return sendMessageResponseHeader;
     }
@@ -123,9 +99,7 @@ public class SendMessageResponseHeader extends Header {
         sb.append("sendMessageResponseHeader={")
                 .append("code=").append(code).append(",")
                 .append("eventMeshEnv=").append(eventMeshEnv).append(",")
-                .append("eventMeshRegion=").append(eventMeshRegion).append(",")
                 .append("eventMeshIdc=").append(eventMeshIdc).append(",")
-                .append("eventMeshDcn=").append(eventMeshDcn).append(",")
                 .append("eventMeshCluster=").append(eventMeshCluster).append(",")
                 .append("eventMeshIp=").append(eventMeshIp).append("}");
         return sb.toString();
@@ -138,9 +112,7 @@ public class SendMessageResponseHeader extends Header {
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER, eventMeshCluster);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshIp);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshEnv);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, eventMeshRegion);
         map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshIdc);
-        map.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, eventMeshDcn);
         return map;
     }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/Subscription.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/Subscription.java
index 83b0dc9..3fb74b9 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/Subscription.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/Subscription.java
@@ -17,25 +17,27 @@
 
 package org.apache.eventmesh.common.protocol.tcp;
 
+import org.apache.eventmesh.common.protocol.SubscriptionItem;
+
 import java.util.LinkedList;
 import java.util.List;
 
 public class Subscription {
 
-    private List<String> topicList = new LinkedList<>();
+    private List<SubscriptionItem> topicList = new LinkedList<>();
 
     public Subscription() {
     }
 
-    public Subscription(List<String> topicList) {
+    public Subscription(List<SubscriptionItem> topicList) {
         this.topicList = topicList;
     }
 
-    public List<String> getTopicList() {
+    public List<SubscriptionItem> getTopicList() {
         return topicList;
     }
 
-    public void setTopicList(List<String> topicList) {
+    public void setTopicList(List<SubscriptionItem> topicList) {
         this.topicList = topicList;
     }
 
@@ -45,6 +47,4 @@ public class Subscription {
                 "topicList=" + topicList +
                 '}';
     }
-
-
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/UserAgent.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/UserAgent.java
index 27ba693..14b5058 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/UserAgent.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/UserAgent.java
@@ -21,7 +21,6 @@ public class UserAgent {
 
     private String env;
     private String subsystem;
-    private String dcn;
     private String path;
     private int pid;
     private String host;
@@ -30,12 +29,30 @@ public class UserAgent {
     private String username;
     private String password;
     private String idc;
+    private String producerGroup;
+    private String consumerGroup;
     private String purpose;
     private int unack = 0;
 
     public UserAgent() {
     }
 
+    public String getProducerGroup() {
+        return producerGroup;
+    }
+
+    public void setProducerGroup(String producerGroup) {
+        this.producerGroup = producerGroup;
+    }
+
+    public String getConsumerGroup() {
+        return consumerGroup;
+    }
+
+    public void setConsumerGroup(String consumerGroup) {
+        this.consumerGroup = consumerGroup;
+    }
+
     public String getEnv() {
         return env;
     }
@@ -60,14 +77,6 @@ public class UserAgent {
         this.subsystem = subsystem;
     }
 
-    public String getDcn() {
-        return dcn;
-    }
-
-    public void setDcn(String dcn) {
-        this.dcn = dcn;
-    }
-
     public String getPath() {
         return path;
     }
@@ -145,7 +154,6 @@ public class UserAgent {
         return "UserAgent{" +
                 "env='" + env + '\'' +
                 "subsystem='" + subsystem + '\'' +
-                ", dcn='" + dcn + '\'' +
                 ", path='" + path + '\'' +
                 ", pid=" + pid +
                 ", host='" + host + '\'' +
@@ -168,7 +176,6 @@ public class UserAgent {
         if (port != userAgent.port) return false;
         if (unack != userAgent.unack) return false;
         if (subsystem != null ? !subsystem.equals(userAgent.subsystem) : userAgent.subsystem != null) return false;
-        if (dcn != null ? !dcn.equals(userAgent.dcn) : userAgent.dcn != null) return false;
         if (path != null ? !path.equals(userAgent.path) : userAgent.path != null) return false;
         if (host != null ? !host.equals(userAgent.host) : userAgent.host != null) return false;
         if (purpose != null ? !purpose.equals(userAgent.purpose) : userAgent.purpose != null) return false;
@@ -182,7 +189,6 @@ public class UserAgent {
     @Override
     public int hashCode() {
         int result = subsystem != null ? subsystem.hashCode() : 0;
-        result = 31 * result + (dcn != null ? dcn.hashCode() : 0);
         result = 31 * result + (path != null ? path.hashCode() : 0);
         result = 31 * result + pid;
         result = 31 * result + (host != null ? host.hashCode() : 0);
diff --git a/eventmesh-common/src/test/java/org/apache/eventmesh/common/loadbalance/RandomLoadBalanceSelectorTest.java b/eventmesh-common/src/test/java/org/apache/eventmesh/common/loadbalance/RandomLoadBalanceSelectorTest.java
new file mode 100644
index 0000000..4f7198f
--- /dev/null
+++ b/eventmesh-common/src/test/java/org/apache/eventmesh/common/loadbalance/RandomLoadBalanceSelectorTest.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.common.loadbalance;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class RandomLoadBalanceSelectorTest {
+
+    private RandomLoadBalanceSelector<String> randomLoadBalanceSelector;
+
+    private Logger logger = LoggerFactory.getLogger(RandomLoadBalanceSelectorTest.class);
+
+    @Before
+    public void befor() {
+        List<String> address = new ArrayList<>();
+        address.add("A");
+        address.add("B");
+        address.add("C");
+        randomLoadBalanceSelector = new RandomLoadBalanceSelector<>(address);
+    }
+
+
+    @Test
+    public void testSelect() {
+        Map<String, Integer> addressToNum = new HashMap<>();
+        for (int i = 0; i < 100; i++) {
+            String select = randomLoadBalanceSelector.select();
+            addressToNum.put(select, addressToNum.getOrDefault(select, 0) + 1);
+        }
+        addressToNum.forEach((key, value) -> logger.info("{} : {}", key, value));
+        // just assert success if no exception
+        Assert.assertTrue(true);
+    }
+
+    @Test
+    public void testGetType() {
+        Assert.assertEquals(LoadBalanceType.RANDOM, randomLoadBalanceSelector.getType());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-common/src/test/java/org/apache/eventmesh/common/loadbalance/WeightRoundRobinLoadBalanceSelectorTest.java b/eventmesh-common/src/test/java/org/apache/eventmesh/common/loadbalance/WeightRoundRobinLoadBalanceSelectorTest.java
new file mode 100644
index 0000000..d37aed3
--- /dev/null
+++ b/eventmesh-common/src/test/java/org/apache/eventmesh/common/loadbalance/WeightRoundRobinLoadBalanceSelectorTest.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.common.loadbalance;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class WeightRoundRobinLoadBalanceSelectorTest {
+
+    private Logger logger = LoggerFactory.getLogger(WeightRoundRobinLoadBalanceSelectorTest.class);
+
+    private WeightRoundRobinLoadBalanceSelector<String> weightRoundRobinLoadBalanceSelector;
+
+    @Before
+    public void before() {
+        List<Weight<String>> weightList = new ArrayList<>();
+        weightList.add(new Weight<>("A", 10));
+        weightList.add(new Weight<>("B", 20));
+        weightList.add(new Weight<>("C", 30));
+        weightRoundRobinLoadBalanceSelector = new WeightRoundRobinLoadBalanceSelector<>(weightList);
+    }
+
+    @Test
+    public void testSelect() {
+        Map<String, Integer> addressToNum = new HashMap<>();
+        for (int i = 0; i < 100_000; i++) {
+            String select = weightRoundRobinLoadBalanceSelector.select();
+            addressToNum.put(select, addressToNum.getOrDefault(select, 0) + 1);
+        }
+        addressToNum.forEach((key, value) -> {
+            logger.info("{}: {}", key, value);
+        });
+        Assert.assertTrue(addressToNum.get("B") > addressToNum.get("A"));
+        Assert.assertTrue(addressToNum.get("C") > addressToNum.get("B"));
+    }
+
+    @Test
+    public void testGetType() {
+        Assert.assertEquals(LoadBalanceType.WEIGHT_ROUND_ROBIN, weightRoundRobinLoadBalanceSelector.getType());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-connector-api/gradle.properties b/eventmesh-connector-api/gradle.properties
index 9d1744e..c06c465 100644
--- a/eventmesh-connector-api/gradle.properties
+++ b/eventmesh-connector-api/gradle.properties
@@ -15,7 +15,7 @@
 # limitations under the License.
 #
 group=org.apache.eventmesh
-version=1.2.0-SNAPSHOT
+version=1.2.0-release
 jdk=1.8
 mavenUserName=
 mavenPassword=
\ No newline at end of file
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java b/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/EventMeshAction.java
similarity index 87%
rename from eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java
rename to eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/EventMeshAction.java
index f06ba02..4fda6d0 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java
+++ b/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/EventMeshAction.java
@@ -14,8 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.eventmesh.api;
 
-package org.apache.eventmesh.runtime.core.consumergroup.event;
+public enum EventMeshAction {
+    CommitMessage,
 
-public class ConsumerGroupInstanceChangeEvent {
+    ReconsumeLater,
+
+    ManualAck
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/Subscription.java b/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/EventMeshAsyncConsumeContext.java
similarity index 57%
copy from eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/Subscription.java
copy to eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/EventMeshAsyncConsumeContext.java
index 83b0dc9..c7e4e7f 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/tcp/Subscription.java
+++ b/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/EventMeshAsyncConsumeContext.java
@@ -14,37 +14,27 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.eventmesh.api;
 
-package org.apache.eventmesh.common.protocol.tcp;
+import io.openmessaging.api.Action;
+import io.openmessaging.api.AsyncConsumeContext;
 
-import java.util.LinkedList;
-import java.util.List;
+public abstract class EventMeshAsyncConsumeContext extends AsyncConsumeContext {
 
-public class Subscription {
+    private AbstractContext abstractContext;
 
-    private List<String> topicList = new LinkedList<>();
-
-    public Subscription() {
-    }
-
-    public Subscription(List<String> topicList) {
-        this.topicList = topicList;
+    public AbstractContext getAbstractContext() {
+        return abstractContext;
     }
 
-    public List<String> getTopicList() {
-        return topicList;
+    public void setAbstractContext(AbstractContext abstractContext) {
+        this.abstractContext = abstractContext;
     }
 
-    public void setTopicList(List<String> topicList) {
-        this.topicList = topicList;
-    }
+    public abstract void commit(EventMeshAction action);
 
     @Override
-    public String toString() {
-        return "Subscription{" +
-                "topicList=" + topicList +
-                '}';
+    public void commit(Action action) {
+        throw new UnsupportedOperationException("not support yet");
     }
-
-
-}
+}
\ No newline at end of file
diff --git a/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/consumer/MeshMQPushConsumer.java b/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/consumer/MeshMQPushConsumer.java
index b495169..5e60e0e 100644
--- a/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/consumer/MeshMQPushConsumer.java
+++ b/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/consumer/MeshMQPushConsumer.java
@@ -30,11 +30,6 @@ public interface MeshMQPushConsumer extends Consumer {
 
     void init(Properties keyValue) throws Exception;
 
-    @Override
-    void start();
-
-//    void updateOffset(List<MessageExt> msgs, ConsumeConcurrentlyContext context);
-
     void updateOffset(List<Message> msgs, AbstractContext context);
 
 //    void registerMessageListener(MessageListenerConcurrently messageListenerConcurrently);
@@ -43,6 +38,4 @@ public interface MeshMQPushConsumer extends Consumer {
 
     @Override
     void unsubscribe(String topic);
-
-    AbstractContext getContext();
 }
diff --git a/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/producer/MeshMQProducer.java b/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/producer/MeshMQProducer.java
index 929654f..82ca583 100644
--- a/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/producer/MeshMQProducer.java
+++ b/eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/producer/MeshMQProducer.java
@@ -29,9 +29,6 @@ public interface MeshMQProducer extends Producer {
 
     void init(Properties properties) throws Exception;
 
-    @Override
-    void start();
-
     void send(Message message, SendCallback sendCallback) throws Exception;
 
     void request(Message message, SendCallback sendCallback, RRCallback rrCallback, long timeout) throws Exception;
@@ -40,12 +37,8 @@ public interface MeshMQProducer extends Producer {
 
     boolean reply(final Message message, final SendCallback sendCallback) throws Exception;
 
-    MeshMQProducer getMeshMQProducer();
-
-    String buildMQClientId();
+    void checkTopicExist(String topic) throws Exception;
 
     void setExtFields();
 
-    void getDefaultTopicRouteInfoFromNameServer(String topic, long timeout) throws Exception;
-
 }
diff --git a/eventmesh-connector-rocketmq/gradle.properties b/eventmesh-connector-rocketmq/gradle.properties
index 9b89108..383fbc0 100644
--- a/eventmesh-connector-rocketmq/gradle.properties
+++ b/eventmesh-connector-rocketmq/gradle.properties
@@ -14,7 +14,7 @@
 # limitations under the License.
 
 group=org.apache.eventmesh
-version=1.2.0
+version=1.2.0-release
 rocketmq_version=4.7.1
 mavenUserName=
 mavenPassword=
\ No newline at end of file
diff --git a/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/common/Constants.java b/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/common/Constants.java
index 9d54a2e..fc55a68 100644
--- a/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/common/Constants.java
+++ b/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/common/Constants.java
@@ -18,11 +18,8 @@
 package org.apache.eventmesh.connector.rocketmq.common;
 
 public class Constants {
-    public static final String BROADCAST_PREFIX = "broadcast-";
-
-    public final static String CONSUMER_GROUP_NAME_PREFIX = "ConsumerGroup-";
 
-    public final static String PRODUCER_GROUP_NAME_PREFIX = "ProducerGroup-";
+    public static final String BROADCAST_PREFIX = "broadcast-";
 
     public static final String PROPERTY_MESSAGE_TIMEOUT = "TIMEOUT";
 
diff --git a/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/common/EventMeshConstants.java b/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/common/EventMeshConstants.java
index cce1645..69fb8c1 100644
--- a/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/common/EventMeshConstants.java
+++ b/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/common/EventMeshConstants.java
@@ -29,10 +29,6 @@ public class EventMeshConstants {
 
     public static final String BROADCAST_PREFIX = "broadcast-";
 
-    public final static String CONSUMER_GROUP_NAME_PREFIX = "ConsumerGroup-";
-
-    public final static String PRODUCER_GROUP_NAME_PREFIX = "ProducerGroup-";
-
     public static final String DEFAULT_CHARSET = "UTF-8";
 
     public static final String EVENTMESH_CONF_HOME = System.getProperty("confPath", System.getenv("confPath"));
@@ -85,7 +81,6 @@ public class EventMeshConstants {
 
     public static final String TAG = "TAG";
 
-    public static final String MANAGE_DCN = "dcn";
     public static final String MANAGE_SUBSYSTEM = "subSystem";
     public static final String MANAGE_IP = "ip";
     public static final String MANAGE_PORT = "port";
diff --git a/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/PushConsumerImpl.java b/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/PushConsumerImpl.java
index 2193ca1..47565e3 100644
--- a/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/PushConsumerImpl.java
+++ b/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/PushConsumerImpl.java
@@ -21,9 +21,6 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
-
-import io.openmessaging.api.Action;
-import io.openmessaging.api.AsyncConsumeContext;
 import io.openmessaging.api.AsyncGenericMessageListener;
 import io.openmessaging.api.AsyncMessageListener;
 import io.openmessaging.api.Consumer;
@@ -32,8 +29,8 @@ import io.openmessaging.api.Message;
 import io.openmessaging.api.MessageListener;
 import io.openmessaging.api.MessageSelector;
 import io.openmessaging.api.exception.OMSRuntimeException;
-
-import org.apache.eventmesh.api.AbstractContext;
+import org.apache.eventmesh.api.EventMeshAction;
+import org.apache.eventmesh.api.EventMeshAsyncConsumeContext;
 import org.apache.eventmesh.common.Constants;
 import org.apache.eventmesh.connector.rocketmq.common.EventMeshConstants;
 import org.apache.eventmesh.connector.rocketmq.config.ClientConfig;
@@ -55,7 +52,6 @@ public class PushConsumerImpl implements Consumer {
     private AtomicBoolean started = new AtomicBoolean(false);
     private final Map<String, AsyncMessageListener> subscribeTable = new ConcurrentHashMap<>();
     private final ClientConfig clientConfig;
-    private EventMeshConsumeConcurrentlyContext context;
 
     public PushConsumerImpl(final Properties properties) {
         this.rocketmqPushConsumer = new DefaultMQPushConsumer();
@@ -93,7 +89,6 @@ public class PushConsumerImpl implements Consumer {
 
                 @Override
                 public EventMeshConsumeConcurrentlyStatus handleMessage(MessageExt msg, EventMeshConsumeConcurrentlyContext context) {
-                    PushConsumerImpl.this.setContext(context);
                     if (msg == null) {
                         return EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                     }
@@ -117,12 +112,25 @@ public class PushConsumerImpl implements Consumer {
 
                     final Properties contextProperties = new Properties();
                     contextProperties.put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.RECONSUME_LATER.name());
-                    AsyncConsumeContext omsContext = new AsyncConsumeContext() {
+                    EventMeshAsyncConsumeContext omsContext = new EventMeshAsyncConsumeContext() {
                         @Override
-                        public void commit(Action action) {
-                            contextProperties.put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS.name());
+                        public void commit(EventMeshAction action) {
+                            switch (action){
+                                case CommitMessage:
+                                    contextProperties.put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS.name());
+                                    break;
+                                case ReconsumeLater:
+                                    contextProperties.put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.RECONSUME_LATER.name());
+                                    break;
+                                case ManualAck:
+                                    contextProperties.put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_FINISH.name());
+                                    break;
+                                default:
+                                    break;
+                            }
                         }
                     };
+                    omsContext.setAbstractContext(context);
                     listener.consume(omsMsg, omsContext);
 
                     return EventMeshConsumeConcurrentlyStatus.valueOf(contextProperties.getProperty(NonStandardKeys.MESSAGE_CONSUME_STATUS));
@@ -133,7 +141,6 @@ public class PushConsumerImpl implements Consumer {
 
                 @Override
                 public EventMeshConsumeConcurrentlyStatus handleMessage(MessageExt msg, EventMeshConsumeConcurrentlyContext context) {
-                    PushConsumerImpl.this.setContext(context);
                     if (msg == null) {
                         return EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                     }
@@ -157,13 +164,25 @@ public class PushConsumerImpl implements Consumer {
 
                     contextProperties.put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.RECONSUME_LATER.name());
 
-                    AsyncConsumeContext omsContext = new AsyncConsumeContext() {
+                    EventMeshAsyncConsumeContext omsContext = new EventMeshAsyncConsumeContext() {
                         @Override
-                        public void commit(Action action) {
-                            contextProperties.put(NonStandardKeys.MESSAGE_CONSUME_STATUS,
-                                    EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS.name());
+                        public void commit(EventMeshAction action) {
+                            switch (action) {
+                                case CommitMessage:
+                                    contextProperties.put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS.name());
+                                    break;
+                                case ReconsumeLater:
+                                    contextProperties.put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.RECONSUME_LATER.name());
+                                    break;
+                                case ManualAck:
+                                    contextProperties.put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_FINISH.name());
+                                    break;
+                                default:
+                                    break;
+                            }
                         }
                     };
+                    omsContext.setAbstractContext(context);
                     listener.consume(omsMsg, omsContext);
 
                     return EventMeshConsumeConcurrentlyStatus.valueOf(contextProperties.getProperty(NonStandardKeys.MESSAGE_CONSUME_STATUS));
@@ -254,14 +273,6 @@ public class PushConsumerImpl implements Consumer {
 //        }
 //    }
 
-    public AbstractContext getContext() {
-        return this.context;
-    }
-
-    public void setContext(EventMeshConsumeConcurrentlyContext context) {
-        this.context = context;
-    }
-
     @Override
     public void subscribe(String topic, String subExpression, MessageListener listener) {
 
diff --git a/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/RocketMQConsumerImpl.java b/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/RocketMQConsumerImpl.java
index ce076f8..853c394 100644
--- a/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/RocketMQConsumerImpl.java
+++ b/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/RocketMQConsumerImpl.java
@@ -71,9 +71,7 @@ public class RocketMQConsumerImpl implements MeshMQPushConsumer {
 
 
         if (isBroadcast) {
-            consumerGroup = Constants.CONSUMER_GROUP_NAME_PREFIX + Constants.BROADCAST_PREFIX + consumerGroup;
-        } else {
-            consumerGroup = Constants.CONSUMER_GROUP_NAME_PREFIX + consumerGroup;
+            consumerGroup = Constants.BROADCAST_PREFIX + consumerGroup;
         }
 
         String omsNamesrv = clientConfiguration.namesrvAddr;
@@ -99,12 +97,6 @@ public class RocketMQConsumerImpl implements MeshMQPushConsumer {
     }
 
     @Override
-    public AbstractContext getContext() {
-        return pushConsumer.getContext();
-    }
-
-
-    @Override
     public boolean isStarted() {
         return pushConsumer.isStarted();
     }
diff --git a/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/producer/RocketMQProducerImpl.java b/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/producer/RocketMQProducerImpl.java
index 6364650..72e2093 100644
--- a/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/producer/RocketMQProducerImpl.java
+++ b/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/producer/RocketMQProducerImpl.java
@@ -87,7 +87,6 @@ public class RocketMQProducerImpl implements MeshMQProducer {
         producer.start();
     }
 
-
     @Override
     public synchronized void shutdown() {
         producer.shutdown();
@@ -115,13 +114,8 @@ public class RocketMQProducerImpl implements MeshMQProducer {
     }
 
     @Override
-    public MeshMQProducer getMeshMQProducer() {
-        return this;
-    }
-
-    @Override
-    public String buildMQClientId() {
-        return producer.getRocketmqProducer().buildMQClientId();
+    public void checkTopicExist(String topic) throws Exception {
+        this.producer.getRocketmqProducer().getDefaultMQProducerImpl().getmQClientFactory().getMQClientAPIImpl().getDefaultTopicRouteInfoFromNameServer(topic, EventMeshConstants.DEFAULT_TIMEOUT_IN_MILLISECONDS);
     }
 
     @Override
@@ -130,13 +124,6 @@ public class RocketMQProducerImpl implements MeshMQProducer {
     }
 
     @Override
-    public void getDefaultTopicRouteInfoFromNameServer(String topic, long timeout) throws Exception {
-        producer.getRocketmqProducer().getDefaultMQProducerImpl()
-                .getmQClientFactory().getMQClientAPIImpl().getDefaultTopicRouteInfoFromNameServer(topic,
-                timeout);
-    }
-
-    @Override
     public SendResult send(Message message) {
         return producer.send(message);
     }
diff --git a/eventmesh-connector-rocketmq/src/test/java/org/apache/rocketmq/consumer/PushConsumerImplTest.java b/eventmesh-connector-rocketmq/src/test/java/org/apache/rocketmq/consumer/PushConsumerImplTest.java
index 186ef4a..1140535 100644
--- a/eventmesh-connector-rocketmq/src/test/java/org/apache/rocketmq/consumer/PushConsumerImplTest.java
+++ b/eventmesh-connector-rocketmq/src/test/java/org/apache/rocketmq/consumer/PushConsumerImplTest.java
@@ -32,6 +32,8 @@ import io.openmessaging.api.MessagingAccessPoint;
 import io.openmessaging.api.OMS;
 import io.openmessaging.api.OMSBuiltinKeys;
 
+import org.apache.eventmesh.api.EventMeshAction;
+import org.apache.eventmesh.api.EventMeshAsyncConsumeContext;
 import org.apache.eventmesh.connector.rocketmq.consumer.PushConsumerImpl;
 import org.apache.eventmesh.connector.rocketmq.domain.NonStandardKeys;
 import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
@@ -95,7 +97,7 @@ public class PushConsumerImplTest {
             public void consume(Message message, AsyncConsumeContext context) {
                 assertThat(message.getSystemProperties("MESSAGE_ID")).isEqualTo("NewMsgId");
                 assertThat(message.getBody()).isEqualTo(testBody);
-                context.commit(Action.CommitMessage);
+                ((EventMeshAsyncConsumeContext)context).commit(EventMeshAction.CommitMessage);
             }
         });
         ((MessageListenerConcurrently) rocketmqPushConsumer
diff --git a/eventmesh-connector-rocketmq/src/test/resources/META-INF/services/org.apache.io.openmessaging.MessagingAccessPoint b/eventmesh-connector-rocketmq/src/test/resources/META-INF/services/org.apache.io.openmessaging.MessagingAccessPoint
index 7347e69..e326c91 100644
--- a/eventmesh-connector-rocketmq/src/test/resources/META-INF/services/org.apache.io.openmessaging.MessagingAccessPoint
+++ b/eventmesh-connector-rocketmq/src/test/resources/META-INF/services/org.apache.io.openmessaging.MessagingAccessPoint
@@ -1 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
 org.apache.eventmesh.connector.rocketmq.MessagingAccessPointImpl
\ No newline at end of file
diff --git a/eventmesh-connector-rocketmq/src/test/resources/META-INF/services/org.apache.io.openmessaging.producer.Producer b/eventmesh-connector-rocketmq/src/test/resources/META-INF/services/org.apache.io.openmessaging.producer.Producer
index 5ea8a18..bf0a8dd 100644
--- a/eventmesh-connector-rocketmq/src/test/resources/META-INF/services/org.apache.io.openmessaging.producer.Producer
+++ b/eventmesh-connector-rocketmq/src/test/resources/META-INF/services/org.apache.io.openmessaging.producer.Producer
@@ -1 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
 org.apache.eventmesh.connector.rocketmq.producer.ProducerImpl
\ No newline at end of file
diff --git a/eventmesh-runtime/conf/eventmesh.properties b/eventmesh-runtime/conf/eventmesh.properties
index 21b9bb7..035b950 100644
--- a/eventmesh-runtime/conf/eventmesh.properties
+++ b/eventmesh-runtime/conf/eventmesh.properties
@@ -17,10 +17,8 @@
 ###############################EVNETMESH-runtime ENV#################################
 eventMesh.server.idc=DEFAULT
 eventMesh.server.env=PRD
-eventMesh.server.region=region1
 eventMesh.server.cluster=COMMON
 eventMesh.server.name=EVENTMESH-runtime
-eventMesh.server.dcn=010
 eventMesh.sysid=0000
 eventMesh.server.http.port=10105
 ########################## eventMesh tcp configuration ############################
@@ -39,7 +37,7 @@ eventMesh.server.session.expiredInMills=60000
 # flow control, include the global level and session level
 eventMesh.server.tcp.msgReqnumPerSecond=15000
 eventMesh.server.session.upstreamBufferSize=20
-eventMesh.server.session.downstreamUnackSize=100
+
 # thread number about global scheduler
 eventMesh.server.global.scheduler=5
 eventMesh.server.tcp.taskHandleExecutorPoolSize=8
diff --git a/eventmesh-runtime/scripts/client_manage.sh b/eventmesh-runtime/scripts/client_manage.sh
index f9367a0..0913cc5 100644
--- a/eventmesh-runtime/scripts/client_manage.sh
+++ b/eventmesh-runtime/scripts/client_manage.sh
@@ -17,8 +17,8 @@
 # specific language governing permissions and limitations
 # under the License.
 i_eg="sh client_manage.sh -i 10.255.34.160 24591"
-s_eg="sh client_manage.sh -s FT0 5319"
-r_eg="sh client_manage.sh -r FT0 9876 10.255.1.143 10000"
+s_eg="sh client_manage.sh -s 5319"
+r_eg="sh client_manage.sh -r 9876 10.255.1.143 10000"
 a_eg="sh client_manage.sh -a"
 x_eg="sh client_manage.sh -x 10.255.34.160 24591 10.255.1.143 10000"
 y_eg="sh client_manage.sh -y bq-bypass 10.255.1.143 10000"
@@ -27,8 +27,8 @@ function printEg() {
         echo "param error."
         echo "reject client by ip_port, eg : ${i_eg}"
         echo "reject all clients, eg : ${a_eg}"
-        echo "reject clients by dcn_systemid, eg : ${s_eg}"
-        echo "redirect client by dcn_systemid, eg : ${r_eg}"
+        echo "reject clients by systemid, eg : ${s_eg}"
+        echo "redirect client by systemid, eg : ${r_eg}"
         echo "redirect client by ip port, eg : ${x_eg}"
         echo "redirect client by path, eg : ${y_eg}"
 }
@@ -52,9 +52,8 @@ do
                         CLIENT_PORT=$5
                         msg=`curl "http://${ADDR}/clientManage/rejectClientByIpPort?ip=${CLIENT_IP}&port=${CLIENT_PORT}"`;echo ${msg};break;;
                 -s|--subsystem)
-                        DCN=$4
-                        SUB_SYSTEM=$5
-                        msg=`curl "http://${ADDR}/clientManage/rejectClientBySubSystem?dcn=${DCN}&subSystem=${SUB_SYSTEM}"`;echo ${msg};break;;
+                        SUB_SYSTEM=$4
+                        msg=`curl "http://${ADDR}/clientManage/rejectClientBySubSystem?subSystem=${SUB_SYSTEM}"`;echo ${msg};break;;
                 -x|--redirectbyip)
                         CLIENT_IP=$4
                         CLIENT_PORT=$5
@@ -67,11 +66,10 @@ do
                         DEST_PROXY_PORT=$6
                         msg=`curl "http://${ADDR}/clientManage/redirectClientByPath?path=${CLIENT_PATH}&destProxyIp=${DEST_PROXY_IP}&destProxyPort=${DEST_PROXY_PORT}"`;echo ${msg};break;;
                 -r|--redirect)
-                        DCN=$4
-                        SUB_SYSTEM=$5
-                        DEST_PROXY_IP=$6
-                        DEST_PROXY_PORT=$7
-                        msg=`curl "http://${ADDR}/clientManage/redirectClientBySubSystem?dcn=${DCN}&subSystem=${SUB_SYSTEM}&destProxyIp=${DEST_PROXY_IP}&destProxyPort=${DEST_PROXY_PORT}"`;echo ${msg};break;;
+                        SUB_SYSTEM=$4
+                        DEST_PROXY_IP=$5
+                        DEST_PROXY_PORT=$6
+                        msg=`curl "http://${ADDR}/clientManage/redirectClientBySubSystem?subSystem=${SUB_SYSTEM}&destProxyIp=${DEST_PROXY_IP}&destProxyPort=${DEST_PROXY_PORT}"`;echo ${msg};break;;
                 --)
                         shift;
                         break;;
diff --git a/eventmesh-runtime/scripts/session.sh b/eventmesh-runtime/scripts/session.sh
index 86042c0..3540cf8 100644
--- a/eventmesh-runtime/scripts/session.sh
+++ b/eventmesh-runtime/scripts/session.sh
@@ -24,7 +24,6 @@ then
         TOPIC=$1
         curl -s "http://127.0.0.1:10106/clientManage/showListenClientByTopic?topic=${TOPIC}"
 else
-        CLIENT_DCN=$1
-        CLIENT_SYSTEM=$2
-        curl -s "http://127.0.0.1:10106/clientManage/showClientBySystemAndDcn?dcn=${CLIENT_DCN}&subSystem=${CLIENT_SYSTEM}"
+        CLIENT_SYSTEM=$1
+        curl -s "http://127.0.0.1:10106/clientManage/showClientBySystem?subSystem=${CLIENT_SYSTEM}"
 fi
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/controller/ClientManageController.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/controller/ClientManageController.java
index f93e1af..573eb02 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/controller/ClientManageController.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/controller/ClientManageController.java
@@ -17,36 +17,21 @@
 
 package org.apache.eventmesh.runtime.admin.controller;
 
-import java.io.BufferedReader;
 import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
 import java.net.InetSocketAddress;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
 
-import com.sun.net.httpserver.HttpExchange;
-import com.sun.net.httpserver.HttpHandler;
 import com.sun.net.httpserver.HttpServer;
 
-import org.apache.commons.lang3.StringUtils;
-import org.apache.eventmesh.common.protocol.tcp.UserAgent;
+import org.apache.eventmesh.runtime.admin.handler.RedirectClientByIpPortHandler;
+import org.apache.eventmesh.runtime.admin.handler.RedirectClientByPathHandler;
+import org.apache.eventmesh.runtime.admin.handler.RedirectClientBySubSystemHandler;
+import org.apache.eventmesh.runtime.admin.handler.RejectAllClientHandler;
+import org.apache.eventmesh.runtime.admin.handler.RejectClientByIpPortHandler;
+import org.apache.eventmesh.runtime.admin.handler.RejectClientBySubSystemHandler;
+import org.apache.eventmesh.runtime.admin.handler.ShowClientBySystemHandler;
+import org.apache.eventmesh.runtime.admin.handler.ShowClientHandler;
+import org.apache.eventmesh.runtime.admin.handler.ShowListenClientByTopicHandler;
 import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
-import org.apache.eventmesh.runtime.constants.EventMeshConstants;
-import org.apache.eventmesh.runtime.core.protocol.tcp.client.EventMeshTcp2Client;
-import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientGroupWrapper;
-import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientSessionGroupMapping;
-import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,713 +48,17 @@ public class ClientManageController {
     public void start() throws IOException {
         int port = eventMeshTCPServer.getEventMeshTCPConfiguration().eventMeshServerAdminPort;
         HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);
-        server.createContext("/clientManage/showClient", new ShowClientHandler());
-        server.createContext("/clientManage/showClientBySystemAndDcn", new ShowClientBySystemAndDcnHandler());
-        server.createContext("/clientManage/rejectAllClient", new RejectAllClientHandler());
-        server.createContext("/clientManage/rejectClientByIpPort", new RejectClientByIpPortHandler());
-        server.createContext("/clientManage/rejectClientBySubSystem", new RejectClientBySubSystemHandler());
-        server.createContext("/clientManage/redirectClientBySubSystem", new RedirectClientBySubSystemHandler());
-        server.createContext("/clientManage/redirectClientByPath", new RedirectClientByPathHandler());
-        server.createContext("/clientManage/redirectClientByIpPort", new RedirectClientByIpPortHandler());
-//        server.createContext("/eventMesh/msg/push", new EventMeshMsgDownStreamHandler());
-        server.createContext("/clientManage/showListenClientByTopic", new ShowListenClientByTopicHandler());
+        server.createContext("/clientManage/showClient", new ShowClientHandler(eventMeshTCPServer));
+        server.createContext("/clientManage/showClientBySystem", new ShowClientBySystemHandler(eventMeshTCPServer));
+        server.createContext("/clientManage/rejectAllClient", new RejectAllClientHandler(eventMeshTCPServer));
+        server.createContext("/clientManage/rejectClientByIpPort", new RejectClientByIpPortHandler(eventMeshTCPServer));
+        server.createContext("/clientManage/rejectClientBySubSystem", new RejectClientBySubSystemHandler(eventMeshTCPServer));
+        server.createContext("/clientManage/redirectClientBySubSystem", new RedirectClientBySubSystemHandler(eventMeshTCPServer));
+        server.createContext("/clientManage/redirectClientByPath", new RedirectClientByPathHandler(eventMeshTCPServer));
+        server.createContext("/clientManage/redirectClientByIpPort", new RedirectClientByIpPortHandler(eventMeshTCPServer));
+        server.createContext("/clientManage/showListenClientByTopic", new ShowListenClientByTopicHandler(eventMeshTCPServer));
 
         server.start();
         logger.info("ClientManageController start success, port:{}", port);
     }
-
-    private Map<String, Object> parsePostParameters(HttpExchange exchange)
-            throws IOException {
-        Map<String, Object> parameters = new HashMap<>();
-        if ("post".equalsIgnoreCase(exchange.getRequestMethod())) {
-            InputStreamReader isr =
-                    new InputStreamReader(exchange.getRequestBody(), "utf-8");
-            BufferedReader br = new BufferedReader(isr);
-            String query = br.readLine();
-            parseQuery(query, parameters);
-        }
-        return parameters;
-    }
-
-    @SuppressWarnings("unchecked")
-    private void parseQuery(String query, Map<String, Object> parameters)
-            throws UnsupportedEncodingException {
-
-        if (query != null) {
-            String pairs[] = query.split("&");
-
-            for (String pair : pairs) {
-                String param[] = pair.split("=");
-
-                String key = null;
-                String value = null;
-                if (param.length > 0) {
-                    key = URLDecoder.decode(param[0], "UTF-8");
-                }
-
-                if (param.length > 1) {
-                    value = URLDecoder.decode(param[1], "UTF-8");
-                }
-
-                if (parameters.containsKey(key)) {
-                    Object obj = parameters.get(key);
-                    if (obj instanceof List<?>) {
-                        List<String> values = (List<String>) obj;
-                        values.add(value);
-                    } else if (obj instanceof String) {
-                        List<String> values = new ArrayList<String>();
-                        values.add((String) obj);
-                        values.add(value);
-                        parameters.put(key, values);
-                    }
-                } else {
-                    parameters.put(key, value);
-                }
-            }
-        }
-    }
-
-    /**
-     * 打印本eventMesh上所有客户端信息
-     *
-     * @return
-     */
-    class ShowClientHandler implements HttpHandler {
-        @Override
-        public void handle(HttpExchange httpExchange) throws IOException {
-            String result = "";
-            OutputStream out = httpExchange.getResponseBody();
-            try {
-                String newLine = System.getProperty("line.separator");
-                logger.info("showAllClient=================");
-                ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
-                Map<String, AtomicInteger> dcnSystemMap = clientSessionGroupMapping.statDCNSystemInfo();
-                if (!dcnSystemMap.isEmpty()) {
-                    List<Map.Entry<String, AtomicInteger>> list = new ArrayList<>();
-                    ValueComparator vc = new ValueComparator();
-                    for (Map.Entry<String, AtomicInteger> entry : dcnSystemMap.entrySet()) {
-                        list.add(entry);
-                    }
-                    Collections.sort(list, vc);
-                    for (Map.Entry<String, AtomicInteger> entry : list) {
-                        result += String.format("System=%s | ClientNum=%d", entry.getKey(), entry.getValue().intValue()) +
-                                newLine;
-                    }
-                }
-                httpExchange.sendResponseHeaders(200, 0);
-                out.write(result.getBytes());
-            } catch (Exception e) {
-                logger.error("ShowClientHandler fail...", e);
-            } finally {
-                if (out != null) {
-                    try {
-                        out.close();
-                    } catch (IOException e) {
-                        logger.warn("out close failed...", e);
-                    }
-                }
-            }
-
-        }
-    }
-
-    class ValueComparator implements Comparator<Map.Entry<String, AtomicInteger>> {
-        @Override
-        public int compare(Map.Entry<String, AtomicInteger> x, Map.Entry<String, AtomicInteger> y) {
-            return x.getValue().intValue() - y.getValue().intValue();
-        }
-    }
-
-    /**
-     * print clientInfo by subsys and dcn
-     *
-     * @return
-     */
-    class ShowClientBySystemAndDcnHandler implements HttpHandler {
-        @Override
-        public void handle(HttpExchange httpExchange) throws IOException {
-            String result = "";
-            OutputStream out = httpExchange.getResponseBody();
-            try {
-                String queryString = httpExchange.getRequestURI().getQuery();
-                Map<String, String> queryStringInfo = formData2Dic(queryString);
-                String dcn = queryStringInfo.get(EventMeshConstants.MANAGE_DCN);
-                String subSystem = queryStringInfo.get(EventMeshConstants.MANAGE_SUBSYSTEM);
-
-                String newLine = System.getProperty("line.separator");
-                logger.info("showClientBySubsysAndDcn,subsys:{},dcn:{}=================", subSystem, dcn);
-                ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
-                ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
-                if (!sessionMap.isEmpty()) {
-                    for (Session session : sessionMap.values()) {
-                        if (session.getClient().getDcn().equals(dcn) && session.getClient().getSubsystem().equals(subSystem)) {
-                            UserAgent userAgent = session.getClient();
-                            result += String.format("pid=%s | ip=%s | port=%s | path=%s | purpose=%s", userAgent.getPid(), userAgent
-                                    .getHost(), userAgent.getPort(), userAgent.getPath(), userAgent.getPurpose()) + newLine;
-                        }
-                    }
-                }
-                httpExchange.sendResponseHeaders(200, 0);
-                out.write(result.getBytes());
-            } catch (Exception e) {
-                logger.error("ShowClientBySystemAndDcnHandler fail...", e);
-            } finally {
-                if (out != null) {
-                    try {
-                        out.close();
-                    } catch (IOException e) {
-                        logger.warn("out close failed...", e);
-                    }
-                }
-            }
-
-        }
-    }
-
-
-    /**
-     * query client subscription by topic
-     */
-    class ShowListenClientByTopicHandler implements HttpHandler {
-        @Override
-        public void handle(HttpExchange httpExchange) throws IOException {
-            String result = "";
-            OutputStream out = httpExchange.getResponseBody();
-            try {
-                String queryString = httpExchange.getRequestURI().getQuery();
-                Map<String, String> queryStringInfo = formData2Dic(queryString);
-                String topic = queryStringInfo.get(EventMeshConstants.MANAGE_TOPIC);
-
-                String newLine = System.getProperty("line.separator");
-                logger.info("showListeningClientByTopic,topic:{}=================", topic);
-                ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
-                ConcurrentHashMap<String, ClientGroupWrapper> clientGroupMap = clientSessionGroupMapping.getClientGroupMap();
-                if (!clientGroupMap.isEmpty()) {
-                    for (ClientGroupWrapper cgw : clientGroupMap.values()) {
-                        Set<Session> listenSessionSet = cgw.getTopic2sessionInGroupMapping().get(topic);
-                        if (listenSessionSet != null && listenSessionSet.size() > 0) {
-                            result += String.format("group:%s", cgw.getGroupName()) + newLine;
-                            for (Session session : listenSessionSet) {
-                                UserAgent userAgent = session.getClient();
-                                result += String.format("pid=%s | ip=%s | port=%s | path=%s | version=%s", userAgent.getPid(), userAgent
-                                        .getHost(), userAgent.getPort(), userAgent.getPath(), userAgent.getVersion()) + newLine;
-                            }
-                        }
-                    }
-                }
-                httpExchange.sendResponseHeaders(200, 0);
-                out.write(result.getBytes());
-            } catch (Exception e) {
-                logger.error("ShowListenClientByTopicHandler fail...", e);
-            } finally {
-                if (out != null) {
-                    try {
-                        out.close();
-                    } catch (IOException e) {
-                        logger.warn("out close failed...", e);
-                    }
-                }
-            }
-
-        }
-    }
-
-
-    /**
-     * remove all clients accessed by eventMesh
-     *
-     * @return
-     */
-    class RejectAllClientHandler implements HttpHandler {
-        @Override
-        public void handle(HttpExchange httpExchange) throws IOException {
-            String result = "";
-            OutputStream out = httpExchange.getResponseBody();
-            try {
-                ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
-                ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
-                final List<InetSocketAddress> successRemoteAddrs = new ArrayList<InetSocketAddress>();
-                try {
-                    logger.info("rejectAllClient in admin====================");
-                    if (!sessionMap.isEmpty()) {
-                        for (Map.Entry<InetSocketAddress, Session> entry : sessionMap.entrySet()) {
-                            InetSocketAddress addr = EventMeshTcp2Client.serverGoodby2Client(eventMeshTCPServer, entry.getValue(), clientSessionGroupMapping);
-                            if (addr != null) {
-                                successRemoteAddrs.add(addr);
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    logger.error("clientManage|rejectAllClient|fail", e);
-                    result = String.format("rejectAllClient fail! sessionMap size {%d}, had reject {%s}, errorMsg : %s",
-                            sessionMap.size(), printClients(successRemoteAddrs), e.getMessage());
-                    httpExchange.sendResponseHeaders(200, 0);
-                    out.write(result.getBytes());
-                    return;
-                }
-                result = String.format("rejectAllClient success! sessionMap size {%d}, had reject {%s}", sessionMap.size
-                        (), printClients(successRemoteAddrs));
-                httpExchange.sendResponseHeaders(200, 0);
-                out.write(result.getBytes());
-            } catch (Exception e) {
-                logger.error("rejectAllClient fail...", e);
-            } finally {
-                if (out != null) {
-                    try {
-                        out.close();
-                    } catch (IOException e) {
-                        logger.warn("out close failed...", e);
-                    }
-                }
-            }
-
-        }
-    }
-
-    /**
-     * remove c client by ip and port
-     *
-     * @return
-     */
-    class RejectClientByIpPortHandler implements HttpHandler {
-        @Override
-        public void handle(HttpExchange httpExchange) throws IOException {
-            String result = "";
-            OutputStream out = httpExchange.getResponseBody();
-            try {
-                String queryString = httpExchange.getRequestURI().getQuery();
-                Map<String, String> queryStringInfo = formData2Dic(queryString);
-                String ip = queryStringInfo.get(EventMeshConstants.MANAGE_IP);
-                String port = queryStringInfo.get(EventMeshConstants.MANAGE_PORT);
-
-                if (StringUtils.isBlank(ip) || StringUtils.isBlank(port)) {
-                    httpExchange.sendResponseHeaders(200, 0);
-                    result = "params illegal!";
-                    out.write(result.getBytes());
-                    return;
-                }
-                logger.info("rejectClientByIpPort in admin,ip:{},port:{}====================", ip, port);
-                ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
-                ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
-                final List<InetSocketAddress> successRemoteAddrs = new ArrayList<InetSocketAddress>();
-                try {
-                    if (!sessionMap.isEmpty()) {
-                        for (Map.Entry<InetSocketAddress, Session> entry : sessionMap.entrySet()) {
-                            if (entry.getKey().getHostString().equals(ip) && String.valueOf(entry.getKey().getPort()).equals(port)) {
-                                InetSocketAddress addr = EventMeshTcp2Client.serverGoodby2Client(eventMeshTCPServer, entry.getValue(), clientSessionGroupMapping);
-                                if (addr != null) {
-                                    successRemoteAddrs.add(addr);
-                                }
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    logger.error("clientManage|rejectClientByIpPort|fail|ip={}|port={},errMsg={}", ip, port, e);
-                    result = String.format("rejectClientByIpPort fail! {ip=%s port=%s}, had reject {%s}, errorMsg : %s", ip,
-                            port, printClients(successRemoteAddrs), e.getMessage());
-                    httpExchange.sendResponseHeaders(200, 0);
-                    out.write(result.getBytes());
-                    return;
-                }
-
-                result = String.format("rejectClientByIpPort success! {ip=%s port=%s}, had reject {%s}", ip, port, printClients
-                        (successRemoteAddrs));
-                httpExchange.sendResponseHeaders(200, 0);
-                out.write(result.getBytes());
-            } catch (Exception e) {
-                logger.error("rejectClientByIpPort fail...", e);
-            } finally {
-                if (out != null) {
-                    try {
-                        out.close();
-                    } catch (IOException e) {
-                        logger.warn("out close failed...", e);
-                    }
-                }
-            }
-
-        }
-    }
-
-
-    /**
-     * remove c client by dcn and susysId
-     *
-     * @return
-     */
-    class RejectClientBySubSystemHandler implements HttpHandler {
-        @Override
-        public void handle(HttpExchange httpExchange) throws IOException {
-            String result = "";
-            OutputStream out = httpExchange.getResponseBody();
-            try {
-                String queryString = httpExchange.getRequestURI().getQuery();
-                Map<String, String> queryStringInfo = formData2Dic(queryString);
-                String dcn = queryStringInfo.get(EventMeshConstants.MANAGE_DCN);
-                String subSystem = queryStringInfo.get(EventMeshConstants.MANAGE_SUBSYSTEM);
-
-                if (StringUtils.isBlank(dcn) || StringUtils.isBlank(subSystem)) {
-                    httpExchange.sendResponseHeaders(200, 0);
-                    result = "params illegal!";
-                    out.write(result.getBytes());
-                    return;
-                }
-
-                logger.info("rejectClientBySubSystem in admin,subsys:{},dcn:{}====================", subSystem, dcn);
-                ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
-                ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
-                final List<InetSocketAddress> successRemoteAddrs = new ArrayList<InetSocketAddress>();
-                try {
-                    if (!sessionMap.isEmpty()) {
-                        for (Session session : sessionMap.values()) {
-                            if (session.getClient().getDcn().equals(dcn) && session.getClient().getSubsystem().equals(subSystem)) {
-                                InetSocketAddress addr = EventMeshTcp2Client.serverGoodby2Client(eventMeshTCPServer, session, clientSessionGroupMapping);
-                                if (addr != null) {
-                                    successRemoteAddrs.add(addr);
-                                }
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    logger.error("clientManage|rejectClientBySubSystem|fail|dcn={}|subSystemId={},errMsg={}", dcn, subSystem, e);
-                    result = String.format("rejectClientBySubSystem fail! sessionMap size {%d}, had reject {%d} , {dcn=%s " +
-                                    "port=%s}, errorMsg : %s", sessionMap.size(), printClients(successRemoteAddrs), dcn,
-                            subSystem, e.getMessage());
-                    httpExchange.sendResponseHeaders(200, 0);
-                    out.write(result.getBytes());
-                    return;
-                }
-                result = String.format("rejectClientBySubSystem success! sessionMap size {%d}, had reject {%s} , {dcn=%s " +
-                        "port=%s}", sessionMap.size(), printClients(successRemoteAddrs), dcn, subSystem);
-                httpExchange.sendResponseHeaders(200, 0);
-                out.write(result.getBytes());
-            } catch (Exception e) {
-                logger.error("rejectClientBySubSystem fail...", e);
-            } finally {
-                if (out != null) {
-                    try {
-                        out.close();
-                    } catch (IOException e) {
-                        logger.warn("out close failed...", e);
-                    }
-                }
-            }
-
-        }
-    }
-
-    /**
-     * redirect subsystem for subsys and dcn
-     *
-     * @return
-     */
-    class RedirectClientBySubSystemHandler implements HttpHandler {
-        @Override
-        public void handle(HttpExchange httpExchange) throws IOException {
-            String result = "";
-            OutputStream out = httpExchange.getResponseBody();
-            try {
-                String queryString = httpExchange.getRequestURI().getQuery();
-                Map<String, String> queryStringInfo = formData2Dic(queryString);
-                String dcn = queryStringInfo.get(EventMeshConstants.MANAGE_DCN);
-                String subSystem = queryStringInfo.get(EventMeshConstants.MANAGE_SUBSYSTEM);
-                String destEventMeshIp = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_IP);
-                String destEventMeshPort = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_PORT);
-
-                if (StringUtils.isBlank(dcn) || !StringUtils.isNumeric(subSystem)
-                        || StringUtils.isBlank(destEventMeshIp) || StringUtils.isBlank(destEventMeshPort)
-                        || !StringUtils.isNumeric(destEventMeshPort)) {
-                    httpExchange.sendResponseHeaders(200, 0);
-                    result = "params illegal!";
-                    out.write(result.getBytes());
-                    return;
-                }
-                logger.info("redirectClientBySubSystem in admin,subsys:{},dcn:{},destIp:{},destPort:{}====================", subSystem, dcn, destEventMeshIp, destEventMeshPort);
-                ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
-                ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
-                String redirectResult = "";
-                try {
-                    if (!sessionMap.isEmpty()) {
-                        for (Session session : sessionMap.values()) {
-                            if (session.getClient().getDcn().equals(dcn) && session.getClient().getSubsystem().equals(subSystem)) {
-                                redirectResult += "|";
-                                redirectResult += EventMeshTcp2Client.redirectClient2NewEventMesh(eventMeshTCPServer, destEventMeshIp, Integer.parseInt(destEventMeshPort),
-                                        session, clientSessionGroupMapping);
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    logger.error("clientManage|redirectClientBySubSystem|fail|dcn={}|subSystem={}|destEventMeshIp" +
-                            "={}|destEventMeshPort={},errMsg={}", dcn, subSystem, destEventMeshIp, destEventMeshPort, e);
-                    result = String.format("redirectClientBySubSystem fail! sessionMap size {%d}, {clientIp=%s clientPort=%s " +
-                                    "destEventMeshIp=%s destEventMeshPort=%s}, result {%s}, errorMsg : %s",
-                            sessionMap.size(), dcn, subSystem, destEventMeshIp, destEventMeshPort, redirectResult, e
-                                    .getMessage());
-                    httpExchange.sendResponseHeaders(200, 0);
-                    out.write(result.getBytes());
-                    return;
-                }
-                result = String.format("redirectClientBySubSystem success! sessionMap size {%d}, {dcn=%s subSystem=%s " +
-                                "destEventMeshIp=%s destEventMeshPort=%s}, result {%s} ",
-                        sessionMap.size(), dcn, subSystem, destEventMeshIp, destEventMeshPort, redirectResult);
-                httpExchange.sendResponseHeaders(200, 0);
-                out.write(result.getBytes());
-            } catch (Exception e) {
-                logger.error("redirectClientBySubSystem fail...", e);
-            } finally {
-                if (out != null) {
-                    try {
-                        out.close();
-                    } catch (IOException e) {
-                        logger.warn("out close failed...", e);
-                    }
-                }
-            }
-
-        }
-    }
-
-    /**
-     * redirect subsystem for path
-     *
-     * @return
-     */
-    class RedirectClientByPathHandler implements HttpHandler {
-        @Override
-        public void handle(HttpExchange httpExchange) throws IOException {
-            String result = "";
-            OutputStream out = httpExchange.getResponseBody();
-            try {
-                String queryString = httpExchange.getRequestURI().getQuery();
-                Map<String, String> queryStringInfo = formData2Dic(queryString);
-                String path = queryStringInfo.get(EventMeshConstants.MANAGE_PATH);
-                String destEventMeshIp = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_IP);
-                String destEventMeshPort = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_PORT);
-
-                if (StringUtils.isBlank(path) || StringUtils.isBlank(destEventMeshIp) || StringUtils.isBlank(destEventMeshPort) ||
-                        !StringUtils.isNumeric(destEventMeshPort)) {
-                    httpExchange.sendResponseHeaders(200, 0);
-                    result = "params illegal!";
-                    out.write(result.getBytes());
-                    return;
-                }
-                logger.info("redirectClientByPath in admin,path:{},destIp:{},destPort:{}====================", path, destEventMeshIp, destEventMeshPort);
-                ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
-                ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
-                String redirectResult = "";
-                try {
-                    if (!sessionMap.isEmpty()) {
-                        for (Session session : sessionMap.values()) {
-                            if (session.getClient().getPath().contains(path)) {
-                                redirectResult += "|";
-                                redirectResult += EventMeshTcp2Client.redirectClient2NewEventMesh(eventMeshTCPServer, destEventMeshIp, Integer.parseInt(destEventMeshPort),
-                                        session, clientSessionGroupMapping);
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    logger.error("clientManage|redirectClientByPath|fail|path={}|destEventMeshIp" +
-                            "={}|destEventMeshPort={},errMsg={}", path, destEventMeshIp, destEventMeshPort, e);
-                    result = String.format("redirectClientByPath fail! sessionMap size {%d}, {path=%s " +
-                                    "destEventMeshIp=%s destEventMeshPort=%s}, result {%s}, errorMsg : %s",
-                            sessionMap.size(), path, destEventMeshIp, destEventMeshPort, redirectResult, e
-                                    .getMessage());
-                    httpExchange.sendResponseHeaders(200, 0);
-                    out.write(result.getBytes());
-                    return;
-                }
-                result = String.format("redirectClientByPath success! sessionMap size {%d}, {path=%s " +
-                                "destEventMeshIp=%s destEventMeshPort=%s}, result {%s} ",
-                        sessionMap.size(), path, destEventMeshIp, destEventMeshPort, redirectResult);
-                httpExchange.sendResponseHeaders(200, 0);
-                out.write(result.getBytes());
-            } catch (Exception e) {
-                logger.error("redirectClientByPath fail...", e);
-            } finally {
-                if (out != null) {
-                    try {
-                        out.close();
-                    } catch (IOException e) {
-                        logger.warn("out close failed...", e);
-                    }
-                }
-            }
-
-        }
-    }
-
-    /**
-     * redirect subsystem for ip and port
-     *
-     * @return
-     */
-    class RedirectClientByIpPortHandler implements HttpHandler {
-        @Override
-        public void handle(HttpExchange httpExchange) throws IOException {
-            String result = "";
-            OutputStream out = httpExchange.getResponseBody();
-            try {
-                String queryString = httpExchange.getRequestURI().getQuery();
-                Map<String, String> queryStringInfo = formData2Dic(queryString);
-                String ip = queryStringInfo.get(EventMeshConstants.MANAGE_IP);
-                String port = queryStringInfo.get(EventMeshConstants.MANAGE_PORT);
-                String destEventMeshIp = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_IP);
-                String destEventMeshPort = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_PORT);
-
-                if (StringUtils.isBlank(ip) || !StringUtils.isNumeric(port)
-                        || StringUtils.isBlank(destEventMeshIp) || StringUtils.isBlank(destEventMeshPort)
-                        || !StringUtils.isNumeric(destEventMeshPort)) {
-                    httpExchange.sendResponseHeaders(200, 0);
-                    result = "params illegal!";
-                    out.write(result.getBytes());
-                    return;
-                }
-                logger.info("redirectClientByIpPort in admin,ip:{},port:{},destIp:{},destPort:{}====================", ip, port, destEventMeshIp, destEventMeshPort);
-                ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
-                ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
-                String redirectResult = "";
-                try {
-                    if (!sessionMap.isEmpty()) {
-                        for (Session session : sessionMap.values()) {
-                            if (session.getClient().getHost().equals(ip) && String.valueOf(session.getClient().getPort()).equals(port)) {
-                                redirectResult += "|";
-                                redirectResult += EventMeshTcp2Client.redirectClient2NewEventMesh(eventMeshTCPServer, destEventMeshIp, Integer.parseInt(destEventMeshPort),
-                                        session, clientSessionGroupMapping);
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    logger.error("clientManage|redirectClientByIpPort|fail|ip={}|port={}|destEventMeshIp" +
-                            "={}|destEventMeshPort={},errMsg={}", ip, port, destEventMeshIp, destEventMeshPort, e);
-                    result = String.format("redirectClientByIpPort fail! sessionMap size {%d}, {clientIp=%s clientPort=%s " +
-                                    "destEventMeshIp=%s destEventMeshPort=%s}, result {%s}, errorMsg : %s",
-                            sessionMap.size(), ip, port, destEventMeshIp, destEventMeshPort, redirectResult, e
-                                    .getMessage());
-                    httpExchange.sendResponseHeaders(200, 0);
-                    out.write(result.getBytes());
-                    return;
-                }
-                result = String.format("redirectClientByIpPort success! sessionMap size {%d}, {ip=%s port=%s " +
-                                "destEventMeshIp=%s destEventMeshPort=%s}, result {%s} ",
-                        sessionMap.size(), ip, port, destEventMeshIp, destEventMeshPort, redirectResult);
-                httpExchange.sendResponseHeaders(200, 0);
-                out.write(result.getBytes());
-            } catch (Exception e) {
-                logger.error("redirectClientByIpPort fail...", e);
-            } finally {
-                if (out != null) {
-                    try {
-                        out.close();
-                    } catch (IOException e) {
-                        logger.warn("out close failed...", e);
-                    }
-                }
-            }
-
-        }
-    }
-
-    private String printClients(List<InetSocketAddress> clients) {
-        if (clients.isEmpty()) {
-            return "no session had been closed";
-        }
-        StringBuilder sb = new StringBuilder();
-        for (InetSocketAddress addr : clients) {
-            sb.append(addr).append("|");
-        }
-        return sb.toString();
-    }
-
-    private Map<String, String> formData2Dic(String formData) {
-        Map<String, String> result = new HashMap<>();
-        if (formData == null || formData.trim().length() == 0) {
-            return result;
-        }
-        final String[] items = formData.split("&");
-        Arrays.stream(items).forEach(item -> {
-            final String[] keyAndVal = item.split("=");
-            if (keyAndVal.length == 2) {
-                try {
-                    final String key = URLDecoder.decode(keyAndVal[0], "utf8");
-                    final String val = URLDecoder.decode(keyAndVal[1], "utf8");
-                    result.put(key, val);
-                } catch (UnsupportedEncodingException e) {
-                    logger.warn("formData2Dic:param decode failed...", e);
-                }
-            }
-        });
-        return result;
-    }
-
-    class EventMeshMsgDownStreamHandler implements HttpHandler {
-        @Override
-        public void handle(HttpExchange httpExchange) throws IOException {
-            String result = "false";
-            OutputStream out = httpExchange.getResponseBody();
-            try {
-//                Map<String, Object> queryStringInfo =  parsePostParameters(httpExchange);
-//                String msgStr = (String)queryStringInfo.get("msg");
-//                String groupName = (String)queryStringInfo.get("group");
-//                logger.info("recieve msg from other eventMesh, group:{}, msg:{}", groupName, msgStr);
-//                if (StringUtils.isBlank(msgStr) || StringUtils.isBlank(groupName)) {
-//                    logger.warn("msg or groupName is null");
-//                    httpExchange.sendResponseHeaders(200, 0);
-//                    out.write(result.getBytes());
-//                    return;
-//                }
-//                MessageExt messageExt = JSON.parseObject(msgStr, MessageExt.class);
-//                String topic = messageExt.getTopic();
-//
-//                if (!EventMeshUtil.isValidRMBTopic(topic)) {
-//                    logger.warn("msg topic is illegal");
-//                    httpExchange.sendResponseHeaders(200, 0);
-//                    out.write(result.getBytes());
-//                    return;
-//                }
-//
-//                DownstreamDispatchStrategy downstreamDispatchStrategy = eventMeshTCPServer.getClientSessionGroupMapping().getClientGroupWrapper(groupName).getDownstreamDispatchStrategy();
-//                Set<Session> groupConsumerSessions = eventMeshTCPServer.getClientSessionGroupMapping().getClientGroupWrapper(groupName).getGroupConsumerSessions();
-//                Session session = downstreamDispatchStrategy.select(groupName, topic, groupConsumerSessions);
-//
-//                if(session == null){
-//                    logger.error("DownStream msg,retry other eventMesh found no session again");
-//                    httpExchange.sendResponseHeaders(200, 0);
-//                    out.write(result.getBytes());
-//                    return;
-//                }
-//
-//                DownStreamMsgContext downStreamMsgContext =
-//                        new DownStreamMsgContext(messageExt, session, eventMeshTCPServer.getClientSessionGroupMapping().getClientGroupWrapper(groupName).getPersistentMsgConsumer(), null, true);
-//                eventMeshTCPServer.getClientSessionGroupMapping().getClientGroupWrapper(groupName).getDownstreamMap().putIfAbsent(downStreamMsgContext.seq, downStreamMsgContext);
-//
-//                if (session.isCanDownStream()) {
-//                    session.downstreamMsg(downStreamMsgContext);
-//                    httpExchange.sendResponseHeaders(200, 0);
-//                    result = "true";
-//                    out.write(result.getBytes());
-//                    return;
-//                }
-//
-//                logger.warn("EventMeshMsgDownStreamHandler|dispatch retry, seq[{}]", downStreamMsgContext.seq);
-//                long delayTime = EventMeshUtil.isService(downStreamMsgContext.msgExt.getTopic()) ? 0 : eventMeshTCPServer.getAccessConfiguration().eventMeshTcpMsgRetryDelayInMills;
-//                downStreamMsgContext.delay(delayTime);
-//                eventMeshTCPServer.getEventMeshTcpRetryer().pushRetry(downStreamMsgContext);
-//                result = "true";
-//                httpExchange.sendResponseHeaders(200, 0);
-//                out.write(result.getBytes());
-
-            } catch (Exception e) {
-                logger.error("EventMeshMsgDownStreamHandler handle fail...", e);
-            } finally {
-                if (out != null) {
-                    try {
-                        out.close();
-                    } catch (IOException e) {
-                        logger.warn("out close failed...", e);
-                    }
-                }
-            }
-
-        }
-    }
 }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientByIpPortHandler.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientByIpPortHandler.java
new file mode 100644
index 0000000..79ba4bd
--- /dev/null
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientByIpPortHandler.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.runtime.admin.handler;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
+import org.apache.eventmesh.runtime.constants.EventMeshConstants;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.EventMeshTcp2Client;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientSessionGroupMapping;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
+import org.apache.eventmesh.runtime.util.NetUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class RedirectClientByIpPortHandler implements HttpHandler {
+
+    private static final Logger logger = LoggerFactory.getLogger(RedirectClientByIpPortHandler.class);
+
+    private final EventMeshTCPServer eventMeshTCPServer;
+
+    public RedirectClientByIpPortHandler(EventMeshTCPServer eventMeshTCPServer) {
+        this.eventMeshTCPServer = eventMeshTCPServer;
+    }
+
+    @Override
+    public void handle(HttpExchange httpExchange) throws IOException {
+        String result = "";
+        OutputStream out = httpExchange.getResponseBody();
+        try {
+            String queryString = httpExchange.getRequestURI().getQuery();
+            Map<String, String> queryStringInfo = NetUtils.formData2Dic(queryString);
+            String ip = queryStringInfo.get(EventMeshConstants.MANAGE_IP);
+            String port = queryStringInfo.get(EventMeshConstants.MANAGE_PORT);
+            String destEventMeshIp = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_IP);
+            String destEventMeshPort = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_PORT);
+
+            if (StringUtils.isBlank(ip) || !StringUtils.isNumeric(port)
+                    || StringUtils.isBlank(destEventMeshIp) || StringUtils.isBlank(destEventMeshPort)
+                    || !StringUtils.isNumeric(destEventMeshPort)) {
+                httpExchange.sendResponseHeaders(200, 0);
+                result = "params illegal!";
+                out.write(result.getBytes());
+                return;
+            }
+            logger.info("redirectClientByIpPort in admin,ip:{},port:{},destIp:{},destPort:{}====================", ip, port, destEventMeshIp, destEventMeshPort);
+            ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
+            ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
+            String redirectResult = "";
+            try {
+                if (!sessionMap.isEmpty()) {
+                    for (Session session : sessionMap.values()) {
+                        if (session.getClient().getHost().equals(ip) && String.valueOf(session.getClient().getPort()).equals(port)) {
+                            redirectResult += "|";
+                            redirectResult += EventMeshTcp2Client.redirectClient2NewEventMesh(eventMeshTCPServer, destEventMeshIp, Integer.parseInt(destEventMeshPort),
+                                    session, clientSessionGroupMapping);
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                logger.error("clientManage|redirectClientByIpPort|fail|ip={}|port={}|destEventMeshIp" +
+                        "={}|destEventMeshPort={},errMsg={}", ip, port, destEventMeshIp, destEventMeshPort, e);
+                result = String.format("redirectClientByIpPort fail! sessionMap size {%d}, {clientIp=%s clientPort=%s " +
+                                "destEventMeshIp=%s destEventMeshPort=%s}, result {%s}, errorMsg : %s",
+                        sessionMap.size(), ip, port, destEventMeshIp, destEventMeshPort, redirectResult, e
+                                .getMessage());
+                httpExchange.sendResponseHeaders(200, 0);
+                out.write(result.getBytes());
+                return;
+            }
+            result = String.format("redirectClientByIpPort success! sessionMap size {%d}, {ip=%s port=%s " +
+                            "destEventMeshIp=%s destEventMeshPort=%s}, result {%s} ",
+                    sessionMap.size(), ip, port, destEventMeshIp, destEventMeshPort, redirectResult);
+            httpExchange.sendResponseHeaders(200, 0);
+            out.write(result.getBytes());
+        } catch (Exception e) {
+            logger.error("redirectClientByIpPort fail...", e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    logger.warn("out close failed...", e);
+                }
+            }
+        }
+
+    }
+}
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientByPathHandler.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientByPathHandler.java
new file mode 100644
index 0000000..b605a1c
--- /dev/null
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientByPathHandler.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.runtime.admin.handler;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
+import org.apache.eventmesh.runtime.constants.EventMeshConstants;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.EventMeshTcp2Client;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientSessionGroupMapping;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
+import org.apache.eventmesh.runtime.util.NetUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * redirect subsystem for path
+ */
+public class RedirectClientByPathHandler implements HttpHandler {
+
+    private static final Logger logger = LoggerFactory.getLogger(RedirectClientByPathHandler.class);
+
+    private EventMeshTCPServer eventMeshTCPServer;
+
+    public RedirectClientByPathHandler(EventMeshTCPServer eventMeshTCPServer) {
+        this.eventMeshTCPServer = eventMeshTCPServer;
+    }
+
+    @Override
+    public void handle(HttpExchange httpExchange) throws IOException {
+        String result = "";
+        OutputStream out = httpExchange.getResponseBody();
+        try {
+            String queryString = httpExchange.getRequestURI().getQuery();
+            Map<String, String> queryStringInfo = NetUtils.formData2Dic(queryString);
+            String path = queryStringInfo.get(EventMeshConstants.MANAGE_PATH);
+            String destEventMeshIp = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_IP);
+            String destEventMeshPort = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_PORT);
+
+            if (StringUtils.isBlank(path) || StringUtils.isBlank(destEventMeshIp) || StringUtils.isBlank(destEventMeshPort) ||
+                    !StringUtils.isNumeric(destEventMeshPort)) {
+                httpExchange.sendResponseHeaders(200, 0);
+                result = "params illegal!";
+                out.write(result.getBytes());
+                return;
+            }
+            logger.info("redirectClientByPath in admin,path:{},destIp:{},destPort:{}====================", path, destEventMeshIp, destEventMeshPort);
+            ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
+            ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
+            String redirectResult = "";
+            try {
+                if (!sessionMap.isEmpty()) {
+                    for (Session session : sessionMap.values()) {
+                        if (session.getClient().getPath().contains(path)) {
+                            redirectResult += "|";
+                            redirectResult += EventMeshTcp2Client.redirectClient2NewEventMesh(eventMeshTCPServer, destEventMeshIp, Integer.parseInt(destEventMeshPort),
+                                    session, clientSessionGroupMapping);
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                logger.error("clientManage|redirectClientByPath|fail|path={}|destEventMeshIp" +
+                        "={}|destEventMeshPort={},errMsg={}", path, destEventMeshIp, destEventMeshPort, e);
+                result = String.format("redirectClientByPath fail! sessionMap size {%d}, {path=%s " +
+                                "destEventMeshIp=%s destEventMeshPort=%s}, result {%s}, errorMsg : %s",
+                        sessionMap.size(), path, destEventMeshIp, destEventMeshPort, redirectResult, e
+                                .getMessage());
+                httpExchange.sendResponseHeaders(200, 0);
+                out.write(result.getBytes());
+                return;
+            }
+            result = String.format("redirectClientByPath success! sessionMap size {%d}, {path=%s " +
+                            "destEventMeshIp=%s destEventMeshPort=%s}, result {%s} ",
+                    sessionMap.size(), path, destEventMeshIp, destEventMeshPort, redirectResult);
+            httpExchange.sendResponseHeaders(200, 0);
+            out.write(result.getBytes());
+        } catch (Exception e) {
+            logger.error("redirectClientByPath fail...", e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    logger.warn("out close failed...", e);
+                }
+            }
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientBySubSystemHandler.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientBySubSystemHandler.java
new file mode 100644
index 0000000..400c8c0
--- /dev/null
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientBySubSystemHandler.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.runtime.admin.handler;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
+import org.apache.eventmesh.runtime.constants.EventMeshConstants;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.EventMeshTcp2Client;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientSessionGroupMapping;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
+import org.apache.eventmesh.runtime.util.NetUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * redirect subsystem for subsys and dcn
+ */
+public class RedirectClientBySubSystemHandler implements HttpHandler {
+
+    private static final Logger logger = LoggerFactory.getLogger(RedirectClientBySubSystemHandler.class);
+
+    private final EventMeshTCPServer eventMeshTCPServer;
+
+    public RedirectClientBySubSystemHandler(EventMeshTCPServer eventMeshTCPServer) {
+        this.eventMeshTCPServer = eventMeshTCPServer;
+    }
+
+    @Override
+    public void handle(HttpExchange httpExchange) throws IOException {
+        String result = "";
+        OutputStream out = httpExchange.getResponseBody();
+        try {
+            String queryString = httpExchange.getRequestURI().getQuery();
+            Map<String, String> queryStringInfo = NetUtils.formData2Dic(queryString);
+            String subSystem = queryStringInfo.get(EventMeshConstants.MANAGE_SUBSYSTEM);
+            String destEventMeshIp = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_IP);
+            String destEventMeshPort = queryStringInfo.get(EventMeshConstants.MANAGE_DEST_PORT);
+
+            if (!StringUtils.isNumeric(subSystem)
+                    || StringUtils.isBlank(destEventMeshIp) || StringUtils.isBlank(destEventMeshPort)
+                    || !StringUtils.isNumeric(destEventMeshPort)) {
+                httpExchange.sendResponseHeaders(200, 0);
+                result = "params illegal!";
+                out.write(result.getBytes());
+                return;
+            }
+            logger.info("redirectClientBySubSystem in admin,subsys:{},destIp:{},destPort:{}====================", subSystem, destEventMeshIp, destEventMeshPort);
+            ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
+            ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
+            String redirectResult = "";
+            try {
+                if (!sessionMap.isEmpty()) {
+                    for (Session session : sessionMap.values()) {
+                        if (session.getClient().getSubsystem().equals(subSystem)) {
+                            redirectResult += "|";
+                            redirectResult += EventMeshTcp2Client.redirectClient2NewEventMesh(eventMeshTCPServer, destEventMeshIp, Integer.parseInt(destEventMeshPort),
+                                    session, clientSessionGroupMapping);
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                logger.error("clientManage|redirectClientBySubSystem|fail|subSystem={}|destEventMeshIp" +
+                        "={}|destEventMeshPort={},errMsg={}", subSystem, destEventMeshIp, destEventMeshPort, e);
+                result = String.format("redirectClientBySubSystem fail! sessionMap size {%d}, {subSystem=%s " +
+                                "destEventMeshIp=%s destEventMeshPort=%s}, result {%s}, errorMsg : %s",
+                        sessionMap.size(), subSystem, destEventMeshIp, destEventMeshPort, redirectResult, e
+                                .getMessage());
+                httpExchange.sendResponseHeaders(200, 0);
+                out.write(result.getBytes());
+                return;
+            }
+            result = String.format("redirectClientBySubSystem success! sessionMap size {%d}, {subSystem=%s " +
+                            "destEventMeshIp=%s destEventMeshPort=%s}, result {%s} ",
+                    sessionMap.size(), subSystem, destEventMeshIp, destEventMeshPort, redirectResult);
+            httpExchange.sendResponseHeaders(200, 0);
+            out.write(result.getBytes());
+        } catch (Exception e) {
+            logger.error("redirectClientBySubSystem fail...", e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    logger.warn("out close failed...", e);
+                }
+            }
+        }
+    }
+}
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectAllClientHandler.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectAllClientHandler.java
new file mode 100644
index 0000000..6314c48
--- /dev/null
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectAllClientHandler.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.runtime.admin.handler;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.EventMeshTcp2Client;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientSessionGroupMapping;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
+import org.apache.eventmesh.runtime.util.NetUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class RejectAllClientHandler implements HttpHandler {
+
+    private static final Logger logger = LoggerFactory.getLogger(RejectAllClientHandler.class);
+
+    private final EventMeshTCPServer eventMeshTCPServer;
+
+    public RejectAllClientHandler(EventMeshTCPServer eventMeshTCPServer) {
+        this.eventMeshTCPServer = eventMeshTCPServer;
+    }
+
+    /**
+     * remove all clients accessed by eventMesh
+     *
+     * @param httpExchange
+     * @throws IOException
+     */
+    @Override
+    public void handle(HttpExchange httpExchange) throws IOException {
+        String result = "";
+        OutputStream out = httpExchange.getResponseBody();
+        try {
+            ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
+            ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
+            final List<InetSocketAddress> successRemoteAddrs = new ArrayList<>();
+            try {
+                logger.info("rejectAllClient in admin====================");
+                if (!sessionMap.isEmpty()) {
+                    for (Map.Entry<InetSocketAddress, Session> entry : sessionMap.entrySet()) {
+                        InetSocketAddress addr = EventMeshTcp2Client.serverGoodby2Client(eventMeshTCPServer, entry.getValue(), clientSessionGroupMapping);
+                        if (addr != null) {
+                            successRemoteAddrs.add(addr);
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                logger.error("clientManage|rejectAllClient|fail", e);
+                result = String.format("rejectAllClient fail! sessionMap size {%d}, had reject {%s}, errorMsg : %s",
+                        sessionMap.size(), NetUtils.addressToString(successRemoteAddrs), e.getMessage());
+                httpExchange.sendResponseHeaders(200, 0);
+                out.write(result.getBytes());
+                return;
+            }
+            result = String.format("rejectAllClient success! sessionMap size {%d}, had reject {%s}", sessionMap.size(),
+                    NetUtils.addressToString(successRemoteAddrs));
+            httpExchange.sendResponseHeaders(200, 0);
+            out.write(result.getBytes());
+        } catch (Exception e) {
+            logger.error("rejectAllClient fail...", e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    logger.warn("out close failed...", e);
+                }
+            }
+        }
+    }
+}
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectClientByIpPortHandler.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectClientByIpPortHandler.java
new file mode 100644
index 0000000..3ddd45e
--- /dev/null
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectClientByIpPortHandler.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.runtime.admin.handler;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
+import org.apache.eventmesh.runtime.constants.EventMeshConstants;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.EventMeshTcp2Client;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientSessionGroupMapping;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
+import org.apache.eventmesh.runtime.util.NetUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class RejectClientByIpPortHandler implements HttpHandler {
+
+    private static final Logger logger = LoggerFactory.getLogger(RejectClientByIpPortHandler.class);
+
+    private EventMeshTCPServer eventMeshTCPServer;
+
+    public RejectClientByIpPortHandler(EventMeshTCPServer eventMeshTCPServer) {
+        this.eventMeshTCPServer = eventMeshTCPServer;
+    }
+
+    @Override
+    public void handle(HttpExchange httpExchange) throws IOException {
+        String result = "";
+        OutputStream out = httpExchange.getResponseBody();
+        try {
+            String queryString = httpExchange.getRequestURI().getQuery();
+            Map<String, String> queryStringInfo = NetUtils.formData2Dic(queryString);
+            String ip = queryStringInfo.get(EventMeshConstants.MANAGE_IP);
+            String port = queryStringInfo.get(EventMeshConstants.MANAGE_PORT);
+
+            if (StringUtils.isBlank(ip) || StringUtils.isBlank(port)) {
+                httpExchange.sendResponseHeaders(200, 0);
+                result = "params illegal!";
+                out.write(result.getBytes());
+                return;
+            }
+            logger.info("rejectClientByIpPort in admin,ip:{},port:{}====================", ip, port);
+            ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
+            ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
+            final List<InetSocketAddress> successRemoteAddrs = new ArrayList<InetSocketAddress>();
+            try {
+                if (!sessionMap.isEmpty()) {
+                    for (Map.Entry<InetSocketAddress, Session> entry : sessionMap.entrySet()) {
+                        if (entry.getKey().getHostString().equals(ip) && String.valueOf(entry.getKey().getPort()).equals(port)) {
+                            InetSocketAddress addr = EventMeshTcp2Client.serverGoodby2Client(eventMeshTCPServer, entry.getValue(), clientSessionGroupMapping);
+                            if (addr != null) {
+                                successRemoteAddrs.add(addr);
+                            }
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                logger.error("clientManage|rejectClientByIpPort|fail|ip={}|port={},errMsg={}", ip, port, e);
+                result = String.format("rejectClientByIpPort fail! {ip=%s port=%s}, had reject {%s}, errorMsg : %s", ip,
+                        port, NetUtils.addressToString(successRemoteAddrs), e.getMessage());
+                httpExchange.sendResponseHeaders(200, 0);
+                out.write(result.getBytes());
+                return;
+            }
+
+            result = String.format("rejectClientByIpPort success! {ip=%s port=%s}, had reject {%s}", ip, port,
+                    NetUtils.addressToString(successRemoteAddrs));
+            httpExchange.sendResponseHeaders(200, 0);
+            out.write(result.getBytes());
+        } catch (Exception e) {
+            logger.error("rejectClientByIpPort fail...", e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    logger.warn("out close failed...", e);
+                }
+            }
+        }
+
+    }
+}
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectClientBySubSystemHandler.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectClientBySubSystemHandler.java
new file mode 100644
index 0000000..e5208c6
--- /dev/null
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectClientBySubSystemHandler.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.runtime.admin.handler;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
+import org.apache.eventmesh.runtime.constants.EventMeshConstants;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.EventMeshTcp2Client;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientSessionGroupMapping;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
+import org.apache.eventmesh.runtime.util.NetUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class RejectClientBySubSystemHandler implements HttpHandler {
+
+    private static final Logger logger = LoggerFactory.getLogger(RejectClientBySubSystemHandler.class);
+
+    private EventMeshTCPServer eventMeshTCPServer;
+
+    public RejectClientBySubSystemHandler(EventMeshTCPServer eventMeshTCPServer) {
+        this.eventMeshTCPServer = eventMeshTCPServer;
+    }
+
+    private String printClients(List<InetSocketAddress> clients) {
+        if (clients.isEmpty()) {
+            return "no session had been closed";
+        }
+        StringBuilder sb = new StringBuilder();
+        for (InetSocketAddress addr : clients) {
+            sb.append(addr).append("|");
+        }
+        return sb.toString();
+    }
+
+    /**
+     * remove c client by dcn and susysId
+     * @param httpExchange
+     * @throws IOException
+     */
+    @Override
+    public void handle(HttpExchange httpExchange) throws IOException {
+        String result = "";
+        OutputStream out = httpExchange.getResponseBody();
+        try {
+            String queryString = httpExchange.getRequestURI().getQuery();
+            Map<String, String> queryStringInfo = NetUtils.formData2Dic(queryString);
+            String subSystem = queryStringInfo.get(EventMeshConstants.MANAGE_SUBSYSTEM);
+
+            if (StringUtils.isBlank(subSystem)) {
+                httpExchange.sendResponseHeaders(200, 0);
+                result = "params illegal!";
+                out.write(result.getBytes());
+                return;
+            }
+
+            logger.info("rejectClientBySubSystem in admin,subsys:{}====================", subSystem);
+            ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
+            ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
+            final List<InetSocketAddress> successRemoteAddrs = new ArrayList<InetSocketAddress>();
+            try {
+                if (!sessionMap.isEmpty()) {
+                    for (Session session : sessionMap.values()) {
+                        if (session.getClient().getSubsystem().equals(subSystem)) {
+                            InetSocketAddress addr = EventMeshTcp2Client.serverGoodby2Client(eventMeshTCPServer, session, clientSessionGroupMapping);
+                            if (addr != null) {
+                                successRemoteAddrs.add(addr);
+                            }
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                logger.error("clientManage|rejectClientBySubSystem|fail|subSystemId={},errMsg={}", subSystem, e);
+                result = String.format("rejectClientBySubSystem fail! sessionMap size {%d}, had reject {%d} , {" +
+                        "subSystemId=%s}, errorMsg : %s", sessionMap.size(), printClients(successRemoteAddrs), subSystem, e.getMessage());
+                httpExchange.sendResponseHeaders(200, 0);
+                out.write(result.getBytes());
+                return;
+            }
+            result = String.format("rejectClientBySubSystem success! sessionMap size {%d}, had reject {%s} , {" +
+                    "subSystemId=%s}", sessionMap.size(), printClients(successRemoteAddrs), subSystem);
+            httpExchange.sendResponseHeaders(200, 0);
+            out.write(result.getBytes());
+        } catch (Exception e) {
+            logger.error("rejectClientBySubSystem fail...", e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    logger.warn("out close failed...", e);
+                }
+            }
+        }
+
+    }
+}
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowClientBySystemHandler.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowClientBySystemHandler.java
new file mode 100644
index 0000000..07cbbb2
--- /dev/null
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowClientBySystemHandler.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.runtime.admin.handler;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import org.apache.eventmesh.common.protocol.tcp.UserAgent;
+import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
+import org.apache.eventmesh.runtime.constants.EventMeshConstants;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientSessionGroupMapping;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
+import org.apache.eventmesh.runtime.util.NetUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ShowClientBySystemHandler implements HttpHandler {
+
+    private static final Logger logger = LoggerFactory.getLogger(ShowClientBySystemHandler.class);
+
+    private final EventMeshTCPServer eventMeshTCPServer;
+
+    public ShowClientBySystemHandler(EventMeshTCPServer eventMeshTCPServer) {
+        this.eventMeshTCPServer = eventMeshTCPServer;
+    }
+
+    /**
+     * print clientInfo by subsys
+     *
+     * @param httpExchange
+     * @throws IOException
+     */
+    @Override
+    public void handle(HttpExchange httpExchange) throws IOException {
+        String result = "";
+        OutputStream out = httpExchange.getResponseBody();
+        try {
+            String queryString = httpExchange.getRequestURI().getQuery();
+            Map<String, String> queryStringInfo = NetUtils.formData2Dic(queryString);
+            String subSystem = queryStringInfo.get(EventMeshConstants.MANAGE_SUBSYSTEM);
+
+            String newLine = System.getProperty("line.separator");
+            logger.info("showClientBySubsys,subsys:{}=================", subSystem);
+            ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
+            ConcurrentHashMap<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
+            if (!sessionMap.isEmpty()) {
+                for (Session session : sessionMap.values()) {
+                    if (session.getClient().getSubsystem().equals(subSystem)) {
+                        UserAgent userAgent = session.getClient();
+                        result += String.format("pid=%s | ip=%s | port=%s | path=%s | purpose=%s", userAgent.getPid(), userAgent
+                                .getHost(), userAgent.getPort(), userAgent.getPath(), userAgent.getPurpose()) + newLine;
+                    }
+                }
+            }
+            httpExchange.sendResponseHeaders(200, 0);
+            out.write(result.getBytes());
+        } catch (Exception e) {
+            logger.error("ShowClientBySystemAndHandler fail...", e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    logger.warn("out close failed...", e);
+                }
+            }
+        }
+    }
+
+
+}
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowClientHandler.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowClientHandler.java
new file mode 100644
index 0000000..64d5c5d
--- /dev/null
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowClientHandler.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.runtime.admin.handler;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientSessionGroupMapping;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * This handler used to print the total client info
+ */
+public class ShowClientHandler implements HttpHandler {
+
+    private static final Logger logger = LoggerFactory.getLogger(ShowClientHandler.class);
+
+    private final EventMeshTCPServer eventMeshTCPServer;
+
+    public ShowClientHandler(EventMeshTCPServer eventMeshTCPServer) {
+        this.eventMeshTCPServer = eventMeshTCPServer;
+    }
+
+    @Override
+    public void handle(HttpExchange httpExchange) throws IOException {
+        String result = "";
+        OutputStream out = httpExchange.getResponseBody();
+        try {
+            String newLine = System.getProperty("line.separator");
+            logger.info("showAllClient=================");
+            ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
+
+            HashMap<String, AtomicInteger> statMap = new HashMap<String, AtomicInteger>();
+
+            Map<InetSocketAddress, Session> sessionMap = clientSessionGroupMapping.getSessionMap();
+            if (!sessionMap.isEmpty()) {
+                for (Session session : sessionMap.values()) {
+                    String key = session.getClient().getSubsystem();
+                    if (!statMap.containsKey(key)) {
+                        statMap.put(key, new AtomicInteger(1));
+                    } else {
+                        statMap.get(key).incrementAndGet();
+                    }
+                }
+
+                for (Map.Entry<String, AtomicInteger> entry : statMap.entrySet()) {
+                    result += String.format("System=%s | ClientNum=%d", entry.getKey(), entry.getValue().intValue()) +
+                            newLine;
+                }
+            }
+
+            httpExchange.sendResponseHeaders(200, 0);
+            out.write(result.getBytes());
+        } catch (Exception e) {
+            logger.error("ShowClientHandler fail...", e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    logger.warn("out close failed...", e);
+                }
+            }
+        }
+
+    }
+}
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowListenClientByTopicHandler.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowListenClientByTopicHandler.java
new file mode 100644
index 0000000..6d8cbe4
--- /dev/null
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowListenClientByTopicHandler.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.runtime.admin.handler;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import org.apache.eventmesh.common.protocol.tcp.UserAgent;
+import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
+import org.apache.eventmesh.runtime.constants.EventMeshConstants;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientGroupWrapper;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.ClientSessionGroupMapping;
+import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
+import org.apache.eventmesh.runtime.util.NetUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * query client subscription by topic
+ */
+public class ShowListenClientByTopicHandler implements HttpHandler {
+
+    private Logger logger = LoggerFactory.getLogger(ShowListenClientByTopicHandler.class);
+
+    private final EventMeshTCPServer eventMeshTCPServer;
+
+    public ShowListenClientByTopicHandler(EventMeshTCPServer eventMeshTCPServer) {
+        this.eventMeshTCPServer = eventMeshTCPServer;
+    }
+
+    @Override
+    public void handle(HttpExchange httpExchange) throws IOException {
+        String result = "";
+        OutputStream out = httpExchange.getResponseBody();
+        try {
+            String queryString = httpExchange.getRequestURI().getQuery();
+            Map<String, String> queryStringInfo = NetUtils.formData2Dic(queryString);
+            String topic = queryStringInfo.get(EventMeshConstants.MANAGE_TOPIC);
+
+            String newLine = System.getProperty("line.separator");
+            logger.info("showListeningClientByTopic,topic:{}=================", topic);
+            ClientSessionGroupMapping clientSessionGroupMapping = eventMeshTCPServer.getClientSessionGroupMapping();
+            ConcurrentHashMap<String, ClientGroupWrapper> clientGroupMap = clientSessionGroupMapping.getClientGroupMap();
+            if (!clientGroupMap.isEmpty()) {
+                for (ClientGroupWrapper cgw : clientGroupMap.values()) {
+                    Set<Session> listenSessionSet = cgw.getTopic2sessionInGroupMapping().get(topic);
+                    if (listenSessionSet != null && listenSessionSet.size() > 0) {
+                        result += String.format("group:%s", cgw.getConsumerGroup()) + newLine;
+                        for (Session session : listenSessionSet) {
+                            UserAgent userAgent = session.getClient();
+                            result += String.format("pid=%s | ip=%s | port=%s | path=%s | version=%s", userAgent.getPid(), userAgent
+                                    .getHost(), userAgent.getPort(), userAgent.getPath(), userAgent.getVersion()) + newLine;
+                        }
+                    }
+                }
+            }
+            httpExchange.sendResponseHeaders(200, 0);
+            out.write(result.getBytes());
+        } catch (Exception e) {
+            logger.error("ShowListenClientByTopicHandler fail...", e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    logger.warn("out close failed...", e);
+                }
+            }
+        }
+
+    }
+}
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/AbrstractHTTPServer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/AbrstractHTTPServer.java
index d7816e9..4e902a6 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/AbrstractHTTPServer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/AbrstractHTTPServer.java
@@ -84,7 +84,7 @@ import org.slf4j.LoggerFactory;
 
 public abstract class AbrstractHTTPServer extends AbstractRemotingServer {
 
-    public Logger logger = LoggerFactory.getLogger(this.getClass());
+    public Logger httpServerLogger = LoggerFactory.getLogger(this.getClass());
 
     public Logger httpLogger = LoggerFactory.getLogger("http");
 
@@ -158,15 +158,15 @@ public abstract class AbrstractHTTPServer extends AbstractRemotingServer {
                     .channel(NioServerSocketChannel.class)
                     .childHandler(new HttpsServerInitializer(SSLContextFactory.getSslContext())).childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE);
             try {
-                logger.info("HTTPServer[port={}] started......", this.port);
+                httpServerLogger.info("HTTPServer[port={}] started......", this.port);
                 ChannelFuture future = b.bind(this.port).sync();
                 future.channel().closeFuture().sync();
             } catch (Exception e) {
-                logger.error("HTTPServer start Err!", e);
+                httpServerLogger.error("HTTPServer start Err!", e);
                 try {
                     shutdown();
                 } catch (Exception e1) {
-                    logger.error("HTTPServer shutdown Err!", e);
+                    httpServerLogger.error("HTTPServer shutdown Err!", e);
                 }
                 return;
             }
@@ -290,7 +290,7 @@ public abstract class AbrstractHTTPServer extends AbstractRemotingServer {
                 AsyncContext<HttpCommand> asyncContext = new AsyncContext<HttpCommand>(requestCommand, responseCommand, asyncContextCompleteHandler);
                 processEventMeshRequest(ctx, asyncContext);
             } catch (Exception ex) {
-                logger.error("AbrstractHTTPServer.HTTPHandler.channelRead0 err", ex);
+                httpServerLogger.error("AbrstractHTTPServer.HTTPHandler.channelRead0 err", ex);
             } finally {
                 try {
                     decoder.destroy();
@@ -330,7 +330,7 @@ public abstract class AbrstractHTTPServer extends AbstractRemotingServer {
 
                         sendResponse(ctx, asyncContext.getResponse().httpResponse());
                     } catch (Exception e) {
-                        logger.error("process error", e);
+                        httpServerLogger.error("process error", e);
                     }
                 });
             } catch (RejectedExecutionException re) {
@@ -376,7 +376,7 @@ public abstract class AbrstractHTTPServer extends AbstractRemotingServer {
             final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(ctx.channel());
             int c = connections.incrementAndGet();
             if (c > 20000) {
-                logger.warn("client|http|channelActive|remoteAddress={}|msg={}", remoteAddress, "too many client(20000) connect " +
+                httpServerLogger.warn("client|http|channelActive|remoteAddress={}|msg={}", remoteAddress, "too many client(20000) connect " +
                         "this eventMesh server");
                 ctx.close();
                 return;
@@ -399,7 +399,7 @@ public abstract class AbrstractHTTPServer extends AbstractRemotingServer {
                 IdleStateEvent event = (IdleStateEvent) evt;
                 if (event.state().equals(IdleState.ALL_IDLE)) {
                     final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(ctx.channel());
-                    logger.info("client|http|userEventTriggered|remoteAddress={}|msg={}", remoteAddress, evt.getClass()
+                    httpServerLogger.info("client|http|userEventTriggered|remoteAddress={}|msg={}", remoteAddress, evt.getClass()
                             .getName());
                     ctx.close();
                 }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHTTPServer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHTTPServer.java
index 80540c0..84a2ab7 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHTTPServer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHTTPServer.java
@@ -54,9 +54,9 @@ public class EventMeshHTTPServer extends AbrstractHTTPServer {
 
     private EventMeshHTTPConfiguration eventMeshHttpConfiguration;
 
-    public final ConcurrentHashMap<String, ConsumerGroupConf> localConsumerGroupMapping = new ConcurrentHashMap<>();
+    public final ConcurrentHashMap<String /**group*/, ConsumerGroupConf> localConsumerGroupMapping = new ConcurrentHashMap<>();
 
-    public final ConcurrentHashMap<String, List<Client>> localClientInfoMapping = new ConcurrentHashMap<>();
+    public final ConcurrentHashMap<String /**group@topic*/, List<Client>> localClientInfoMapping = new ConcurrentHashMap<>();
 
     public EventMeshHTTPServer(EventMeshServer eventMeshServer,
                                EventMeshHTTPConfiguration eventMeshHttpConfiguration) {
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshServer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshServer.java
index 61bfb89..19d6953 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshServer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshServer.java
@@ -54,7 +54,6 @@ public class EventMeshServer {
 
         String eventstore = System.getProperty(EventMeshConstants.EVENT_STORE_PROPERTIES, System.getenv(EventMeshConstants.EVENT_STORE_ENV));
         logger.info("eventstore : {}", eventstore);
-//        logger.info("load custom {} class for eventMesh", ConsumeMessageConcurrentlyService.class.getCanonicalName());
 
         serviceState = ServiceState.INITED;
         logger.info("server state:{}", serviceState);
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java
index 84454d1..12f37d3 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java
@@ -26,11 +26,7 @@ import com.google.common.util.concurrent.RateLimiter;
 
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.buffer.PooledByteBufAllocator;
-import io.netty.channel.AdaptiveRecvByteBufAllocator;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
+import io.netty.channel.*;
 import io.netty.channel.socket.nio.NioServerSocketChannel;
 import io.netty.handler.timeout.IdleStateHandler;
 import io.netty.handler.traffic.ChannelTrafficShapingHandler;
@@ -68,6 +64,8 @@ public class EventMeshTCPServer extends AbstractRemotingServer {
 
     private ExecutorService taskHandleExecutorService;
 
+    private ExecutorService broadcastMsgDownstreamExecutorService;
+
     public void setClientSessionGroupMapping(ClientSessionGroupMapping clientSessionGroupMapping) {
         this.clientSessionGroupMapping = clientSessionGroupMapping;
     }
@@ -92,6 +90,10 @@ public class EventMeshTCPServer extends AbstractRemotingServer {
         return taskHandleExecutorService;
     }
 
+    public ExecutorService getBroadcastMsgDownstreamExecutorService() {
+        return broadcastMsgDownstreamExecutorService;
+    }
+
     public void setTaskHandleExecutorService(ExecutorService taskHandleExecutorService) {
         this.taskHandleExecutorService = taskHandleExecutorService;
     }
@@ -108,10 +110,6 @@ public class EventMeshTCPServer extends AbstractRemotingServer {
 
     private RateLimiter rateLimiter;
 
-    private EventMeshTcpMessageDispatcher eventMeshTcpMessageDispatcher = new EventMeshTcpMessageDispatcher(EventMeshTCPServer.this);
-    private EventMeshTcpExceptionHandler eventMeshTcpExceptionHandler = new EventMeshTcpExceptionHandler(EventMeshTCPServer.this);
-
-
     public EventMeshTCPServer(EventMeshServer eventMeshServer,
                               EventMeshTCPConfiguration eventMeshTCPConfiguration) {
         super();
@@ -147,8 +145,8 @@ public class EventMeshTCPServer extends AbstractRemotingServer {
                                     .addLast(workerGroup, new IdleStateHandler(eventMeshTCPConfiguration.eventMeshTcpIdleReadSeconds,
                                                     eventMeshTCPConfiguration.eventMeshTcpIdleWriteSeconds,
                                                     eventMeshTCPConfiguration.eventMeshTcpIdleAllSeconds),
-                                            eventMeshTcpMessageDispatcher,
-                                            eventMeshTcpExceptionHandler
+                                            new EventMeshTcpMessageDispatcher(EventMeshTCPServer.this),
+                                            new EventMeshTcpExceptionHandler(EventMeshTCPServer.this)
                                     );
                         }
                     });
@@ -248,7 +246,8 @@ public class EventMeshTCPServer extends AbstractRemotingServer {
         scheduler = ThreadPoolFactory.createScheduledExecutor(eventMeshTCPConfiguration.eventMeshTcpGlobalScheduler, new EventMeshThreadFactoryImpl("eventMesh-tcp-scheduler", true));
 
         taskHandleExecutorService = ThreadPoolFactory.createThreadPoolExecutor(eventMeshTCPConfiguration.eventMeshTcpTaskHandleExecutorPoolSize, eventMeshTCPConfiguration.eventMeshTcpTaskHandleExecutorPoolSize, new LinkedBlockingQueue<Runnable>(10000), new EventMeshThreadFactoryImpl("eventMesh-tcp-task-handle", true));
-        ;
+
+        broadcastMsgDownstreamExecutorService = ThreadPoolFactory.createThreadPoolExecutor(eventMeshTCPConfiguration.eventMeshTcpMsgDownStreamExecutorPoolSize, eventMeshTCPConfiguration.eventMeshTcpMsgDownStreamExecutorPoolSize, new LinkedBlockingQueue<Runnable>(10000), new EventMeshThreadFactoryImpl("eventMesh-tcp-msg-downstream", true));
     }
 
     private void shutdownThreadPool() {
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java
index 4f3dddd..975edf8 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java
@@ -49,12 +49,12 @@ public class EventMeshTCPConfiguration extends CommonConfiguration {
 
     public int eventMeshTcpTaskHandleExecutorPoolSize = Runtime.getRuntime().availableProcessors();
 
+    public int eventMeshTcpMsgDownStreamExecutorPoolSize = Runtime.getRuntime().availableProcessors() > 8 ? Runtime.getRuntime().availableProcessors() : 8;
+
     public int eventMeshTcpSessionExpiredInMills = 60000;
 
     public int eventMeshTcpSessionUpstreamBufferSize = 100;
 
-    public int eventMeshTcpSessionDownstreamUnackSize = 12;
-
     public int eventMeshTcpMsgRetryTimes = 3;
 
     public int eventMeshTcpMsgRetryDelayInMills = 500;
@@ -71,8 +71,6 @@ public class EventMeshTCPConfiguration extends CommonConfiguration {
 
     public int eventMeshTcpPushFailIsolateTimeInMills = 30 * 1000;
 
-    public int eventMeshTcpDownStreamMapSize = 500;
-
     private TrafficShapingConfig gtc = new TrafficShapingConfig(0, 10_000, 1_000, 2000);
     private TrafficShapingConfig ctc = new TrafficShapingConfig(0, 2_000, 1_000, 10_000);
 
@@ -132,6 +130,13 @@ public class EventMeshTCPConfiguration extends CommonConfiguration {
             eventMeshTcpTaskHandleExecutorPoolSize = Integer.valueOf(StringUtils.deleteWhitespace(eventMeshTcpTaskHandleExecutorPoolSizeStr));
         }
 
+        String eventMeshTcpMsgDownStreamExecutorPoolSizeStr = configurationWraper.getProp(ConfKeys.KEYS_EVENTMESH_SERVER_TCP_MSG_DOWNSTREAM_POOL_SIZE);
+        if(StringUtils.isNotEmpty(eventMeshTcpMsgDownStreamExecutorPoolSizeStr)){
+            Preconditions.checkState(StringUtils.isNumeric(eventMeshTcpMsgDownStreamExecutorPoolSizeStr),
+                    String.format("%s error", ConfKeys.KEYS_EVENTMESH_SERVER_TCP_MSG_DOWNSTREAM_POOL_SIZE));
+            eventMeshTcpMsgDownStreamExecutorPoolSize = Integer.valueOf(StringUtils.deleteWhitespace(eventMeshTcpMsgDownStreamExecutorPoolSizeStr));
+        }
+
         String eventMeshTcpSessionExpiredInMillsStr = configurationWraper.getProp(ConfKeys.KEYS_EVENTMESH_SERVER_SESSION_EXPIRED_TIME);
         if (StringUtils.isNotEmpty(eventMeshTcpSessionExpiredInMillsStr)) {
             Preconditions.checkState(StringUtils.isNumeric(eventMeshTcpSessionExpiredInMillsStr), String.format("%s error", ConfKeys.KEYS_EVENTMESH_SERVER_SESSION_EXPIRED_TIME));
@@ -145,12 +150,6 @@ public class EventMeshTCPConfiguration extends CommonConfiguration {
             eventMeshTcpSessionUpstreamBufferSize = Integer.valueOf(StringUtils.deleteWhitespace(eventMeshTcpSessionUpstreamBufferSizeStr));
         }
 
-        String eventMeshTcpSessionDownstreamUnackSizeStr = configurationWraper.getProp(ConfKeys.KEYS_EVENTMESH_SERVER_SESSION_DOWNSTREAM_UNACK_SIZE);
-        if (StringUtils.isNotEmpty(eventMeshTcpSessionDownstreamUnackSizeStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(eventMeshTcpSessionDownstreamUnackSizeStr), String.format("%s error", ConfKeys.KEYS_EVENTMESH_SERVER_SESSION_DOWNSTREAM_UNACK_SIZE));
-            eventMeshTcpSessionDownstreamUnackSize = Integer.valueOf(StringUtils.deleteWhitespace(eventMeshTcpSessionDownstreamUnackSizeStr));
-        }
-
         //========================================eventMesh retry config=============================================//
         String eventMeshTcpMsgRetryTimesStr = configurationWraper.getProp(ConfKeys.KEYS_EVENTMESH_SERVER_RETRY_PUSH_RETRY_TIMES);
         if (StringUtils.isNotEmpty(eventMeshTcpMsgRetryTimesStr)) {
@@ -194,12 +193,6 @@ public class EventMeshTCPConfiguration extends CommonConfiguration {
             Preconditions.checkState(StringUtils.isNumeric(eventMeshTcpPushFailIsolateTimeInMillsStr), String.format("%s error", ConfKeys.KEYS_EVENTMESH_SERVER_PUSH_FAIL_ISOLATE_TIME));
             eventMeshTcpPushFailIsolateTimeInMills = Integer.valueOf(StringUtils.deleteWhitespace(eventMeshTcpPushFailIsolateTimeInMillsStr));
         }
-
-        String eventMeshTcpDownStreamMapSizeStr = configurationWraper.getProp(ConfKeys.KEYS_EVENTMESH_TCP_DOWNSTREAM_MAP_SIZE);
-        if (StringUtils.isNotEmpty(eventMeshTcpDownStreamMapSizeStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(eventMeshTcpDownStreamMapSizeStr), String.format("%s error", ConfKeys.KEYS_EVENTMESH_TCP_DOWNSTREAM_MAP_SIZE));
-            eventMeshTcpDownStreamMapSize = Integer.valueOf(StringUtils.deleteWhitespace(eventMeshTcpDownStreamMapSizeStr));
-        }
     }
 
     public TrafficShapingConfig getGtc() {
@@ -221,6 +214,7 @@ public class EventMeshTCPConfiguration extends CommonConfiguration {
         public static String KEYS_EVENTMESH_SERVER_TCP_REBALANCE_INTERVAL = "eventMesh.server.tcp.RebalanceIntervalInMills";
         public static String KEYS_EVENTMESH_SERVER_GLOBAL_SCHEDULER = "eventMesh.server.global.scheduler";
         public static String KEYS_EVENTMESH_SERVER_TCP_TASK_HANDLE_POOL_SIZE = "eventMesh.server.tcp.taskHandleExecutorPoolSize";
+        public static String KEYS_EVENTMESH_SERVER_TCP_MSG_DOWNSTREAM_POOL_SIZE = "eventMesh.server.tcp.msgDownStreamExecutorPoolSize";
         public static String KEYS_EVENTMESH_SERVER_SESSION_EXPIRED_TIME = "eventMesh.server.session.expiredInMills";
         public static String KEYS_EVENTMESH_SERVER_SESSION_UPSTREAM_BUFFER_SIZE = "eventMesh.server.session.upstreamBufferSize";
         public static String KEYS_EVENTMESH_SERVER_SESSION_DOWNSTREAM_UNACK_SIZE = "eventMesh.server.session.downstreamUnackSize";
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/constants/DeFiBusConstant.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/constants/DeFiBusConstant.java
deleted file mode 100644
index 898854d..0000000
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/constants/DeFiBusConstant.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to Apache Software Foundation (ASF) under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Apache Software Foundation (ASF) licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.eventmesh.runtime.constants;
-
-//TODO
-public class DeFiBusConstant {
-    public static final String PROPERTY_MESSAGE_REPLY_TO = "REPLY_TO";  //requester clientId
-
-    public static final String PROPERTY_RR_REQUEST_ID = "RR_REQUEST_UNIQ_ID";
-
-    public static final String PROPERTY_MESSAGE_TTL = "TTL";    //timeout for request-response
-
-    public static final String PROPERTY_MESSAGE_CLUSTER = "CLUSTER";    //cluster name
-
-    public static final String PROPERTY_MESSAGE_BROKER = "BROKER";  //broker name where message stored
-
-    public static final String REDIRECT = "REDIRECT";
-
-    public static final String REDIRECT_FLAG = "REDIRECT_FLAG";
-
-    public static final String PLUGIN_CLASS_NAME = "org.apache.defibus.broker.plugin.DeFiPluginMessageStore";
-
-    public static final String RR_REPLY_TOPIC = "rr-reply-topic";   //post fix for reply topic
-
-    public static final String KEY = "msgType";
-
-    public static final String DEFAULT_TTL = "14400000";
-
-    public static final String EXT_CONSUMER_GROUP = "ExtConsumerGroup";
-
-    public static final String RMQ_SYS = "RMQ_SYS_";
-
-    /**
-     * msgType1: indicate the msg is broadcast message
-     */
-    public static final String DIRECT = "direct";
-
-    /**
-     * msgType2: msg of type except broadcast and reply
-     */
-    public static final String PERSISTENT = "persistent";
-
-    /**
-     * msgType3: indicate the msg is which consumer reply to producer
-     */
-    public static final String REPLY = "reply";
-
-    public static final String INSTANCE_NAME_SEPERATER = "#";
-
-    public static final String IDC_SEPERATER = "-";
-
-    public static final String LEAVE_TIME = "LEAVE_TIME";            //leaveBrokerTime
-    public static final String ARRIVE_TIME = "ARRIVE_TIME";
-    public static final String STORE_TIME = "STORE_TIME";
-
-}
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/constants/EventMeshConstants.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/constants/EventMeshConstants.java
index d498305..6a5d35d 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/constants/EventMeshConstants.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/constants/EventMeshConstants.java
@@ -27,12 +27,6 @@ public class EventMeshConstants {
 
     public static final String PROTOCOL_TCP = "tcp";
 
-    public static final String BROADCAST_PREFIX = "broadcast-";
-
-    public final static String CONSUMER_GROUP_NAME_PREFIX = "ConsumerGroup-";
-
-    public final static String PRODUCER_GROUP_NAME_PREFIX = "ProducerGroup-";
-
     public static final String DEFAULT_CHARSET = "UTF-8";
 
     public static final String EVENTMESH_CONF_HOME = System.getProperty("confPath", System.getenv("confPath"));
@@ -85,7 +79,6 @@ public class EventMeshConstants {
 
     public static final String TAG = "TAG";
 
-    public static final String MANAGE_DCN = "dcn";
     public static final String MANAGE_SUBSYSTEM = "subSystem";
     public static final String MANAGE_IP = "ip";
     public static final String MANAGE_PORT = "port";
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/consumergroup/ConsumerGroupTopicConf.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/consumergroup/ConsumerGroupTopicConf.java
index 5a16c4c..f29d90a 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/consumergroup/ConsumerGroupTopicConf.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/consumergroup/ConsumerGroupTopicConf.java
@@ -25,6 +25,7 @@ import java.util.Set;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
+import org.apache.eventmesh.common.protocol.SubscriptionItem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,6 +38,11 @@ public class ConsumerGroupTopicConf {
     private String topic;
 
     /**
+     * @see org.apache.eventmesh.common.protocol.SubscriptionItem
+     */
+    private SubscriptionItem subscriptionItem;
+
+    /**
      * PUSH URL
      */
     private Map<String /** IDC*/, List<String> /** IDC内URL列表*/> idcUrls = Maps.newConcurrentMap();
@@ -53,12 +59,13 @@ public class ConsumerGroupTopicConf {
         ConsumerGroupTopicConf that = (ConsumerGroupTopicConf) o;
         return consumerGroup.equals(that.consumerGroup) &&
                 Objects.equals(topic, that.topic) &&
+                Objects.equals(subscriptionItem, that.subscriptionItem) &&
                 Objects.equals(idcUrls, that.idcUrls);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(consumerGroup, topic, idcUrls);
+        return Objects.hash(consumerGroup, topic, subscriptionItem, idcUrls);
     }
 
     @Override
@@ -66,6 +73,7 @@ public class ConsumerGroupTopicConf {
         StringBuilder sb = new StringBuilder();
         sb.append("consumeTopicConfig={consumerGroup=").append(consumerGroup)
                 .append(",topic=").append(topic)
+                .append(",subscriptionMode=").append(subscriptionItem)
                 .append(",idcUrls=").append(idcUrls).append("}");
         return sb.toString();
     }
@@ -86,6 +94,14 @@ public class ConsumerGroupTopicConf {
         this.topic = topic;
     }
 
+    public SubscriptionItem getSubscriptionItem() {
+        return subscriptionItem;
+    }
+
+    public void setSubscriptionItem(SubscriptionItem subscriptionItem) {
+        this.subscriptionItem = subscriptionItem;
+    }
+
     public Map<String, List<String>> getIdcUrls() {
         return idcUrls;
     }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/plugin/MQConsumerWrapper.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/plugin/MQConsumerWrapper.java
index ad44d3e..080b7af 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/plugin/MQConsumerWrapper.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/plugin/MQConsumerWrapper.java
@@ -43,14 +43,6 @@ public class MQConsumerWrapper extends MQWrapper {
         meshMQPushConsumer.unsubscribe(topic);
     }
 
-//    public boolean isPause() {
-//        return meshMQPushConsumer.isPause();
-//    }
-//
-//    public void pause() {
-//        meshMQPushConsumer.pause();
-//    }
-
     public synchronized void init(Properties keyValue) throws Exception {
         meshMQPushConsumer = getMeshMQPushConsumer();
         if (meshMQPushConsumer == null) {
@@ -88,8 +80,4 @@ public class MQConsumerWrapper extends MQWrapper {
     public void updateOffset(List<Message> msgs, AbstractContext eventMeshConsumeConcurrentlyContext) {
         meshMQPushConsumer.updateOffset(msgs, eventMeshConsumeConcurrentlyContext);
     }
-
-    public AbstractContext getContext() {
-        return meshMQPushConsumer.getContext();
-    }
 }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/ConsumerGroupManager.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/ConsumerGroupManager.java
index 76381e3..93377ac 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/ConsumerGroupManager.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/ConsumerGroupManager.java
@@ -17,10 +17,14 @@
 
 package org.apache.eventmesh.runtime.core.protocol.http.consumer;
 
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.eventmesh.runtime.boot.EventMeshHTTPServer;
 import org.apache.eventmesh.runtime.core.consumergroup.ConsumerGroupConf;
+import org.apache.eventmesh.runtime.core.consumergroup.ConsumerGroupTopicConf;
 
 public class ConsumerGroupManager {
 
@@ -52,8 +56,8 @@ public class ConsumerGroupManager {
     }
 
     private synchronized void setupEventMeshConsumer(ConsumerGroupConf consumerGroupConfig) throws Exception {
-        for (String topic : consumerGroupConfig.getConsumerGroupTopicConf().keySet()) {
-            eventMeshConsumer.subscribe(topic);
+        for (Map.Entry<String, ConsumerGroupTopicConf> conf : consumerGroupConfig.getConsumerGroupTopicConf().entrySet()) {
+            eventMeshConsumer.subscribe(conf.getKey(), conf.getValue().getSubscriptionItem());
         }
     }
 
@@ -80,4 +84,14 @@ public class ConsumerGroupManager {
     public ConsumerGroupConf getConsumerGroupConfig() {
         return consumerGroupConfig;
     }
+
+    public void unsubscribe(String consumerGroup) throws Exception {
+        if(StringUtils.equals(consumerGroupConfig.getConsumerGroup(), consumerGroup)){
+            Set<String> topics = consumerGroupConfig.getConsumerGroupTopicConf().keySet();
+            for (String topic : topics){
+                ConsumerGroupTopicConf consumerGroupTopicConf = consumerGroupConfig.getConsumerGroupTopicConf().get(topic);
+                eventMeshConsumer.unsubscribe(topic, consumerGroupTopicConf.getSubscriptionItem().getMode());
+            }
+        }
+    }
 }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/ConsumerManager.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/ConsumerManager.java
index 467e4f0..51ede0b 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/ConsumerManager.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/ConsumerManager.java
@@ -113,6 +113,7 @@ public class ConsumerManager {
                                                 ConsumerGroupTopicConf latestTopicConf = new ConsumerGroupTopicConf();
                                                 latestTopicConf.setConsumerGroup(consumerGroup);
                                                 latestTopicConf.setTopic(topic);
+                                                latestTopicConf.setSubscriptionItem(map.get(topicKey).getSubscriptionItem());
                                                 latestTopicConf.setUrls(clientUrls);
 
                                                 latestTopicConf.setIdcUrls(idcUrls);
@@ -156,19 +157,19 @@ public class ConsumerManager {
     public void notifyConsumerManager(String consumerGroup, ConsumerGroupConf latestConsumerGroupConfig,
                                       ConcurrentHashMap<String, ConsumerGroupConf> localConsumerGroupMapping) throws Exception {
         ConsumerGroupManager cgm = eventMeshHTTPServer.getConsumerManager().getConsumer(consumerGroup);
-        if (cgm == null) {
+        if (latestConsumerGroupConfig == null) {
             ConsumerGroupStateEvent notification = new ConsumerGroupStateEvent();
-            notification.action = ConsumerGroupStateEvent.ConsumerGroupStateAction.NEW;
+            notification.action = ConsumerGroupStateEvent.ConsumerGroupStateAction.DELETE;
             notification.consumerGroup = consumerGroup;
-            notification.consumerGroupConfig = latestConsumerGroupConfig;
             eventMeshHTTPServer.getEventBus().post(notification);
             return;
         }
 
-        if (latestConsumerGroupConfig == null) {
+        if (cgm == null) {
             ConsumerGroupStateEvent notification = new ConsumerGroupStateEvent();
-            notification.action = ConsumerGroupStateEvent.ConsumerGroupStateAction.DELETE;
+            notification.action = ConsumerGroupStateEvent.ConsumerGroupStateAction.NEW;
             notification.consumerGroup = consumerGroup;
+            notification.consumerGroupConfig = latestConsumerGroupConfig;
             eventMeshHTTPServer.getEventBus().post(notification);
             return;
         }
@@ -217,8 +218,10 @@ public class ConsumerManager {
      * restart consumer
      */
     public synchronized void restartConsumer(String consumerGroup, ConsumerGroupConf consumerGroupConfig) throws Exception {
-        ConsumerGroupManager cgm = consumerTable.get(consumerGroup);
-        cgm.refresh(consumerGroupConfig);
+        if(consumerTable.containsKey(consumerGroup)) {
+            ConsumerGroupManager cgm = consumerTable.get(consumerGroup);
+            cgm.refresh(consumerGroupConfig);
+        }
     }
 
     /**
@@ -235,8 +238,14 @@ public class ConsumerManager {
      * @param consumerGroup
      */
     public synchronized void delConsumer(String consumerGroup) throws Exception {
-        ConsumerGroupManager cgm = consumerTable.remove(consumerGroup);
-        cgm.shutdown();
+        logger.info("start delConsumer with consumerGroup {}", consumerGroup);
+        if(consumerTable.containsKey(consumerGroup)) {
+            ConsumerGroupManager cgm = consumerTable.remove(consumerGroup);
+            logger.info("start unsubscribe topic with consumer group manager {}", JSONObject.toJSONString(cgm));
+            cgm.unsubscribe(consumerGroup);
+            cgm.shutdown();
+        }
+        logger.info("end delConsumer with consumerGroup {}", consumerGroup);
     }
 
     @Subscribe
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/EventMeshConsumer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/EventMeshConsumer.java
index 186ca35..8620e68 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/EventMeshConsumer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/EventMeshConsumer.java
@@ -21,7 +21,6 @@ import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import io.openmessaging.api.Action;
 import io.openmessaging.api.AsyncConsumeContext;
 import io.openmessaging.api.AsyncMessageListener;
 import io.openmessaging.api.Message;
@@ -31,7 +30,11 @@ import io.openmessaging.api.SendResult;
 
 import org.apache.commons.collections4.MapUtils;
 import org.apache.eventmesh.api.AbstractContext;
+import org.apache.eventmesh.api.EventMeshAction;
+import org.apache.eventmesh.api.EventMeshAsyncConsumeContext;
 import org.apache.eventmesh.common.Constants;
+import org.apache.eventmesh.common.protocol.SubscriptionItem;
+import org.apache.eventmesh.common.protocol.SubscriptionMode;
 import org.apache.eventmesh.runtime.boot.EventMeshHTTPServer;
 import org.apache.eventmesh.runtime.constants.EventMeshConstants;
 import org.apache.eventmesh.runtime.core.consumergroup.ConsumerGroupConf;
@@ -81,7 +84,6 @@ public class EventMeshConsumer {
         keyValue.put("consumerGroup", consumerGroupConf.getConsumerGroup());
         keyValue.put("eventMeshIDC", eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
         keyValue.put("instanceName", EventMeshUtil.buildMeshClientID(consumerGroupConf.getConsumerGroup(),
-                eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshRegion,
                 eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshCluster));
         persistentMqConsumer.init(keyValue);
 
@@ -91,7 +93,6 @@ public class EventMeshConsumer {
         broadcastKeyValue.put("consumerGroup", consumerGroupConf.getConsumerGroup());
         broadcastKeyValue.put("eventMeshIDC", eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
         broadcastKeyValue.put("instanceName", EventMeshUtil.buildMeshClientID(consumerGroupConf.getConsumerGroup(),
-                eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshRegion,
                 eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshCluster));
         broadcastMqConsumer.init(broadcastKeyValue);
         inited4Persistent.compareAndSet(false, true);
@@ -100,16 +101,15 @@ public class EventMeshConsumer {
     }
 
     public synchronized void start() throws Exception {
-
         persistentMqConsumer.start();
         started4Persistent.compareAndSet(false, true);
         broadcastMqConsumer.start();
         started4Broadcast.compareAndSet(false, true);
     }
 
-    public void subscribe(String topic) throws Exception {
+    public void subscribe(String topic, SubscriptionItem subscriptionItem) throws Exception {
         AsyncMessageListener listener = null;
-        if (!EventMeshUtil.isBroadcast(topic)) {
+        if (!SubscriptionMode.BROADCASTING.equals(subscriptionItem.getMode())) {
             listener = new AsyncMessageListener() {
                 @Override
                 public void consume(Message message, AsyncConsumeContext context) {
@@ -125,6 +125,7 @@ public class EventMeshConsumer {
                     }
 
                     ConsumerGroupTopicConf currentTopicConfig = MapUtils.getObject(consumerGroupConf.getConsumerGroupTopicConf(), topic, null);
+                    EventMeshAsyncConsumeContext eventMeshAsyncConsumeContext = (EventMeshAsyncConsumeContext)context;
 
                     if (currentTopicConfig == null) {
                         logger.error("no topicConfig found, consumerGroup:{} topic:{}", consumerGroupConf.getConsumerGroup(), topic);
@@ -132,18 +133,18 @@ public class EventMeshConsumer {
                             sendMessageBack(message, uniqueId, bizSeqNo);
 //                            context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS.name());
 //                            context.ack();
-                            context.commit(Action.CommitMessage);
+                            eventMeshAsyncConsumeContext.commit(EventMeshAction.CommitMessage);
                             return;
                         } catch (Exception ex) {
                         }
                     }
                     HandleMsgContext handleMsgContext = new HandleMsgContext(EventMeshUtil.buildPushMsgSeqNo(), consumerGroupConf.getConsumerGroup(), EventMeshConsumer.this,
-                            topic, message, persistentMqConsumer.getContext(), consumerGroupConf, eventMeshHTTPServer, bizSeqNo, uniqueId, currentTopicConfig);
+                            topic, message, subscriptionItem, eventMeshAsyncConsumeContext.getAbstractContext(), consumerGroupConf, eventMeshHTTPServer, bizSeqNo, uniqueId, currentTopicConfig);
 
                     if (httpMessageHandler.handle(handleMsgContext)) {
 //                        context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_FINISH.name());
 //                        context.ack();
-                        context.commit(Action.CommitMessage);
+                        eventMeshAsyncConsumeContext.commit(EventMeshAction.ManualAck);
                     } else {
                         try {
                             sendMessageBack(message, uniqueId, bizSeqNo);
@@ -152,7 +153,7 @@ public class EventMeshConsumer {
                         }
 //                        context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS.name());
 //                        context.ack();
-                        context.commit(Action.CommitMessage);
+                        eventMeshAsyncConsumeContext.commit(EventMeshAction.CommitMessage);
                     }
                 }
             };
@@ -174,6 +175,7 @@ public class EventMeshConsumer {
                     }
 
                     ConsumerGroupTopicConf currentTopicConfig = MapUtils.getObject(consumerGroupConf.getConsumerGroupTopicConf(), topic, null);
+                    EventMeshAsyncConsumeContext eventMeshAsyncConsumeContext = (EventMeshAsyncConsumeContext)context;
 
                     if (currentTopicConfig == null) {
                         logger.error("no topicConfig found, consumerGroup:{} topic:{}", consumerGroupConf.getConsumerGroup(), topic);
@@ -181,18 +183,18 @@ public class EventMeshConsumer {
                             sendMessageBack(message, uniqueId, bizSeqNo);
 //                            context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS.name());
 //                            context.ack();
-                            context.commit(Action.CommitMessage);
+                            eventMeshAsyncConsumeContext.commit(EventMeshAction.CommitMessage);
                             return;
                         } catch (Exception ex) {
                         }
                     }
                     HandleMsgContext handleMsgContext = new HandleMsgContext(EventMeshUtil.buildPushMsgSeqNo(), consumerGroupConf.getConsumerGroup(), EventMeshConsumer.this,
-                            topic, message, broadcastMqConsumer.getContext(), consumerGroupConf, eventMeshHTTPServer, bizSeqNo, uniqueId, currentTopicConfig);
+                            topic, message, subscriptionItem, eventMeshAsyncConsumeContext.getAbstractContext(), consumerGroupConf, eventMeshHTTPServer, bizSeqNo, uniqueId, currentTopicConfig);
 
                     if (httpMessageHandler.handle(handleMsgContext)) {
 //                        context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_FINISH.name());
 //                        context.ack();
-                        context.commit(Action.CommitMessage);
+                        eventMeshAsyncConsumeContext.commit(EventMeshAction.ManualAck);
                     } else {
                         try {
                             sendMessageBack(message, uniqueId, bizSeqNo);
@@ -201,7 +203,7 @@ public class EventMeshConsumer {
                         }
 //                        context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS.name());
 //                        context.ack();
-                        context.commit(Action.CommitMessage);
+                        eventMeshAsyncConsumeContext.commit(EventMeshAction.CommitMessage);
                     }
                 }
             };
@@ -209,8 +211,8 @@ public class EventMeshConsumer {
         }
     }
 
-    public void unsubscribe(String topic) throws Exception {
-        if (EventMeshUtil.isBroadcast(topic)) {
+    public void unsubscribe(String topic, SubscriptionMode subscriptionMode) throws Exception {
+        if (SubscriptionMode.BROADCASTING.equals(subscriptionMode)) {
             broadcastMqConsumer.unsubscribe(topic);
         } else {
             persistentMqConsumer.unsubscribe(topic);
@@ -233,8 +235,8 @@ public class EventMeshConsumer {
         started4Broadcast.compareAndSet(true, false);
     }
 
-    public void updateOffset(String topic, List<Message> msgs, AbstractContext context) {
-        if (EventMeshUtil.isBroadcast(topic)) {
+    public void updateOffset(String topic, SubscriptionMode subscriptionMode, List<Message> msgs, AbstractContext context) {
+        if (SubscriptionMode.BROADCASTING.equals(subscriptionMode)) {
             broadcastMqConsumer.updateOffset(msgs, context);
         } else {
             persistentMqConsumer.updateOffset(msgs, context);
@@ -252,8 +254,7 @@ public class EventMeshConsumer {
     public void sendMessageBack(final Message msgBack, final String uniqueId, String bizSeqNo) throws Exception {
 
         EventMeshProducer sendMessageBack
-                = eventMeshHTTPServer.getProducerManager().getEventMeshProducer(EventMeshConstants.PRODUCER_GROUP_NAME_PREFIX
-                + consumerGroupConf.getConsumerGroup());
+                = eventMeshHTTPServer.getProducerManager().getEventMeshProducer(consumerGroupConf.getConsumerGroup());
 
         if (sendMessageBack == null) {
             logger.warn("consumer:{} consume fail, sendMessageBack, bizSeqNo:{}, uniqueId:{}", consumerGroupConf.getConsumerGroup(), bizSeqNo, uniqueId);
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/HandleMsgContext.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/HandleMsgContext.java
index afb27c1..2d19174 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/HandleMsgContext.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/HandleMsgContext.java
@@ -23,10 +23,14 @@ import java.util.Map;
 
 import io.openmessaging.api.Message;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.apache.eventmesh.api.AbstractContext;
 import org.apache.eventmesh.common.Constants;
+import org.apache.eventmesh.common.protocol.SubscriptionItem;
+import org.apache.eventmesh.common.protocol.SubscriptionMode;
 import org.apache.eventmesh.runtime.boot.EventMeshHTTPServer;
+import org.apache.eventmesh.runtime.constants.EventMeshConstants;
 import org.apache.eventmesh.runtime.core.consumergroup.ConsumerGroupConf;
 import org.apache.eventmesh.runtime.core.consumergroup.ConsumerGroupTopicConf;
 import org.slf4j.Logger;
@@ -48,6 +52,8 @@ public class HandleMsgContext {
 
     private String topic;
 
+    private SubscriptionItem subscriptionItem;
+
     private Message msg;
 
     private int ttl;
@@ -65,7 +71,7 @@ public class HandleMsgContext {
     private Map<String, String> props;
 
     public HandleMsgContext(String msgRandomNo, String consumerGroup, EventMeshConsumer eventMeshConsumer,
-                            String topic, Message msg,
+                            String topic, Message msg, SubscriptionItem subscriptionItem,
                             AbstractContext context, ConsumerGroupConf consumerGroupConfig,
                             EventMeshHTTPServer eventMeshHTTPServer, String bizSeqNo, String uniqueId, ConsumerGroupTopicConf consumeTopicConfig) {
         this.msgRandomNo = msgRandomNo;
@@ -73,13 +79,15 @@ public class HandleMsgContext {
         this.eventMeshConsumer = eventMeshConsumer;
         this.topic = topic;
         this.msg = msg;
+        this.subscriptionItem = subscriptionItem;
         this.context = context;
         this.consumerGroupConfig = consumerGroupConfig;
         this.eventMeshHTTPServer = eventMeshHTTPServer;
         this.bizSeqNo = bizSeqNo;
         this.uniqueId = uniqueId;
         this.consumeTopicConfig = consumeTopicConfig;
-        this.ttl = Integer.parseInt(msg.getUserProperties(Constants.PROPERTY_MESSAGE_TIMEOUT));
+        String ttlStr = msg.getUserProperties(Constants.PROPERTY_MESSAGE_TIMEOUT);
+        this.ttl = StringUtils.isNumeric(ttlStr)? Integer.parseInt(ttlStr): EventMeshConstants.DEFAULT_TIMEOUT_IN_MILLISECONDS;
     }
 
     public void addProp(String key, String val) {
@@ -149,6 +157,14 @@ public class HandleMsgContext {
         this.msg = msg;
     }
 
+    public SubscriptionItem getSubscriptionItem() {
+        return subscriptionItem;
+    }
+
+    public void setSubscriptionItem(SubscriptionItem subscriptionItem) {
+        this.subscriptionItem = subscriptionItem;
+    }
+
     public long getCreateTime() {
         return createTime;
     }
@@ -185,7 +201,7 @@ public class HandleMsgContext {
 //                        msg.getProperty(DeFiBusConstant.PROPERTY_MESSAGE_BROKER),
 //                        msg.getQueueId(), msg.getQueueOffset());
             }
-            eventMeshConsumer.updateOffset(topic, Arrays.asList(msg), context);
+            eventMeshConsumer.updateOffset(topic, subscriptionItem.getMode(), Arrays.asList(msg), context);
         }
     }
 
@@ -211,6 +227,7 @@ public class HandleMsgContext {
         sb.append("handleMsgContext={")
                 .append("consumerGroup=").append(consumerGroup)
                 .append(",topic=").append(topic)
+                .append(",subscriptionItem=").append(subscriptionItem)
                 .append(",consumeTopicConfig=").append(consumeTopicConfig)
                 .append(",bizSeqNo=").append(bizSeqNo)
                 .append(",uniqueId=").append(uniqueId)
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageProcessor.java
index 37d28b7..df3b2af 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageProcessor.java
@@ -78,8 +78,7 @@ public class BatchSendMessageProcessor implements HttpRequestProcessor {
         SendMessageBatchResponseHeader sendMessageBatchResponseHeader =
                 SendMessageBatchResponseHeader.buildHeader(Integer.valueOf(asyncContext.getRequest().getRequestCode()), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshCluster,
                         IPUtil.getLocalAddress(), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEnv,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshRegion,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshDCN, eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
 
         if (StringUtils.isBlank(sendMessageBatchRequestHeader.getPid())
                 || !StringUtils.isNumeric(sendMessageBatchRequestHeader.getPid())
@@ -93,6 +92,7 @@ public class BatchSendMessageProcessor implements HttpRequestProcessor {
 
         if (CollectionUtils.isEmpty(sendMessageBatchRequestBody.getContents())
                 || StringUtils.isBlank(sendMessageBatchRequestBody.getBatchId())
+                || StringUtils.isBlank(sendMessageBatchRequestBody.getProducerGroup())
                 || (Integer.valueOf(sendMessageBatchRequestBody.getSize()) != CollectionUtils.size(sendMessageBatchRequestBody.getContents()))) {
             responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
                     sendMessageBatchResponseHeader,
@@ -112,11 +112,8 @@ public class BatchSendMessageProcessor implements HttpRequestProcessor {
             return;
         }
 
-        if (StringUtils.isBlank(sendMessageBatchRequestHeader.getDcn())) {
-            sendMessageBatchRequestHeader.setDcn("BATCH");
-        }
-        String producerGroup = EventMeshUtil.buildClientGroup(sendMessageBatchRequestHeader.getSys(),
-                sendMessageBatchRequestHeader.getDcn());
+
+        String producerGroup = sendMessageBatchRequestBody.getProducerGroup();
         EventMeshProducer batchEventMeshProducer = eventMeshHTTPServer.getProducerManager().getEventMeshProducer(producerGroup);
 
         batchEventMeshProducer.getMqProducerWrapper().getMeshMQProducer().setExtFields();
@@ -188,7 +185,9 @@ public class BatchSendMessageProcessor implements HttpRequestProcessor {
             return;
         }
 
-        eventMeshHTTPServer.metrics.summaryMetrics.recordSendBatchMsg(Integer.parseInt(sendMessageBatchRequestBody.getSize()));
+        String sizeStr = sendMessageBatchRequestBody.getSize();
+        long delta = StringUtils.isNumeric(sizeStr)? Integer.parseInt(sizeStr) : 0;
+        eventMeshHTTPServer.metrics.summaryMetrics.recordSendBatchMsg(delta);
 
         if (eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshServerBatchMsgBatchEnabled) {
             for (List<Message> batchMsgs : topicBatchMessageMappings.values()) {
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageV2Processor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageV2Processor.java
index 5dff408..8d5f7b5 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageV2Processor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageV2Processor.java
@@ -73,8 +73,7 @@ public class BatchSendMessageV2Processor implements HttpRequestProcessor {
         SendMessageBatchV2ResponseHeader sendMessageBatchV2ResponseHeader =
                 SendMessageBatchV2ResponseHeader.buildHeader(Integer.valueOf(asyncContext.getRequest().getRequestCode()), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshCluster,
                         IPUtil.getLocalAddress(), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEnv,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshRegion,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshDCN, eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
 
         if (StringUtils.isBlank(sendMessageBatchV2RequestHeader.getPid())
                 || !StringUtils.isNumeric(sendMessageBatchV2RequestHeader.getPid())
@@ -88,6 +87,7 @@ public class BatchSendMessageV2Processor implements HttpRequestProcessor {
 
         if (StringUtils.isBlank(sendMessageBatchV2RequestBody.getBizSeqNo())
                 || StringUtils.isBlank(sendMessageBatchV2RequestBody.getTopic())
+                || StringUtils.isBlank(sendMessageBatchV2RequestBody.getProducerGroup())
                 || StringUtils.isBlank(sendMessageBatchV2RequestBody.getMsg())) {
             responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
                     sendMessageBatchV2ResponseHeader,
@@ -107,11 +107,7 @@ public class BatchSendMessageV2Processor implements HttpRequestProcessor {
             return;
         }
 
-        if (StringUtils.isBlank(sendMessageBatchV2RequestHeader.getDcn())) {
-            sendMessageBatchV2RequestHeader.setDcn("BATCH");
-        }
-        String producerGroup = EventMeshUtil.buildClientGroup(sendMessageBatchV2RequestHeader.getSys(),
-                sendMessageBatchV2RequestHeader.getDcn());
+        String producerGroup = sendMessageBatchV2RequestBody.getProducerGroup();
         EventMeshProducer batchEventMeshProducer = eventMeshHTTPServer.getProducerManager().getEventMeshProducer(producerGroup);
         batchEventMeshProducer.getMqProducerWrapper().getMeshMQProducer().setExtFields();
 //        batchEventMeshProducer.getMqProducerWrapper().getDefaultMQProducer().setRetryTimesWhenSendAsyncFailed(0);
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/HeartBeatProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/HeartBeatProcessor.java
index febfa91..9e4c41e 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/HeartBeatProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/HeartBeatProcessor.java
@@ -68,13 +68,11 @@ public class HeartBeatProcessor implements HttpRequestProcessor {
         HeartbeatResponseHeader heartbeatResponseHeader =
                 HeartbeatResponseHeader.buildHeader(Integer.valueOf(asyncContext.getRequest().getRequestCode()), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshCluster,
                         IPUtil.getLocalAddress(), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEnv,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshRegion,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshDCN, eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
 
 
         //validate header
         if (StringUtils.isBlank(heartbeatRequestHeader.getIdc())
-                || StringUtils.isBlank(heartbeatRequestHeader.getDcn())
                 || StringUtils.isBlank(heartbeatRequestHeader.getPid())
                 || !StringUtils.isNumeric(heartbeatRequestHeader.getPid())
                 || StringUtils.isBlank(heartbeatRequestHeader.getSys())) {
@@ -87,6 +85,7 @@ public class HeartBeatProcessor implements HttpRequestProcessor {
 
         //validate body
         if (StringUtils.isBlank(heartbeatRequestBody.getClientType())
+                || StringUtils.isBlank(heartbeatRequestBody.getConsumerGroup())
                 || CollectionUtils.isEmpty(heartbeatRequestBody.getHeartbeatEntities())) {
 
             responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
@@ -97,20 +96,17 @@ public class HeartBeatProcessor implements HttpRequestProcessor {
         }
         ConcurrentHashMap<String, List<Client>> tmp = new ConcurrentHashMap<>();
         String env = heartbeatRequestHeader.getEnv();
-        String dcn = heartbeatRequestHeader.getDcn();
         String idc = heartbeatRequestHeader.getIdc();
         String sys = heartbeatRequestHeader.getSys();
         String ip = heartbeatRequestHeader.getIp();
         String pid = heartbeatRequestHeader.getPid();
-        String consumerGroup = EventMeshUtil.buildClientGroup(heartbeatRequestHeader.getSys(),
-                heartbeatRequestHeader.getDcn());
+        String consumerGroup = heartbeatRequestBody.getConsumerGroup();
         List<HeartbeatRequestBody.HeartbeatEntity> heartbeatEntities = heartbeatRequestBody.getHeartbeatEntities();
         for (HeartbeatRequestBody.HeartbeatEntity heartbeatEntity : heartbeatEntities) {
             String topic = heartbeatEntity.topic;
             String url = heartbeatEntity.url;
             Client client = new Client();
             client.env = env;
-            client.dcn = dcn;
             client.idc = idc;
             client.sys = sys;
             client.ip = ip;
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/ReplyMessageProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/ReplyMessageProcessor.java
index 3c461ed..5d8745b 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/ReplyMessageProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/ReplyMessageProcessor.java
@@ -78,12 +78,10 @@ public class ReplyMessageProcessor implements HttpRequestProcessor {
         ReplyMessageResponseHeader replyMessageResponseHeader =
                 ReplyMessageResponseHeader.buildHeader(Integer.valueOf(asyncContext.getRequest().getRequestCode()), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshCluster,
                         IPUtil.getLocalAddress(), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEnv,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshRegion,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshDCN, eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
 
         //HEADER校验
         if (StringUtils.isBlank(replyMessageRequestHeader.getIdc())
-                || StringUtils.isBlank(replyMessageRequestHeader.getDcn())
                 || StringUtils.isBlank(replyMessageRequestHeader.getPid())
                 || !StringUtils.isNumeric(replyMessageRequestHeader.getPid())
                 || StringUtils.isBlank(replyMessageRequestHeader.getSys())) {
@@ -97,6 +95,7 @@ public class ReplyMessageProcessor implements HttpRequestProcessor {
         //validate body
         if (StringUtils.isBlank(replyMessageRequestBody.getBizSeqNo())
                 || StringUtils.isBlank(replyMessageRequestBody.getUniqueId())
+                || StringUtils.isBlank(replyMessageRequestBody.getProducerGroup())
                 || StringUtils.isBlank(replyMessageRequestBody.getContent())) {
             responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
                     replyMessageResponseHeader,
@@ -105,8 +104,7 @@ public class ReplyMessageProcessor implements HttpRequestProcessor {
             return;
         }
 
-        String producerGroup = EventMeshUtil.buildClientGroup(replyMessageRequestHeader.getSys(),
-                replyMessageRequestHeader.getDcn());
+        String producerGroup = replyMessageRequestBody.getProducerGroup();
         EventMeshProducer eventMeshProducer = eventMeshHTTPServer.getProducerManager().getEventMeshProducer(producerGroup);
 
         if (!eventMeshProducer.getStarted().get()) {
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncMessageProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncMessageProcessor.java
index 8fd2fad..cd3d4be 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncMessageProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncMessageProcessor.java
@@ -75,12 +75,10 @@ public class SendAsyncMessageProcessor implements HttpRequestProcessor {
         SendMessageResponseHeader sendMessageResponseHeader =
                 SendMessageResponseHeader.buildHeader(Integer.valueOf(asyncContext.getRequest().getRequestCode()), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshCluster,
                         IPUtil.getLocalAddress(), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEnv,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshRegion,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshDCN, eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
 
         //validate header
         if (StringUtils.isBlank(sendMessageRequestHeader.getIdc())
-                || StringUtils.isBlank(sendMessageRequestHeader.getDcn())
                 || StringUtils.isBlank(sendMessageRequestHeader.getPid())
                 || !StringUtils.isNumeric(sendMessageRequestHeader.getPid())
                 || StringUtils.isBlank(sendMessageRequestHeader.getSys())) {
@@ -94,6 +92,7 @@ public class SendAsyncMessageProcessor implements HttpRequestProcessor {
         //validate body
         if (StringUtils.isBlank(sendMessageRequestBody.getBizSeqNo())
                 || StringUtils.isBlank(sendMessageRequestBody.getUniqueId())
+                || StringUtils.isBlank(sendMessageRequestBody.getProducerGroup())
                 || StringUtils.isBlank(sendMessageRequestBody.getTopic())
                 || StringUtils.isBlank(sendMessageRequestBody.getContent())
                 || (StringUtils.isBlank(sendMessageRequestBody.getTtl()))) {
@@ -105,8 +104,7 @@ public class SendAsyncMessageProcessor implements HttpRequestProcessor {
             return;
         }
 
-        String producerGroup = EventMeshUtil.buildClientGroup(sendMessageRequestHeader.getSys(),
-                sendMessageRequestHeader.getDcn());
+        String producerGroup = sendMessageRequestBody.getProducerGroup();
         EventMeshProducer eventMeshProducer = eventMeshHTTPServer.getProducerManager().getEventMeshProducer(producerGroup);
 
         if (!eventMeshProducer.getStarted().get()) {
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendSyncMessageProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendSyncMessageProcessor.java
index d2dacdb..5511e38 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendSyncMessageProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendSyncMessageProcessor.java
@@ -79,11 +79,9 @@ public class SendSyncMessageProcessor implements HttpRequestProcessor {
         SendMessageResponseHeader sendMessageResponseHeader =
                 SendMessageResponseHeader.buildHeader(Integer.valueOf(asyncContext.getRequest().getRequestCode()), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshCluster,
                         IPUtil.getLocalAddress(), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEnv,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshRegion,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshDCN, eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
 
         if (StringUtils.isBlank(sendMessageRequestHeader.getIdc())
-                || StringUtils.isBlank(sendMessageRequestHeader.getDcn())
                 || StringUtils.isBlank(sendMessageRequestHeader.getPid())
                 || !StringUtils.isNumeric(sendMessageRequestHeader.getPid())
                 || StringUtils.isBlank(sendMessageRequestHeader.getSys())) {
@@ -96,6 +94,7 @@ public class SendSyncMessageProcessor implements HttpRequestProcessor {
 
         if (StringUtils.isBlank(sendMessageRequestBody.getBizSeqNo())
                 || StringUtils.isBlank(sendMessageRequestBody.getUniqueId())
+                || StringUtils.isBlank(sendMessageRequestBody.getProducerGroup())
                 || StringUtils.isBlank(sendMessageRequestBody.getTopic())
                 || StringUtils.isBlank(sendMessageRequestBody.getContent())
                 || (StringUtils.isBlank(sendMessageRequestBody.getTtl()))) {
@@ -106,8 +105,7 @@ public class SendSyncMessageProcessor implements HttpRequestProcessor {
             return;
         }
 
-        String producerGroup = EventMeshUtil.buildClientGroup(sendMessageRequestHeader.getSys(),
-                sendMessageRequestHeader.getDcn());
+        String producerGroup = sendMessageRequestBody.getProducerGroup();
         EventMeshProducer eventMeshProducer = eventMeshHTTPServer.getProducerManager().getEventMeshProducer(producerGroup);
 
         if (!eventMeshProducer.getStarted().get()) {
@@ -140,7 +138,7 @@ public class SendSyncMessageProcessor implements HttpRequestProcessor {
             omsMsg.putUserProperties("msgType", "persistent");
             omsMsg.putUserProperties(EventMeshConstants.REQ_C2EVENTMESH_TIMESTAMP, String.valueOf(System.currentTimeMillis()));
             omsMsg.putUserProperties(Constants.RMB_UNIQ_ID, sendMessageRequestBody.getUniqueId());
-            omsMsg.putUserProperties("REPLY_TO", eventMeshProducer.getMqProducerWrapper().getMeshMQProducer().buildMQClientId());
+//            omsMsg.putUserProperties("REPLY_TO", eventMeshProducer.getMqProducerWrapper().getMeshMQProducer().buildMQClientId());
 
             if (messageLogger.isDebugEnabled()) {
                 messageLogger.debug("msg2MQMsg suc, bizSeqNo={}, topic={}", sendMessageRequestBody.getBizSeqNo(),
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SubscribeProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SubscribeProcessor.java
index 54fa73e..e22a86c 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SubscribeProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SubscribeProcessor.java
@@ -19,19 +19,18 @@ package org.apache.eventmesh.runtime.core.protocol.http.processor;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-
 import com.alibaba.fastjson.JSONObject;
-
 import io.netty.channel.ChannelHandlerContext;
-
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.eventmesh.common.IPUtil;
 import org.apache.eventmesh.common.command.HttpCommand;
+import org.apache.eventmesh.common.protocol.SubscriptionItem;
 import org.apache.eventmesh.common.protocol.http.body.client.SubscribeRequestBody;
 import org.apache.eventmesh.common.protocol.http.body.client.SubscribeResponseBody;
 import org.apache.eventmesh.common.protocol.http.common.EventMeshRetCode;
@@ -73,13 +72,11 @@ public class SubscribeProcessor implements HttpRequestProcessor {
         SubscribeResponseHeader subscribeResponseHeader =
                 SubscribeResponseHeader.buildHeader(Integer.valueOf(asyncContext.getRequest().getRequestCode()), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshCluster,
                         IPUtil.getLocalAddress(), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEnv,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshRegion,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshDCN, eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
 
 
         //validate header
         if (StringUtils.isBlank(subscribeRequestHeader.getIdc())
-                || StringUtils.isBlank(subscribeRequestHeader.getDcn())
                 || StringUtils.isBlank(subscribeRequestHeader.getPid())
                 || !StringUtils.isNumeric(subscribeRequestHeader.getPid())
                 || StringUtils.isBlank(subscribeRequestHeader.getSys())) {
@@ -92,7 +89,8 @@ public class SubscribeProcessor implements HttpRequestProcessor {
 
         //validate body
         if (StringUtils.isBlank(subscribeRequestBody.getUrl())
-                || CollectionUtils.isEmpty(subscribeRequestBody.getTopics())) {
+                || CollectionUtils.isEmpty(subscribeRequestBody.getTopics())
+                || StringUtils.isBlank(subscribeRequestBody.getConsumerGroup())) {
 
             responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
                     subscribeResponseHeader,
@@ -100,17 +98,17 @@ public class SubscribeProcessor implements HttpRequestProcessor {
             asyncContext.onComplete(responseEventMeshCommand);
             return;
         }
-        List<String> subTopicList = subscribeRequestBody.getTopics();
+        List<SubscriptionItem> subTopicList = subscribeRequestBody.getTopics();
 
         String url = subscribeRequestBody.getUrl();
-        String consumerGroup = EventMeshUtil.buildClientGroup(subscribeRequestHeader.getSys(),
-                subscribeRequestHeader.getDcn());
+        String consumerGroup = subscribeRequestBody.getConsumerGroup();
 
         synchronized (eventMeshHTTPServer.localClientInfoMapping) {
 
+            registerClient(subscribeRequestHeader, consumerGroup, subTopicList, url);
 
-            for (String subTopic : subTopicList) {
-                List<Client> groupTopicClients = eventMeshHTTPServer.localClientInfoMapping.get(consumerGroup + "@" + subTopic);
+            for (SubscriptionItem subTopic : subTopicList) {
+                List<Client> groupTopicClients = eventMeshHTTPServer.localClientInfoMapping.get(consumerGroup + "@" + subTopic.getTopic());
 
                 if (CollectionUtils.isEmpty(groupTopicClients)) {
                     httpLogger.error("group {} topic {} clients is empty", consumerGroup, subTopic);
@@ -132,23 +130,25 @@ public class SubscribeProcessor implements HttpRequestProcessor {
                     consumerGroupConf = new ConsumerGroupConf(consumerGroup);
                     ConsumerGroupTopicConf consumeTopicConfig = new ConsumerGroupTopicConf();
                     consumeTopicConfig.setConsumerGroup(consumerGroup);
-                    consumeTopicConfig.setTopic(subTopic);
+                    consumeTopicConfig.setTopic(subTopic.getTopic());
+                    consumeTopicConfig.setSubscriptionItem(subTopic);
                     consumeTopicConfig.setUrls(new HashSet<>(Arrays.asList(url)));
 
                     consumeTopicConfig.setIdcUrls(idcUrls);
 
                     Map<String, ConsumerGroupTopicConf> map = new HashMap<>();
-                    map.put(subTopic, consumeTopicConfig);
+                    map.put(subTopic.getTopic(), consumeTopicConfig);
                     consumerGroupConf.setConsumerGroupTopicConf(map);
                 } else {
                     // 已有订阅
                     Map<String, ConsumerGroupTopicConf> map = consumerGroupConf.getConsumerGroupTopicConf();
                     for (String key : map.keySet()) {
-                        if (StringUtils.equals(subTopic, key)) {
+                        if (StringUtils.equals(subTopic.getTopic(), key)) {
                             ConsumerGroupTopicConf latestTopicConf = new ConsumerGroupTopicConf();
                             ConsumerGroupTopicConf currentTopicConf = map.get(key);
                             latestTopicConf.setConsumerGroup(consumerGroup);
-                            latestTopicConf.setTopic(subTopic);
+                            latestTopicConf.setTopic(subTopic.getTopic());
+                            latestTopicConf.setSubscriptionItem(subTopic);
                             latestTopicConf.setUrls(new HashSet<>(Arrays.asList(url)));
                             latestTopicConf.getUrls().addAll(currentTopicConf.getUrls());
 
@@ -206,4 +206,40 @@ public class SubscribeProcessor implements HttpRequestProcessor {
         return false;
     }
 
+    private void registerClient(SubscribeRequestHeader subscribeRequestHeader, String consumerGroup,
+                                      List<SubscriptionItem> subscriptionItems, String url) {
+        for(SubscriptionItem item: subscriptionItems) {
+            Client client = new Client();
+            client.env = subscribeRequestHeader.getEnv();
+            client.idc = subscribeRequestHeader.getIdc();
+            client.sys = subscribeRequestHeader.getSys();
+            client.ip = subscribeRequestHeader.getIp();
+            client.pid = subscribeRequestHeader.getPid();
+            client.consumerGroup = consumerGroup;
+            client.topic = item.getTopic();
+            client.url = url;
+            client.lastUpTime = new Date();
+
+            String groupTopicKey = client.consumerGroup + "@" + client.topic;
+
+            if (eventMeshHTTPServer.localClientInfoMapping.containsKey(groupTopicKey)) {
+                List<Client> localClients = eventMeshHTTPServer.localClientInfoMapping.get(groupTopicKey);
+                boolean isContains = false;
+                for (Client localClient : localClients) {
+                    if (StringUtils.equals(localClient.url, client.url)) {
+                        isContains = true;
+                        localClient.lastUpTime = client.lastUpTime;
+                        break;
+                    }
+                }
+                if (!isContains) {
+                    localClients.add(client);
+                }
+            } else {
+                List<Client> clients = new ArrayList<>();
+                clients.add(client);
+                eventMeshHTTPServer.localClientInfoMapping.put(groupTopicKey, clients);
+            }
+        }
+    }
 }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/UnSubscribeProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/UnSubscribeProcessor.java
index 67ab9fd..d457812 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/UnSubscribeProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/UnSubscribeProcessor.java
@@ -18,18 +18,15 @@
 package org.apache.eventmesh.runtime.core.protocol.http.processor;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
 import com.alibaba.fastjson.JSONObject;
-
 import io.netty.channel.ChannelHandlerContext;
-
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.eventmesh.common.IPUtil;
@@ -44,10 +41,8 @@ import org.apache.eventmesh.runtime.boot.EventMeshHTTPServer;
 import org.apache.eventmesh.runtime.constants.EventMeshConstants;
 import org.apache.eventmesh.runtime.core.consumergroup.ConsumerGroupConf;
 import org.apache.eventmesh.runtime.core.consumergroup.ConsumerGroupTopicConf;
-import org.apache.eventmesh.runtime.core.consumergroup.event.ConsumerGroupStateEvent;
 import org.apache.eventmesh.runtime.core.protocol.http.async.AsyncContext;
 import org.apache.eventmesh.runtime.core.protocol.http.async.CompleteHandler;
-import org.apache.eventmesh.runtime.core.protocol.http.consumer.ConsumerGroupManager;
 import org.apache.eventmesh.runtime.core.protocol.http.processor.inf.Client;
 import org.apache.eventmesh.runtime.core.protocol.http.processor.inf.HttpRequestProcessor;
 import org.apache.eventmesh.runtime.util.EventMeshUtil;
@@ -77,13 +72,11 @@ public class UnSubscribeProcessor implements HttpRequestProcessor {
         UnSubscribeResponseHeader unSubscribeResponseHeader =
                 UnSubscribeResponseHeader.buildHeader(Integer.valueOf(asyncContext.getRequest().getRequestCode()), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshCluster,
                         IPUtil.getLocalAddress(), eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEnv,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshRegion,
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshDCN, eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIDC);
 
 
         //validate header
         if (StringUtils.isBlank(unSubscribeRequestHeader.getIdc())
-                || StringUtils.isBlank(unSubscribeRequestHeader.getDcn())
                 || StringUtils.isBlank(unSubscribeRequestHeader.getPid())
                 || !StringUtils.isNumeric(unSubscribeRequestHeader.getPid())
                 || StringUtils.isBlank(unSubscribeRequestHeader.getSys())) {
@@ -96,7 +89,8 @@ public class UnSubscribeProcessor implements HttpRequestProcessor {
 
         //validate body
         if (StringUtils.isBlank(unSubscribeRequestBody.getUrl())
-                || CollectionUtils.isEmpty(unSubscribeRequestBody.getTopics())) {
+                || CollectionUtils.isEmpty(unSubscribeRequestBody.getTopics())
+                || StringUtils.isBlank(unSubscribeRequestBody.getConsumerGroup())) {
 
             responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
                     unSubscribeResponseHeader,
@@ -105,13 +99,11 @@ public class UnSubscribeProcessor implements HttpRequestProcessor {
             return;
         }
         String env = unSubscribeRequestHeader.getEnv();
-        String dcn = unSubscribeRequestHeader.getDcn();
         String idc = unSubscribeRequestHeader.getIdc();
         String sys = unSubscribeRequestHeader.getSys();
         String ip = unSubscribeRequestHeader.getIp();
         String pid = unSubscribeRequestHeader.getPid();
-        String consumerGroup = EventMeshUtil.buildClientGroup(unSubscribeRequestHeader.getSys(),
-                unSubscribeRequestHeader.getDcn());
+        String consumerGroup = unSubscribeRequestBody.getConsumerGroup();
         String unSubscribeUrl = unSubscribeRequestBody.getUrl();
         List<String> unSubTopicList = unSubscribeRequestBody.getTopics();
 
@@ -131,12 +123,15 @@ public class UnSubscribeProcessor implements HttpRequestProcessor {
 
         synchronized (eventMeshHTTPServer.localClientInfoMapping) {
             boolean isChange = true;
+
+            registerClient(unSubscribeRequestHeader, consumerGroup, unSubTopicList, unSubscribeUrl);
+
             for (String unSubTopic : unSubTopicList) {
                 List<Client> groupTopicClients = eventMeshHTTPServer.localClientInfoMapping.get(consumerGroup + "@" + unSubTopic);
                 Iterator<Client> clientIterator = groupTopicClients.iterator();
                 while (clientIterator.hasNext()) {
                     Client client = clientIterator.next();
-                    if (StringUtils.equals(client.ip, ip)) {
+                    if (StringUtils.equals(client.pid, pid) && StringUtils.equals(client.url, unSubscribeUrl)) {
                         httpLogger.warn("client {} start unsubscribe", JSONObject.toJSONString(client));
                         clientIterator.remove();
                     }
@@ -168,6 +163,7 @@ public class UnSubscribeProcessor implements HttpRequestProcessor {
                                 ConsumerGroupTopicConf latestTopicConf = new ConsumerGroupTopicConf();
                                 latestTopicConf.setConsumerGroup(consumerGroup);
                                 latestTopicConf.setTopic(unSubTopic);
+                                latestTopicConf.setSubscriptionItem(map.get(topicKey).getSubscriptionItem());
                                 latestTopicConf.setUrls(clientUrls);
 
                                 latestTopicConf.setIdcUrls(idcUrls);
@@ -240,36 +236,39 @@ public class UnSubscribeProcessor implements HttpRequestProcessor {
         return false;
     }
 
-    /**
-     * notify ConsumerManager 组级别
-     */
-    private void notifyConsumerManager(String consumerGroup, ConsumerGroupConf latestConsumerGroupConfig,
-                                       ConcurrentHashMap<String, ConsumerGroupConf> localConsumerGroupMapping) throws Exception {
-        ConsumerGroupManager cgm = eventMeshHTTPServer.getConsumerManager().getConsumer(consumerGroup);
-        if (cgm == null) {
-            ConsumerGroupStateEvent notification = new ConsumerGroupStateEvent();
-            notification.action = ConsumerGroupStateEvent.ConsumerGroupStateAction.NEW;
-            notification.consumerGroup = consumerGroup;
-            notification.consumerGroupConfig = latestConsumerGroupConfig;
-            eventMeshHTTPServer.getEventBus().post(notification);
-            return;
-        }
+    private void registerClient(UnSubscribeRequestHeader unSubscribeRequestHeader, String consumerGroup,
+                                        List<String> topicList, String url) {
+        for(String topic: topicList) {
+            Client client = new Client();
+            client.env = unSubscribeRequestHeader.getEnv();
+            client.idc = unSubscribeRequestHeader.getIdc();
+            client.sys = unSubscribeRequestHeader.getSys();
+            client.ip = unSubscribeRequestHeader.getIp();
+            client.pid = unSubscribeRequestHeader.getPid();
+            client.consumerGroup = consumerGroup;
+            client.topic = topic;
+            client.url = url;
+            client.lastUpTime = new Date();
 
-        if (!latestConsumerGroupConfig.equals(cgm.getConsumerGroupConfig())) {
-            ConsumerGroupStateEvent notification = new ConsumerGroupStateEvent();
-            notification.action = ConsumerGroupStateEvent.ConsumerGroupStateAction.CHANGE;
-            notification.consumerGroup = consumerGroup;
-            notification.consumerGroupConfig = latestConsumerGroupConfig;
-            eventMeshHTTPServer.getEventBus().post(notification);
-            return;
-        }
-
-        if (latestConsumerGroupConfig == null) {
-            ConsumerGroupStateEvent notification = new ConsumerGroupStateEvent();
-            notification.action = ConsumerGroupStateEvent.ConsumerGroupStateAction.DELETE;
-            notification.consumerGroup = consumerGroup;
-            eventMeshHTTPServer.getEventBus().post(notification);
+            String groupTopicKey = client.consumerGroup + "@" + client.topic;
+            if (eventMeshHTTPServer.localClientInfoMapping.containsKey(groupTopicKey)) {
+                List<Client> localClients = eventMeshHTTPServer.localClientInfoMapping.get(groupTopicKey);
+                boolean isContains = false;
+                for (Client localClient : localClients) {
+                    if (StringUtils.equals(localClient.url, client.url)) {
+                        isContains = true;
+                        localClient.lastUpTime = client.lastUpTime;
+                        break;
+                    }
+                }
+                if (!isContains) {
+                    localClients.add(client);
+                }
+            } else {
+                List<Client> clients = new ArrayList<>();
+                clients.add(client);
+                eventMeshHTTPServer.localClientInfoMapping.put(groupTopicKey, clients);
+            }
         }
-        return;
     }
 }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/inf/Client.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/inf/Client.java
index 4387509..1b834d9 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/inf/Client.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/inf/Client.java
@@ -28,8 +28,6 @@ public class Client {
 
     public String env;
 
-    public String dcn;
-
     public String idc;
 
     public String consumerGroup;
@@ -64,7 +62,6 @@ public class Client {
             client.topic = StringUtils.trim(jsonObject.getString("topic"));
             client.url = StringUtils.trim(jsonObject.getString("url"));
             client.sys = StringUtils.trim(jsonObject.getString("sys"));
-            client.dcn = StringUtils.trim(jsonObject.getString("dcn"));
             client.idc = StringUtils.trim(jsonObject.getString("idc"));
             client.ip = StringUtils.trim(jsonObject.getString("ip"));
             client.pid = StringUtils.trim(jsonObject.getString("pid"));
@@ -79,7 +76,6 @@ public class Client {
     public String toString() {
         StringBuilder sb = new StringBuilder();
         sb.append("endPoint={env=").append(env)
-                .append(",dcn=").append(dcn)
                 .append(",idc=").append(idc)
                 .append(",consumerGroup=").append(consumerGroup)
                 .append(",topic=").append(topic)
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/producer/EventMeshProducer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/producer/EventMeshProducer.java
index c5806da..cf41ca2 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/producer/EventMeshProducer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/producer/EventMeshProducer.java
@@ -81,8 +81,7 @@ public class EventMeshProducer {
 
         Properties keyValue = new Properties();
         keyValue.put("producerGroup", producerGroupConfig.getGroupName());
-        keyValue.put("instanceName", EventMeshUtil.buildMeshClientID(producerGroupConfig.getGroupName(),
-                eventMeshHttpConfiguration.eventMeshRegion, eventMeshHttpConfiguration.eventMeshCluster));
+        keyValue.put("instanceName", EventMeshUtil.buildMeshClientID(producerGroupConfig.getGroupName(), eventMeshHttpConfiguration.eventMeshCluster));
 
         //TODO for defibus
         keyValue.put("eventMeshIDC", eventMeshHttpConfiguration.eventMeshIDC);
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/push/AsyncHTTPPushRequest.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/push/AsyncHTTPPushRequest.java
index af71ce8..3ab5649 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/push/AsyncHTTPPushRequest.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/push/AsyncHTTPPushRequest.java
@@ -35,6 +35,7 @@ import org.apache.commons.lang3.time.DateFormatUtils;
 import org.apache.commons.text.RandomStringGenerator;
 import org.apache.eventmesh.common.Constants;
 import org.apache.eventmesh.common.IPUtil;
+import org.apache.eventmesh.common.protocol.SubcriptionType;
 import org.apache.eventmesh.common.protocol.http.body.message.PushMessageRequestBody;
 import org.apache.eventmesh.common.protocol.http.common.ClientRetCode;
 import org.apache.eventmesh.common.protocol.http.common.ProtocolKey;
@@ -88,7 +89,7 @@ public class AsyncHTTPPushRequest extends AbstractHTTPPushRequest {
 
         String requestCode = "";
 
-        if (EventMeshUtil.isService(handleMsgContext.getTopic())) {
+        if (SubcriptionType.SYNC.equals(handleMsgContext.getSubscriptionItem().getType())) {
             requestCode = String.valueOf(RequestCode.HTTP_PUSH_CLIENT_SYNC.getRequestCode());
         } else {
             requestCode = String.valueOf(RequestCode.HTTP_PUSH_CLIENT_ASYNC.getRequestCode());
@@ -99,9 +100,7 @@ public class AsyncHTTPPushRequest extends AbstractHTTPPushRequest {
         builder.addHeader(ProtocolKey.VERSION, ProtocolVersion.V1.getVersion());
         builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER, handleMsgContext.getEventMeshHTTPServer().getEventMeshHttpConfiguration().eventMeshCluster);
         builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, IPUtil.getLocalAddress());
-        builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHDCN, handleMsgContext.getEventMeshHTTPServer().getEventMeshHttpConfiguration().eventMeshDCN);
         builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, handleMsgContext.getEventMeshHTTPServer().getEventMeshHttpConfiguration().eventMeshEnv);
-        builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHREGION, handleMsgContext.getEventMeshHTTPServer().getEventMeshHttpConfiguration().eventMeshRegion);
         builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, handleMsgContext.getEventMeshHTTPServer().getEventMeshHttpConfiguration().eventMeshIDC);
 
         handleMsgContext.getMsg().getUserProperties().put(EventMeshConstants.REQ_EVENTMESH2C_TIMESTAMP, String.valueOf(System.currentTimeMillis()));
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientGroupWrapper.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientGroupWrapper.java
index 35e3048..5829e49 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientGroupWrapper.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientGroupWrapper.java
@@ -30,7 +30,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import com.alibaba.fastjson.JSON;
 
-import io.openmessaging.api.Action;
 import io.openmessaging.api.AsyncConsumeContext;
 import io.openmessaging.api.AsyncMessageListener;
 import io.openmessaging.api.Message;
@@ -40,8 +39,12 @@ import io.openmessaging.api.SendResult;
 
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.eventmesh.api.EventMeshAction;
+import org.apache.eventmesh.api.EventMeshAsyncConsumeContext;
 import org.apache.eventmesh.api.RRCallback;
 import org.apache.eventmesh.common.Constants;
+import org.apache.eventmesh.common.protocol.SubscriptionItem;
+import org.apache.eventmesh.common.protocol.SubscriptionMode;
 import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
 import org.apache.eventmesh.runtime.configuration.EventMeshTCPConfiguration;
 import org.apache.eventmesh.runtime.constants.EventMeshConstants;
@@ -62,11 +65,12 @@ public class ClientGroupWrapper {
 
     public static Logger logger = LoggerFactory.getLogger(ClientGroupWrapper.class);
 
-    private String groupName;
+    private String producerGroup;
 
-    private String sysId;
+    private String consumerGroup;
 
-    private String dcn;
+    //can be sysid + ext(eg dcn)
+    private String sysId;
 
     private EventMeshTCPConfiguration eventMeshTCPConfiguration;
 
@@ -98,24 +102,18 @@ public class ClientGroupWrapper {
 
     private ConcurrentHashMap<String, Set<Session>> topic2sessionInGroupMapping = new ConcurrentHashMap<String, Set<Session>>();
 
-    private ConcurrentHashMap<String, DownStreamMsgContext> downstreamMap = new ConcurrentHashMap<String, DownStreamMsgContext>();
-
-    public ConcurrentHashMap<String, DownStreamMsgContext> getDownstreamMap() {
-        return downstreamMap;
-    }
-
     public AtomicBoolean producerStarted = new AtomicBoolean(Boolean.FALSE);
 
-    public ClientGroupWrapper(String sysId, String dcn,
+    public ClientGroupWrapper(String sysId, String producerGroup, String consumerGroup,
                               EventMeshTCPServer eventMeshTCPServer,
                               DownstreamDispatchStrategy downstreamDispatchStrategy) {
         this.sysId = sysId;
-        this.dcn = dcn;
+        this.producerGroup = producerGroup;
+        this.consumerGroup = consumerGroup;
         this.eventMeshTCPServer = eventMeshTCPServer;
         this.eventMeshTCPConfiguration = eventMeshTCPServer.getEventMeshTCPConfiguration();
         this.eventMeshTcpRetryer = eventMeshTCPServer.getEventMeshTcpRetryer();
         this.eventMeshTcpMonitor = eventMeshTCPServer.getEventMeshTcpMonitor();
-        this.groupName = EventMeshUtil.buildClientGroup(sysId, dcn);
         this.downstreamDispatchStrategy = downstreamDispatchStrategy;
     }
 
@@ -172,8 +170,7 @@ public class ClientGroupWrapper {
     }
 
     public boolean addSubscription(String topic, Session session) throws Exception {
-        if (session == null
-                || !StringUtils.equalsIgnoreCase(groupName, EventMeshUtil.buildClientGroup(session.getClient().getSubsystem(), session.getClient().getDcn()))) {
+        if (session == null || !StringUtils.equalsIgnoreCase(consumerGroup, EventMeshUtil.buildClientGroup(session.getClient().getConsumerGroup()))) {
             logger.error("addSubscription param error,topic:{},session:{}", topic, session);
             return false;
         }
@@ -187,9 +184,9 @@ public class ClientGroupWrapper {
             }
             r = topic2sessionInGroupMapping.get(topic).add(session);
             if (r) {
-                logger.info("addSubscription success, group:{} topic:{} client:{}", groupName, topic, session.getClient());
+                logger.info("addSubscription success, group:{} topic:{} client:{}", consumerGroup, topic, session.getClient());
             } else {
-                logger.warn("addSubscription fail, group:{} topic:{} client:{}", groupName, topic, session.getClient());
+                logger.warn("addSubscription fail, group:{} topic:{} client:{}", consumerGroup, topic, session.getClient());
             }
         } catch (Exception e) {
             logger.error("addSubscription error! topic:{} client:{}", topic, session.getClient(), e);
@@ -202,7 +199,7 @@ public class ClientGroupWrapper {
 
     public boolean removeSubscription(String topic, Session session) {
         if (session == null
-                || !StringUtils.equalsIgnoreCase(groupName, EventMeshUtil.buildClientGroup(session.getClient().getSubsystem(), session.getClient().getDcn()))) {
+                || !StringUtils.equalsIgnoreCase(consumerGroup, EventMeshUtil.buildClientGroup(session.getClient().getConsumerGroup()))) {
             logger.error("removeSubscription param error,topic:{},session:{}", topic, session);
             return false;
         }
@@ -213,14 +210,14 @@ public class ClientGroupWrapper {
             if (topic2sessionInGroupMapping.containsKey(topic)) {
                 r = topic2sessionInGroupMapping.get(topic).remove(session);
                 if (r) {
-                    logger.info("removeSubscription remove session success, group:{} topic:{} client:{}", groupName, topic, session.getClient());
+                    logger.info("removeSubscription remove session success, group:{} topic:{} client:{}", consumerGroup, topic, session.getClient());
                 } else {
-                    logger.warn("removeSubscription remove session failed, group:{} topic:{} client:{}", groupName, topic, session.getClient());
+                    logger.warn("removeSubscription remove session failed, group:{} topic:{} client:{}", consumerGroup, topic, session.getClient());
                 }
             }
             if (CollectionUtils.size(topic2sessionInGroupMapping.get(topic)) == 0) {
                 topic2sessionInGroupMapping.remove(topic);
-                logger.info("removeSubscription remove topic success, group:{} topic:{}", groupName, topic);
+                logger.info("removeSubscription remove topic success, group:{} topic:{}", consumerGroup, topic);
             }
         } catch (Exception e) {
             logger.error("removeSubscription error! topic:{} client:{}", topic, session.getClient(), e);
@@ -237,8 +234,8 @@ public class ClientGroupWrapper {
 
         Properties keyValue = new Properties();
 //        KeyValue keyValue = OMS.newKeyValue();
-        keyValue.put("producerGroup", groupName);
-        keyValue.put("instanceName", EventMeshUtil.buildMeshTcpClientID(sysId, dcn, "PUB", eventMeshTCPConfiguration.eventMeshCluster));
+        keyValue.put("producerGroup", producerGroup);
+        keyValue.put("instanceName", EventMeshUtil.buildMeshTcpClientID(sysId, "PUB", eventMeshTCPConfiguration.eventMeshCluster));
 
         //TODO for defibus
         keyValue.put("eventMeshIDC", eventMeshTCPConfiguration.eventMeshIDC);
@@ -246,7 +243,7 @@ public class ClientGroupWrapper {
         mqProducerWrapper.init(keyValue);
         mqProducerWrapper.start();
         producerStarted.compareAndSet(false, true);
-        logger.info("starting producer success, group:{}", groupName);
+        logger.info("starting producer success, group:{}", producerGroup);
     }
 
     public synchronized void shutdownProducer() throws Exception {
@@ -255,17 +252,28 @@ public class ClientGroupWrapper {
         }
         mqProducerWrapper.shutdown();
         producerStarted.compareAndSet(true, false);
-        logger.info("shutdown producer success for group:{}", groupName);
+        logger.info("shutdown producer success for group:{}", producerGroup);
+    }
+
+    public String getProducerGroup() {
+        return producerGroup;
+    }
+
+    public void setProducerGroup(String producerGroup) {
+        this.producerGroup = producerGroup;
     }
 
+    public String getConsumerGroup() {
+        return consumerGroup;
+    }
 
-    public String getGroupName() {
-        return groupName;
+    public void setConsumerGroup(String consumerGroup) {
+        this.consumerGroup = consumerGroup;
     }
 
     public boolean addGroupConsumerSession(Session session) {
         if (session == null
-                || !StringUtils.equalsIgnoreCase(groupName, EventMeshUtil.buildClientGroup(session.getClient().getSubsystem(), session.getClient().getDcn()))) {
+                || !StringUtils.equalsIgnoreCase(consumerGroup, EventMeshUtil.buildClientGroup(session.getClient().getConsumerGroup()))) {
             logger.error("addGroupConsumerSession param error,session:{}", session);
             return false;
         }
@@ -275,10 +283,10 @@ public class ClientGroupWrapper {
             this.groupLock.writeLock().lockInterruptibly();
             r = groupConsumerSessions.add(session);
             if (r) {
-                logger.info("addGroupConsumerSession success, group:{} client:{}", groupName, session.getClient());
+                logger.info("addGroupConsumerSession success, group:{} client:{}", consumerGroup, session.getClient());
             }
         } catch (Exception e) {
-            logger.error("addGroupConsumerSession error! group:{} client:{}", groupName, session.getClient(), e);
+            logger.error("addGroupConsumerSession error! group:{} client:{}", consumerGroup, session.getClient(), e);
         } finally {
             this.groupLock.writeLock().unlock();
         }
@@ -287,7 +295,7 @@ public class ClientGroupWrapper {
 
     public boolean addGroupProducerSession(Session session) {
         if (session == null
-                || !StringUtils.equalsIgnoreCase(groupName, EventMeshUtil.buildClientGroup(session.getClient().getSubsystem(), session.getClient().getDcn()))) {
+                || !StringUtils.equalsIgnoreCase(producerGroup, EventMeshUtil.buildClientGroup(session.getClient().getProducerGroup()))) {
             logger.error("addGroupProducerSession param error,session:{}", session);
             return false;
         }
@@ -297,10 +305,10 @@ public class ClientGroupWrapper {
             this.groupLock.writeLock().lockInterruptibly();
             r = groupProducerSessions.add(session);
             if (r) {
-                logger.info("addGroupProducerSession success, group:{} client:{}", groupName, session.getClient());
+                logger.info("addGroupProducerSession success, group:{} client:{}", producerGroup, session.getClient());
             }
         } catch (Exception e) {
-            logger.error("addGroupProducerSession error! group:{} client:{}", groupName, session.getClient(), e);
+            logger.error("addGroupProducerSession error! group:{} client:{}", producerGroup, session.getClient(), e);
         } finally {
             this.groupLock.writeLock().unlock();
         }
@@ -309,7 +317,7 @@ public class ClientGroupWrapper {
 
     public boolean removeGroupConsumerSession(Session session) {
         if (session == null
-                || !StringUtils.equalsIgnoreCase(groupName, EventMeshUtil.buildClientGroup(session.getClient().getSubsystem(), session.getClient().getDcn()))) {
+                || !StringUtils.equalsIgnoreCase(consumerGroup, EventMeshUtil.buildClientGroup(session.getClient().getConsumerGroup()))) {
             logger.error("removeGroupConsumerSession param error,session:{}", session);
             return false;
         }
@@ -319,10 +327,10 @@ public class ClientGroupWrapper {
             this.groupLock.writeLock().lockInterruptibly();
             r = groupConsumerSessions.remove(session);
             if (r) {
-                logger.info("removeGroupConsumerSession success, group:{} client:{}", groupName, session.getClient());
+                logger.info("removeGroupConsumerSession success, group:{} client:{}", consumerGroup, session.getClient());
             }
         } catch (Exception e) {
-            logger.error("removeGroupConsumerSession error! group:{} client:{}", groupName, session.getClient(), e);
+            logger.error("removeGroupConsumerSession error! group:{} client:{}", consumerGroup, session.getClient(), e);
         } finally {
             this.groupLock.writeLock().unlock();
         }
@@ -331,7 +339,7 @@ public class ClientGroupWrapper {
 
     public boolean removeGroupProducerSession(Session session) {
         if (session == null
-                || !StringUtils.equalsIgnoreCase(groupName, EventMeshUtil.buildClientGroup(session.getClient().getSubsystem(), session.getClient().getDcn()))) {
+                || !StringUtils.equalsIgnoreCase(producerGroup, EventMeshUtil.buildClientGroup(session.getClient().getProducerGroup()))) {
             logger.error("removeGroupProducerSession param error,session:{}", session);
             return false;
         }
@@ -341,10 +349,10 @@ public class ClientGroupWrapper {
             this.groupLock.writeLock().lockInterruptibly();
             r = groupProducerSessions.remove(session);
             if (r) {
-                logger.info("removeGroupProducerSession success, group:{} client:{}", groupName, session.getClient());
+                logger.info("removeGroupProducerSession success, group:{} client:{}", producerGroup, session.getClient());
             }
         } catch (Exception e) {
-            logger.error("removeGroupProducerSession error! group:{} client:{}", groupName, session.getClient(), e);
+            logger.error("removeGroupProducerSession error! group:{} client:{}", producerGroup, session.getClient(), e);
         } finally {
             this.groupLock.writeLock().unlock();
         }
@@ -359,9 +367,9 @@ public class ClientGroupWrapper {
 
         Properties keyValue = new Properties();
         keyValue.put("isBroadcast", "false");
-        keyValue.put("consumerGroup", groupName);
+        keyValue.put("consumerGroup", consumerGroup);
         keyValue.put("eventMeshIDC", eventMeshTCPConfiguration.eventMeshIDC);
-        keyValue.put("instanceName", EventMeshUtil.buildMeshTcpClientID(sysId, dcn, "SUB", eventMeshTCPConfiguration.eventMeshCluster));
+        keyValue.put("instanceName", EventMeshUtil.buildMeshTcpClientID(sysId, "SUB", eventMeshTCPConfiguration.eventMeshCluster));
 
         persistentMsgConsumer.init(keyValue);
 //        persistentMsgConsumer.registerMessageListener(new EventMeshMessageListenerConcurrently() {
@@ -429,7 +437,7 @@ public class ClientGroupWrapper {
 //            }
 //        });
         inited4Persistent.compareAndSet(false, true);
-        logger.info("init persistentMsgConsumer success, group:{}", groupName);
+        logger.info("init persistentMsgConsumer success, group:{}", consumerGroup);
     }
 
     public synchronized void startClientGroupPersistentConsumer() throws Exception {
@@ -438,7 +446,7 @@ public class ClientGroupWrapper {
         }
         persistentMsgConsumer.start();
         started4Persistent.compareAndSet(false, true);
-        logger.info("starting persistentMsgConsumer success, group:{}", groupName);
+        logger.info("starting persistentMsgConsumer success, group:{}", consumerGroup);
     }
 
     public synchronized void initClientGroupBroadcastConsumer() throws Exception {
@@ -448,9 +456,9 @@ public class ClientGroupWrapper {
 
         Properties keyValue = new Properties();
         keyValue.put("isBroadcast", "true");
-        keyValue.put("consumerGroup", groupName);
+        keyValue.put("consumerGroup", consumerGroup);
         keyValue.put("eventMeshIDC", eventMeshTCPConfiguration.eventMeshIDC);
-        keyValue.put("instanceName", EventMeshUtil.buildMeshTcpClientID(sysId, dcn, "SUB", eventMeshTCPConfiguration.eventMeshCluster));
+        keyValue.put("instanceName", EventMeshUtil.buildMeshTcpClientID(sysId, "SUB", eventMeshTCPConfiguration.eventMeshCluster));
         broadCastMsgConsumer.init(keyValue);
 //        broadCastMsgConsumer.registerMessageListener(new EventMeshMessageListenerConcurrently() {
 //            @Override
@@ -504,7 +512,7 @@ public class ClientGroupWrapper {
 //            }
 //        });
         inited4Broadcast.compareAndSet(false, true);
-        logger.info("init broadCastMsgConsumer success, group:{}", groupName);
+        logger.info("init broadCastMsgConsumer success, group:{}", consumerGroup);
     }
 
     public synchronized void startClientGroupBroadcastConsumer() throws Exception {
@@ -513,12 +521,12 @@ public class ClientGroupWrapper {
         }
         broadCastMsgConsumer.start();
         started4Broadcast.compareAndSet(false, true);
-        logger.info("starting broadCastMsgConsumer success, group:{}", groupName);
+        logger.info("starting broadCastMsgConsumer success, group:{}", consumerGroup);
     }
 
-    public void subscribe(String topic) throws Exception {
+    public void subscribe(SubscriptionItem subscriptionItem) throws Exception {
         AsyncMessageListener listener = null;
-        if (EventMeshUtil.isBroadcast(topic)) {
+        if (SubscriptionMode.BROADCASTING.equals(subscriptionItem.getMode())) {
             listener = new AsyncMessageListener() {
                 @Override
                 public void consume(Message message, AsyncConsumeContext context) {
@@ -528,16 +536,20 @@ public class ClientGroupWrapper {
                     message.getSystemProperties().put(EventMeshConstants.REQ_MQ2EVENTMESH_TIMESTAMP, String.valueOf(System.currentTimeMillis()));
                     message.getSystemProperties().put(EventMeshConstants.REQ_RECEIVE_EVENTMESH_IP, eventMeshTCPConfiguration.eventMeshServerIp);
 
+                    EventMeshAsyncConsumeContext eventMeshAsyncConsumeContext = (EventMeshAsyncConsumeContext) context;
                     if (CollectionUtils.isEmpty(groupConsumerSessions)) {
                         logger.warn("found no session to downstream broadcast msg");
 //                        context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS.name());
 //                        context.ack();
-                        context.commit(Action.CommitMessage);
+                        eventMeshAsyncConsumeContext.commit(EventMeshAction.CommitMessage);
                         return;
                     }
 
                     Iterator<Session> sessionsItr = groupConsumerSessions.iterator();
 
+                    DownStreamMsgContext downStreamMsgContext =
+                            new DownStreamMsgContext(message, null, broadCastMsgConsumer, eventMeshAsyncConsumeContext.getAbstractContext(), false, subscriptionItem);
+
                     while (sessionsItr.hasNext()) {
                         Session session = sessionsItr.next();
 
@@ -546,26 +558,25 @@ public class ClientGroupWrapper {
                             continue;
                         }
 
-                        DownStreamMsgContext downStreamMsgContext =
-                                new DownStreamMsgContext(message, session, broadCastMsgConsumer, broadCastMsgConsumer.getContext(), false);
-
-                        if (session.isCanDownStream()) {
-                            session.downstreamMsg(downStreamMsgContext);
-                            continue;
-                        }
+                        downStreamMsgContext.session = session;
 
-                        logger.warn("downstream broadcast msg,session is busy,dispatch retry,seq:{}, session:{}, bizSeq:{}", downStreamMsgContext.seq, downStreamMsgContext.session.getClient(), EventMeshUtil.getMessageBizSeq(downStreamMsgContext.msgExt));
-                        long delayTime = EventMeshUtil.isService(downStreamMsgContext.msgExt.getSystemProperties(Constants.PROPERTY_MESSAGE_DESTINATION)) ? 0 : eventMeshTCPServer.getEventMeshTCPConfiguration().eventMeshTcpMsgRetryDelayInMills;
-                        downStreamMsgContext.delay(delayTime);
-                        eventMeshTcpRetryer.pushRetry(downStreamMsgContext);
+                        //downstream broadcast msg asynchronously
+                        eventMeshTCPServer.getBroadcastMsgDownstreamExecutorService().submit(new Runnable() {
+                            @Override
+                            public void run() {
+                                //msg put in eventmesh,waiting client ack
+                                session.getPusher().unAckMsg(downStreamMsgContext.seq, downStreamMsgContext);
+                                session.downstreamMsg(downStreamMsgContext);
+                            }
+                        });
                     }
 
 //                    context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_FINISH.name());
 //                    context.ack();
-                    context.commit(Action.CommitMessage);
+                    eventMeshAsyncConsumeContext.commit(EventMeshAction.ManualAck);
                 }
             };
-            broadCastMsgConsumer.subscribe(topic, listener);
+            broadCastMsgConsumer.subscribe(subscriptionItem.getTopic(), listener);
         } else {
             listener = new AsyncMessageListener() {
                 @Override
@@ -575,7 +586,8 @@ public class ClientGroupWrapper {
                     message.getSystemProperties().put(EventMeshConstants.REQ_MQ2EVENTMESH_TIMESTAMP, String.valueOf(System.currentTimeMillis()));
                     message.getSystemProperties().put(EventMeshConstants.REQ_RECEIVE_EVENTMESH_IP, eventMeshTCPConfiguration.eventMeshServerIp);
 
-                    Session session = downstreamDispatchStrategy.select(groupName, topic, groupConsumerSessions);
+                    EventMeshAsyncConsumeContext eventMeshAsyncConsumeContext = (EventMeshAsyncConsumeContext) context;
+                    Session session = downstreamDispatchStrategy.select(consumerGroup, topic, groupConsumerSessions);
                     String bizSeqNo = EventMeshUtil.getMessageBizSeq(message);
                     if (session == null) {
                         try {
@@ -588,14 +600,14 @@ public class ClientGroupWrapper {
                                 sendBackFromEventMeshIp = message.getSystemProperties(EventMeshConstants.EVENTMESH_SEND_BACK_IP);
                             }
 
-                            logger.error("found no session to downstream msg,groupName:{}, topic:{}, bizSeqNo:{}", groupName, topic, bizSeqNo);
+                            logger.error("found no session to downstream msg,groupName:{}, topic:{}, bizSeqNo:{}, sendBackTimes:{}, sendBackFromEventMeshIp:{}", consumerGroup, topic, bizSeqNo, sendBackTimes, sendBackFromEventMeshIp);
 
                             if (sendBackTimes >= eventMeshTCPServer.getEventMeshTCPConfiguration().eventMeshTcpSendBackMaxTimes) {
-                                logger.error("sendBack to broker over max times:{}, groupName:{}, topic:{}, bizSeqNo:{}", eventMeshTCPServer.getEventMeshTCPConfiguration().eventMeshTcpSendBackMaxTimes, groupName, topic, bizSeqNo);
+                                logger.error("sendBack to broker over max times:{}, groupName:{}, topic:{}, bizSeqNo:{}", eventMeshTCPServer.getEventMeshTCPConfiguration().eventMeshTcpSendBackMaxTimes, consumerGroup, topic, bizSeqNo);
                             } else {
                                 sendBackTimes++;
                                 message.getSystemProperties().put(EventMeshConstants.EVENTMESH_SEND_BACK_TIMES, sendBackTimes.toString());
-                                message.getSystemProperties().put(EventMeshConstants.EVENTMESH_SEND_BACK_IP, sendBackFromEventMeshIp);
+                                message.getSystemProperties().put(EventMeshConstants.EVENTMESH_SEND_BACK_IP, eventMeshTCPConfiguration.eventMeshServerIp);
                                 sendMsgBackToBroker(message, bizSeqNo);
                             }
                         } catch (Exception e) {
@@ -604,53 +616,36 @@ public class ClientGroupWrapper {
 
 //                        context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_SUCCESS.name());
 //                        context.ack();
-                        context.commit(Action.CommitMessage);
+                        eventMeshAsyncConsumeContext.commit(EventMeshAction.CommitMessage);
                         return;
                     }
 
                     DownStreamMsgContext downStreamMsgContext =
-                            new DownStreamMsgContext(message, session, persistentMsgConsumer, persistentMsgConsumer.getContext(), false);
-
-                    if (downstreamMap.size() < eventMeshTCPServer.getEventMeshTCPConfiguration().eventMeshTcpDownStreamMapSize) {
-                        downstreamMap.putIfAbsent(downStreamMsgContext.seq, downStreamMsgContext);
-                    } else {
-                        logger.warn("downStreamMap is full,group:{}", groupName);
-                    }
-
-                    if (session.isCanDownStream()) {
-                        session.downstreamMsg(downStreamMsgContext);
-//                        context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_FINISH.name());
-//                        context.ack();
-                        context.commit(Action.CommitMessage);
-                        return;
-                    }
-
-                    logger.warn("session is busy,dispatch retry,seq:{}, session:{}, bizSeq:{}", downStreamMsgContext.seq, downStreamMsgContext.session.getClient(), bizSeqNo);
-                    long delayTime = EventMeshUtil.isService(downStreamMsgContext.msgExt.getSystemProperties(Constants.PROPERTY_MESSAGE_DESTINATION)) ? 0 : eventMeshTCPServer.getEventMeshTCPConfiguration().eventMeshTcpMsgRetryDelayInMills;
-                    downStreamMsgContext.delay(delayTime);
-                    eventMeshTcpRetryer.pushRetry(downStreamMsgContext);
-
+                            new DownStreamMsgContext(message, session, persistentMsgConsumer, eventMeshAsyncConsumeContext.getAbstractContext(), false, subscriptionItem);
+                    //msg put in eventmesh,waiting client ack
+                    session.getPusher().unAckMsg(downStreamMsgContext.seq, downStreamMsgContext);
+                    session.downstreamMsg(downStreamMsgContext);
 //                    context.attributes().put(NonStandardKeys.MESSAGE_CONSUME_STATUS, EventMeshConsumeConcurrentlyStatus.CONSUME_FINISH.name());
 //                    context.ack();
-                    context.commit(Action.CommitMessage);
+                    eventMeshAsyncConsumeContext.commit(EventMeshAction.ManualAck);
                 }
             };
-            persistentMsgConsumer.subscribe(topic, listener);
+            persistentMsgConsumer.subscribe(subscriptionItem.getTopic(), listener);
         }
     }
 
-    public void unsubscribe(String topic) throws Exception {
-        if (EventMeshUtil.isBroadcast(topic)) {
-            broadCastMsgConsumer.unsubscribe(topic);
+    public void unsubscribe(SubscriptionItem subscriptionItem) throws Exception {
+        if (SubscriptionMode.BROADCASTING.equals(subscriptionItem.getMode())) {
+            broadCastMsgConsumer.unsubscribe(subscriptionItem.getTopic());
         } else {
-            persistentMsgConsumer.unsubscribe(topic);
+            persistentMsgConsumer.unsubscribe(subscriptionItem.getTopic());
         }
     }
 
     public synchronized void shutdownBroadCastConsumer() throws Exception {
         if (started4Broadcast.get()) {
             broadCastMsgConsumer.shutdown();
-            logger.info("broadcast consumer group:{} shutdown...", groupName);
+            logger.info("broadcast consumer group:{} shutdown...", consumerGroup);
         }
         started4Broadcast.compareAndSet(true, false);
         inited4Broadcast.compareAndSet(true, false);
@@ -661,7 +656,7 @@ public class ClientGroupWrapper {
 
         if (started4Persistent.get()) {
             persistentMsgConsumer.shutdown();
-            logger.info("persistent consumer group:{} shutdown...", groupName);
+            logger.info("persistent consumer group:{} shutdown...", consumerGroup);
         }
         started4Persistent.compareAndSet(true, false);
         inited4Persistent.compareAndSet(true, false);
@@ -669,32 +664,11 @@ public class ClientGroupWrapper {
     }
 
     public Set<Session> getGroupConsumerSessions() {
-        Set<Session> res = null;
-        try {
-            this.groupLock.readLock().lockInterruptibly();
-            res = groupConsumerSessions;
-        } catch (Exception e) {
-        } finally {
-            this.groupLock.readLock().unlock();
-        }
-        return res;
+        return groupConsumerSessions;
     }
 
-
     public Set<Session> getGroupProducerSessions() {
-        Set<Session> res = null;
-        try {
-            this.groupLock.readLock().lockInterruptibly();
-            res = groupProducerSessions;
-        } catch (Exception e) {
-        } finally {
-            this.groupLock.readLock().unlock();
-        }
-        return res;
-    }
-
-    public void setGroupName(String groupName) {
-        this.groupName = groupName;
+        return groupProducerSessions;
     }
 
     public EventMeshTCPConfiguration getEventMeshTCPConfiguration() {
@@ -744,7 +718,7 @@ public class ClientGroupWrapper {
             paramValues.add("msg");
             paramValues.add(JSON.toJSONString(msg));
             paramValues.add("group");
-            paramValues.add(groupName);
+            paramValues.add(consumerGroup);
 
             result = HttpTinyClient.httpPost(
                     targetUrl.toString(),
@@ -778,12 +752,12 @@ public class ClientGroupWrapper {
             send(new UpStreamMsgContext(null, null, msg), new SendCallback() {
                 @Override
                 public void onSuccess(SendResult sendResult) {
-                    logger.info("consumerGroup:{} consume fail, sendMessageBack success, bizSeqno:{}, topic:{}", groupName, bizSeqNo, topic);
+                    logger.info("consumerGroup:{} consume fail, sendMessageBack success, bizSeqno:{}, topic:{}", consumerGroup, bizSeqNo, topic);
                 }
 
                 @Override
                 public void onException(OnExceptionContext context) {
-                    logger.warn("consumerGroup:{} consume fail, sendMessageBack fail, bizSeqno:{}, topic:{}", groupName, bizSeqNo, topic);
+                    logger.warn("consumerGroup:{} consume fail, sendMessageBack fail, bizSeqno:{}, topic:{}", consumerGroup, bizSeqNo, topic);
                 }
 
 //                @Override
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientSessionGroupMapping.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientSessionGroupMapping.java
index a33baf1..a5a4b40 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientSessionGroupMapping.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientSessionGroupMapping.java
@@ -19,15 +19,11 @@ package org.apache.eventmesh.runtime.core.protocol.tcp.client.group;
 
 import java.lang.ref.WeakReference;
 import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
 
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelFutureListener;
@@ -37,6 +33,8 @@ import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.eventmesh.common.Constants;
 import org.apache.eventmesh.common.ThreadUtil;
+import org.apache.eventmesh.common.protocol.SubscriptionItem;
+import org.apache.eventmesh.common.protocol.SubscriptionMode;
 import org.apache.eventmesh.common.protocol.tcp.UserAgent;
 import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
 import org.apache.eventmesh.runtime.constants.EventMeshConstants;
@@ -45,7 +43,6 @@ import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.dispatch.Down
 import org.apache.eventmesh.runtime.core.protocol.tcp.client.group.dispatch.FreePriorityDispatchStrategy;
 import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.Session;
 import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.SessionState;
-import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.push.ClientAckContext;
 import org.apache.eventmesh.runtime.core.protocol.tcp.client.session.push.DownStreamMsgContext;
 import org.apache.eventmesh.runtime.util.EventMeshUtil;
 import org.apache.eventmesh.runtime.util.RemotingHelper;
@@ -59,9 +56,9 @@ public class ClientSessionGroupMapping {
 
     private ConcurrentHashMap<InetSocketAddress, Session> sessionTable = new ConcurrentHashMap<>();
 
-    private ConcurrentHashMap<String /** groupName*/, ClientGroupWrapper> clientGroupMap = new ConcurrentHashMap<String, ClientGroupWrapper>();
+    private ConcurrentHashMap<String /** subsystem eg . 5109 or 5109-1A0 */, ClientGroupWrapper> clientGroupMap = new ConcurrentHashMap<String, ClientGroupWrapper>();
 
-    private ConcurrentHashMap<String /** groupName*/, Object> lockMap = new ConcurrentHashMap<String, Object>();
+    private ConcurrentHashMap<String /** subsystem eg . 5109 or 5109-1A0 */, Object> lockMap = new ConcurrentHashMap<String, Object>();
 
     private EventMeshTCPServer eventMeshTCPServer;
 
@@ -77,8 +74,8 @@ public class ClientSessionGroupMapping {
         this.eventMeshTCPServer = eventMeshTCPServer;
     }
 
-    public ClientGroupWrapper getClientGroupWrapper(String groupName) {
-        return MapUtils.getObject(clientGroupMap, groupName, null);
+    public ClientGroupWrapper getClientGroupWrapper(String sysId) {
+        return MapUtils.getObject(clientGroupMap, sysId, null);
     }
 
     public Session getSession(ChannelHandlerContext ctx) {
@@ -179,30 +176,28 @@ public class ClientSessionGroupMapping {
         }
     }
 
-    private ClientGroupWrapper constructClientGroupWrapper(String sysId, String dcn,
+    private ClientGroupWrapper constructClientGroupWrapper(String sysId, String producerGroup, String consumerGroup,
                                                            EventMeshTCPServer eventMeshTCPServer,
                                                            DownstreamDispatchStrategy downstreamDispatchStrategy) {
-        return new ClientGroupWrapper(sysId, dcn
-                , eventMeshTCPServer, downstreamDispatchStrategy);
+        return new ClientGroupWrapper(sysId, producerGroup, consumerGroup, eventMeshTCPServer, downstreamDispatchStrategy);
     }
 
     private void initClientGroupWrapper(UserAgent user, Session session) throws Exception {
-        final String clientGroup = EventMeshUtil.buildClientGroup(user.getSubsystem(), user.getDcn());
-        if (!lockMap.containsKey(clientGroup)) {
-            Object obj = lockMap.putIfAbsent(clientGroup, new Object());
+        if (!lockMap.containsKey(user.getSubsystem())) {
+            Object obj = lockMap.putIfAbsent(user.getSubsystem(), new Object());
             if (obj == null) {
-                logger.info("add lock to map for group:{}", clientGroup);
+                logger.info("add lock to map for subsystem:{}", user.getSubsystem());
             }
         }
-        synchronized (lockMap.get(clientGroup)) {
-            if (!clientGroupMap.containsKey(clientGroup)) {
-                ClientGroupWrapper cgw = constructClientGroupWrapper(user.getSubsystem(), user.getDcn()
-                        , eventMeshTCPServer, new FreePriorityDispatchStrategy());
-                clientGroupMap.put(clientGroup, cgw);
-                logger.info("create new ClientGroupWrapper,group:{}", clientGroup);
+        synchronized (lockMap.get(user.getSubsystem())) {
+            if (!clientGroupMap.containsKey(user.getSubsystem())) {
+                ClientGroupWrapper cgw = constructClientGroupWrapper(user.getSubsystem(), user.getProducerGroup(),
+                        user.getConsumerGroup(), eventMeshTCPServer, new FreePriorityDispatchStrategy());
+                clientGroupMap.put(user.getSubsystem(), cgw);
+                logger.info("create new ClientGroupWrapper, subsystem:{}", user.getSubsystem());
             }
 
-            ClientGroupWrapper cgw = clientGroupMap.get(clientGroup);
+            ClientGroupWrapper cgw = clientGroupMap.get(user.getSubsystem());
 
             if (EventMeshConstants.PURPOSE_PUB.equals(user.getPurpose())) {
                 startClientGroupProducer(cgw, session);
@@ -243,11 +238,10 @@ public class ClientSessionGroupMapping {
     }
 
     private void startClientGroupConsumer(Session session) throws Exception {
-        final String clientGroup = EventMeshUtil.buildClientGroup(session.getClient().getSubsystem(), session.getClient().getDcn());
-        if (!lockMap.containsKey(clientGroup)) {
-            lockMap.putIfAbsent(clientGroup, new Object());
+        if (!lockMap.containsKey(session.getClient().getSubsystem())) {
+            lockMap.putIfAbsent(session.getClient().getSubsystem(), new Object());
         }
-        synchronized (lockMap.get(clientGroup)) {
+        synchronized (lockMap.get(session.getClient().getSubsystem())) {
             logger.info("readySession session[{}]", session);
             ClientGroupWrapper cgw = session.getClientGroupWrapper().get();
 
@@ -284,10 +278,10 @@ public class ClientSessionGroupMapping {
      * @param session
      */
     private void cleanSubscriptionInSession(Session session) throws Exception {
-        for (String topic : session.getSessionContext().subscribeTopics.values()) {
-            session.getClientGroupWrapper().get().removeSubscription(topic, session);
-            if (!session.getClientGroupWrapper().get().hasSubscription(topic)) {
-                session.getClientGroupWrapper().get().unsubscribe(topic);
+        for (SubscriptionItem item : session.getSessionContext().subscribeTopics.values()) {
+            session.getClientGroupWrapper().get().removeSubscription(item.getTopic(), session);
+            if (!session.getClientGroupWrapper().get().hasSubscription(item.getTopic())) {
+                session.getClientGroupWrapper().get().unsubscribe(item);
             }
         }
     }
@@ -298,21 +292,24 @@ public class ClientSessionGroupMapping {
      * @param session
      */
     private void handleUnackMsgsInSession(Session session) {
-        ConcurrentHashMap<String /** seq */, ClientAckContext> unAckMsg = session.getPusher().getPushContext().getUnAckMsg();
+        ConcurrentHashMap<String /** seq */, DownStreamMsgContext> unAckMsg = session.getPusher().getUnAckMsg();
         if (unAckMsg.size() > 0 && session.getClientGroupWrapper().get().getGroupConsumerSessions().size() > 0) {
-            for (Map.Entry<String, ClientAckContext> entry : unAckMsg.entrySet()) {
-                ClientAckContext ackContext = entry.getValue();
-                if (EventMeshUtil.isBroadcast(ackContext.getMsgs().get(0).getSystemProperties(Constants.PROPERTY_MESSAGE_DESTINATION))) {
-                    logger.warn("exist broadcast msg unack when closeSession,seq:{},bizSeq:{},client:{}", ackContext.getSeq(), EventMeshUtil.getMessageBizSeq(ackContext.getMsgs().get(0)), session.getClient());
+            for (Map.Entry<String, DownStreamMsgContext> entry : unAckMsg.entrySet()) {
+                DownStreamMsgContext downStreamMsgContext = entry.getValue();
+                if (SubscriptionMode.BROADCASTING.equals(downStreamMsgContext.subscriptionItem.getMode())) {
+                    logger.warn("exist broadcast msg unack when closeSession,seq:{},bizSeq:{},client:{}", downStreamMsgContext.seq, EventMeshUtil.getMessageBizSeq(downStreamMsgContext.msgExt), session.getClient());
                     continue;
                 }
-                List<Session> list = new ArrayList<>(session.getClientGroupWrapper().get().getGroupConsumerSessions());
-                Collections.shuffle(list);
-                DownStreamMsgContext downStreamMsgContext = new DownStreamMsgContext(ackContext.getMsgs().get(0), list.get(0), ackContext.getConsumer(), ackContext.getContext(), false);
-
-                downStreamMsgContext.delay(0L);
-                eventMeshTCPServer.getEventMeshTcpRetryer().pushRetry(downStreamMsgContext);
-                logger.warn("rePush msg form unAckMsgs,seq:{},rePushSeq:{},rePushClient:{}", entry.getKey(), downStreamMsgContext.seq, downStreamMsgContext.session.getClient());
+                Session reChooseSession = session.getClientGroupWrapper().get().getDownstreamDispatchStrategy().select(session.getClientGroupWrapper().get().getConsumerGroup()
+                        , downStreamMsgContext.msgExt.getTopic()
+                        , session.getClientGroupWrapper().get().groupConsumerSessions);
+                if(reChooseSession != null){
+                    downStreamMsgContext.session = reChooseSession;
+                    reChooseSession.downstreamMsg(downStreamMsgContext);
+                    logger.info("rePush msg form unAckMsgs,seq:{},rePushClient:{}", entry.getKey(), downStreamMsgContext.session.getClient());
+                }else{
+                    logger.warn("select session fail in handleUnackMsgsInSession,seq:{},topic:{}", entry.getKey(), downStreamMsgContext.msgExt.getTopic());
+                }
             }
         }
     }
@@ -328,9 +325,9 @@ public class ClientSessionGroupMapping {
                 && (session.getClientGroupWrapper().get().getGroupProducerSessions().size() == 0)) {
             shutdownClientGroupProducer(session);
 
-            clientGroupMap.remove(session.getClientGroupWrapper().get().getGroupName());
-            lockMap.remove(session.getClientGroupWrapper().get().getGroupName());
-            logger.info("remove clientGroupWrapper group[{}]", session.getClientGroupWrapper().get().getGroupName());
+            clientGroupMap.remove(session.getClientGroupWrapper().get().getSysId());
+            lockMap.remove(session.getClientGroupWrapper().get().getSysId());
+            logger.info("remove clientGroupWrapper subsystem[{}]", session.getClientGroupWrapper().get().getSysId());
         }
     }
 
@@ -371,46 +368,25 @@ public class ClientSessionGroupMapping {
         }, 1000, eventMeshTCPServer.getEventMeshTCPConfiguration().eventMeshTcpSessionExpiredInMills, TimeUnit.MILLISECONDS);
     }
 
-    private void initSessionAckContextCleaner() {
+    private void initDownStreamMsgContextCleaner() {
         eventMeshTCPServer.getScheduler().scheduleAtFixedRate(new Runnable() {
             @Override
             public void run() {
+
+                //scan non-broadcast msg
                 Iterator<Session> sessionIterator = sessionTable.values().iterator();
                 while (sessionIterator.hasNext()) {
                     Session tmp = sessionIterator.next();
-                    for (Map.Entry<String, ClientAckContext> entry : tmp.getPusher().getPushContext().getUnAckMsg().entrySet()) {
+                    for (Map.Entry<String, DownStreamMsgContext> entry : tmp.getPusher().getUnAckMsg().entrySet()) {
                         String seqKey = entry.getKey();
-                        ClientAckContext clientAckContext = entry.getValue();
-                        if (!clientAckContext.isExpire()) {
-                            continue;
-                        }
-                        tmp.getPusher().getPushContext().ackMsg(seqKey);
-                        tmp.getPusher().getPushContext().getUnAckMsg().remove(seqKey);
-                        logger.warn("remove expire clientAckContext, session:{}, topic:{}, seq:{}", tmp,
-                                clientAckContext.getMsgs().get(0).getSystemProperties(Constants.PROPERTY_MESSAGE_DESTINATION), seqKey);
-                    }
-                }
-            }
-        }, 1000, 5 * 1000, TimeUnit.MILLISECONDS);
-    }
-
-    private void initDownStreamMsgContextCleaner() {
-        eventMeshTCPServer.getScheduler().scheduleAtFixedRate(new Runnable() {
-            @Override
-            public void run() {
-                Iterator<ClientGroupWrapper> cgwIterator = clientGroupMap.values().iterator();
-                while (cgwIterator.hasNext()) {
-                    ClientGroupWrapper cgw = cgwIterator.next();
-                    for (Map.Entry<String, DownStreamMsgContext> entry : cgw.getDownstreamMap().entrySet()) {
-                        String seq = entry.getKey();
                         DownStreamMsgContext downStreamMsgContext = entry.getValue();
                         if (!downStreamMsgContext.isExpire()) {
                             continue;
                         }
-                        cgw.getDownstreamMap().get(seq).ackMsg();
-                        cgw.getDownstreamMap().remove(seq);
-                        logger.warn("remove expire DownStreamMsgContext,group:{}, topic:{}, seq:{}", cgw.getGroupName(),
-                                downStreamMsgContext.msgExt.getSystemProperties(Constants.PROPERTY_MESSAGE_DESTINATION), seq);
+                        downStreamMsgContext.ackMsg();
+                        tmp.getPusher().getUnAckMsg().remove(seqKey);
+                        logger.warn("remove expire downStreamMsgContext, session:{}, topic:{}, seq:{}", tmp,
+                                downStreamMsgContext.msgExt.getSystemProperties(Constants.PROPERTY_MESSAGE_DESTINATION), seqKey);
                     }
                 }
             }
@@ -420,7 +396,6 @@ public class ClientSessionGroupMapping {
 
     public void init() throws Exception {
         initSessionCleaner();
-        initSessionAckContextCleaner();
         initDownStreamMsgContextCleaner();
         logger.info("ClientSessionGroupMapping inited......");
     }
@@ -450,40 +425,6 @@ public class ClientSessionGroupMapping {
         return clientGroupMap;
     }
 
-    public HashMap<String, AtomicInteger> statDCNSystemInfo() {
-        HashMap<String, AtomicInteger> result = new HashMap<String, AtomicInteger>();
-        if (!sessionTable.isEmpty()) {
-            for (Session session : sessionTable.values()) {
-                String key = session.getClient().getDcn() + "|" + session.getClient().getSubsystem();
-                if (!result.containsKey(key)) {
-                    result.put(key, new AtomicInteger(1));
-                } else {
-                    result.get(key).incrementAndGet();
-                }
-            }
-        }
-        return result;
-    }
-
-    public HashMap<String, AtomicInteger> statDCNSystemInfoByPurpose(String purpose) {
-        HashMap<String, AtomicInteger> result = new HashMap<String, AtomicInteger>();
-        if (!sessionTable.isEmpty()) {
-            for (Session session : sessionTable.values()) {
-                if (!StringUtils.equals(session.getClient().getPurpose(), purpose)) {
-                    continue;
-                }
-
-                String key = session.getClient().getDcn() + "|" + session.getClient().getSubsystem() + "|" + purpose;
-                if (!result.containsKey(key)) {
-                    result.put(key, new AtomicInteger(1));
-                } else {
-                    result.get(key).incrementAndGet();
-                }
-            }
-        }
-        return result;
-    }
-
     public Map<String, Map<String, Integer>> prepareEventMeshClientDistributionData() {
         Map<String, Map<String, Integer>> result = null;
 
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java
index 7797158..4e9e4d5 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java
@@ -41,25 +41,26 @@ public class FreePriorityDispatchStrategy implements DownstreamDispatchStrategy
         }
 
         List<Session> filtered = new ArrayList<Session>();
-        List<Session> canDownSessions = new ArrayList<>();
+        List<Session> isolatedSessions = new ArrayList<>();
         for (Session session : groupConsumerSessions) {
             if (!session.isAvailable(topic)) {
                 continue;
             }
-            if (session.isDownStreamBusy()) {
... 3587 lines suppressed ...

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@eventmesh.apache.org
For additional commands, e-mail: commits-help@eventmesh.apache.org