首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

ActiveMQ 高可用架構演進:從 ZooKeeper 到 Networks of Brokers 方案深度對比

     編輯:Java 綜合教學

ActiveMQ 高可用架構演進:從 ZooKeeper 到 Networks of Brokers 方案深度對比

Broker 核心角色

Broker(代理人/中間人) 是 ActiveMQ 消息中轉的核心節點。生產者發送消息給 Broker,Broker 持久化後確認;消費者從 Broker 拉取消息,消費確認後 Broker 標記刪除。Broker 解耦了生產/消費雙方的拓撲與時間依賴。

方案一:ZooKeeper + Master/Slave(舊架構)

架構圖解

[Producer] --> [Broker Master] <--同步--> [Broker Slave1] [Broker Slave2]
                    ^                     ^
                    |   ZooKeeper 集群 (3+ 節點)  |
                    +---------------------------+
        [Consumer] 連接 Master,Master 掛掉 ZK 選舉新 Master

缺點

  • 資源浪費:ZK 集群 3 節點 + Broker 集群 3 節點 = 6 節點,但僅 1 個 Master 服務流量。
  • 性能損耗大:同步複製 + ZK 協調開銷,吞吐量下降近 1 個數量級。
  • 運維複雜:需維護兩套獨立集群,故障域擴大。

方案二:Networks of Brokers(推薦生產)

核心思想

通過 networkConnector 將多個 Broker 組成網狀拓撲,消息在 Broker 間自動轉發,實現「多活」:所有 Broker 同時對外服務,無主從切換延遲。

雙節點互備配置示例

Broker A (activemq-1, 端口 61616)

<broker xmlns="https://activemq.apache.org/schema/core" brokerName="activemq-1">
    <networkConnectors>
        <networkConnector uri="static:(tcp://127.0.0.1:61626)"/>
    </networkConnectors>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    <persistenceAdapter>
        <kahaDB directory="${activemq.data}/kahadb"/>
    </persistenceAdapter>
</broker>

Broker B (activemq-2, 端口 61626)

<broker xmlns="https://activemq.apache.org/schema/core" brokerName="activemq-2">
    <networkConnectors>
        <networkConnector uri="static:(tcp://127.0.0.1:61616)"/>
    </networkConnectors>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61626?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    <persistenceAdapter>
        <kahaDB directory="${activemq.data}/kahadb"/>
    </persistenceAdapter>
</broker>

客戶端連接配置(故障轉移)

<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
    <property name="connectionFactory">
        <bean class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL" value="failover:(tcp://localhost:61616,tcp://localhost:61626)"/>
        </bean>
    </property>
</bean>

優勢

  • 節點數少:僅需 2 節點即可雙活,線性擴展至 N 節點。
  • 性能優:無中心協調節點,消息就近轉發,吞吐接近單節點總和。
  • 多活服務:生產者/消費者可連任意節點,負載均衡天然實現。
  • 無第三方依賴:移除 ZK,架構簡潔,故障域縮小。

關鍵配置參數解析

參數建議值說明
networkConnector.uristatic:(tcp://host:port)靜態指定對端 Broker,生產建議使用 DNS/負載均衡器
duplextrue雙向橋接,消息雙向流動(默認 false 單向)
conduitSubscriptionstrue合併訂閱,避免重複消費
decreaseNetworkConsumerPrioritytrue遠端消費者優先級較低,優先本地消費

生產環境擴展建議

  1. 多機房部署:跨可用區建立 Network of Brokers,配置 networkTTL 控制消息跳數。
  2. 消息分組:使用 messageGroup 保證同組消息順序消費。
  3. 監控告警:整合 Prometheus + Grafana 監控 QueueSize、EnqueueRate、DequeueRate、MemoryPercentUsage。
  4. 網絡分區應對:設置 failoverTransport 參數 maxReconnectAttempts、initialReconnectDelay,避免腦裂。

總結對比

維度ZooKeeper Master/SlaveNetworks of Brokers
最小節點數6 (3 ZK + 3 Broker)2
服務模式單活多活
故障切換時間秒級 (ZK 選舉)毫秒級 (客戶端 failover)
吞吐性能基線 10%接近單節點 N 倍
運維複雜度高低
適用場景強一致性要求極高、團隊熟悉 ZK 運維高吞吐、高可用、追求架構簡潔的多數業務

參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved