優缺點
消息隊列的優點:
- 實現系統解耦:
:::color5
系統解耦解釋
有 MQ 時是 “服務 A 發消息到隊列,其他服務從隊列拿消息,新增服務接隊列就行”;無 MQ 時是 “服務 A 直接調其他服務的接口 / 依賴,新增 / 變更服務時 A 得改代碼適配”(有 MQ 時服務間依賴弱,無 MQ 時依賴強、改動影響大)。
有mq:
沒有mq:
:::
- 實現異步調用
:::color5
異步調用解釋
有 MQ 的情況 服務 A 不需要等待服務 B、C、D 處理完任務才繼續自己的工作。服務 A 只需把要處理的任務(消息)發送到 MQ 中,然后就可以立即去做其他事情了。而服務 B、C、D 會各自從 MQ 里獲取任務,然后在后臺異步地去處理這些任務,彼此之間互不干擾,實現了任務的異步執行。
沒有 MQ 的情況 服務 A 調用服務 B、C、D 時,必須等待服務 B、C、D 把當前的任務處理完成,得到返回結果后,服務 A 才能繼續進行后續的操作,整個過程是同步的,會造成服務 A 等待時間長,資源利用效率低。
與線程的區別:
- 適用范圍:MQ 適用于跨服務 / 分布式場景,線程適用于單進程內部
- 耦合程度:MQ 實現服務解耦,線程間通常存在較強耦合
【因為mq生產者只需要關心消息發送,消費者只需要關心接受,耦合度不高,而線程通常在一個程序內部,共享內存等,如果一個線程的邏輯或接口發生變化,會影響到其他協作的進程】
- 可靠性:MQ 自帶消息持久化,線程需額外處理數據安全
- 擴展性:MQ 可輕松橫向擴展消費者,線程數量受系統資源限制
:::
- 流量削峰
缺點:
- 系統可用性降低【如果mq宕機了,那么服務就都宕機了】
- 提升系統的復雜度【中間件越多,系統越復雜】
- 數據一致性問題【與原生的相比,需要處理數據一致性問題】
消息隊列的分類與選擇
- Kafka:分布式消息系統,性能高、支持多語言,分布式架構有副本機制,可靠性高,適合日志等場景,但隊列 / 分區過多時負載和響應時間受影響,實時性依賴輪詢間隔,消費失敗不支持重試且社區更新慢。
- RocketMQ:阿里開源,Java 實現,消息可靠性好,單機支持大量持久化隊列,性能優、支持多種消費模式,分布式擴展好且版本更新快,但客戶端語言支持少,社區成熟度及關注度不及 Kafka,無 Web 管理界面且未在核心實現 JMS 接口。
- RabbitMQ:基于 AMQP 協議,性能好、支持高并發,健壯穩定、跨平臺且支持多語言,有消息確認和持久化機制,路由高度可定制,管理界面豐富、社區活躍,但代理架構導致運行速度慢、消息封裝大,學習和維護成本高。
- ActiveMQ:Apache 出品,支持 JMS 規范和多語言,可通過 JDBC 持久化到數據庫,有自動重連、錯誤重試和安全機制,監控完善、界面友好,但社區活躍度不如 RabbitMQ,存在消息丟失問題,對上千隊列的場景不適用且對舊版本維護少。
- ZeroMQ:類似 Socket 接口的傳輸層庫,非傳統消息隊列服務器,可實現 N:M 通信,屏蔽 Socket 編程細節,讓網絡編程更簡單,支持多種通信模型,目標是成為標準網絡協議棧部分,但更偏向底層網絡通訊庫。
KafKa
基本介紹
安裝and運行
安裝Zookeeper
:::color5
ZooKeeper 是一個分布式協調服務
- 元數據管理:Kafka 依賴 ZooKeeper 存儲和管理集群的元數據信息,包括 Topic 的創建、刪除,分區的分配情況,Broker 的注冊信息等。比如當創建一個新的 Topic 時,Kafka 會將相關的 Topic 元數據存儲在 ZooKeeper 中。
- Broker 協調:ZooKeeper 負責監控 Kafka 集群中 Broker 的狀態。當有 Broker 加入或離開集群時,ZooKeeper 會感知到變化,并通知其他相關組件。同時,在選舉分區的 Leader 副本時,也需要借助 ZooKeeper 來保證選舉的一致性和正確性,確保數據的讀寫操作能夠正常進行。
- 消費者組管理:對于 Kafka 的消費者組,ZooKeeper 記錄了消費者組的成員信息、消費偏移量(Offset)等。當消費者組內成員發生變化(如新增消費者或消費者下線)時,ZooKeeper 會協助進行 Rebalance 操作,重新分配分區的消費任務,保證消費的均衡和高效。
:::
(kafka中也有自帶的zookeeper,但這里也可以自己裝一個)
KafKa配置介紹
安裝and配置EFAK
:::color5
EFAK(Kafka Eagle)是一款開源的 Kafka 監控和管理工具,用于幫助用戶更好地管理和監控 Kafka 集群,具體作用如下:
- 集群管理:可以同時管理多個 Kafka 集群,在配置文件(如
<font style="color:rgb(0, 0, 0);">system - config.properties</font>
)中通過設置<font style="color:rgb(0, 0, 0);">efak.zk.cluster.alias</font>
來為不同的 Kafka 集群設置別名,指定每個集群對應的 ZooKeeper 連接地址(如<font style="color:rgb(0, 0, 0);">cluster1.zk.list=localhost:2181</font>
),方便用戶對不同集群進行區分和操作。 - 監控功能:實時監控 Kafka 集群的各項指標,比如 Broker 的狀態、Topic 的消息堆積情況、消費者組的消費延遲等。通過直觀的界面展示這些指標,讓運維人員和開發者能夠快速了解集群的運行狀況,及時發現潛在問題。
- 數據統計分析:提供對 Kafka 消息數據的統計和分析功能,例如統計某個 Topic 在一段時間內的消息生產和消費速率、消息總量等,幫助用戶更好地理解業務數據的流動情況,為性能優化和容量規劃提供依據。
- 數據存儲配置:支持配置不同的數據庫來存儲監控數據,默認支持 SQLite,也可以配置 MySQL(通過修改
<font style="color:rgb(0, 0, 0);">efak.driver</font>
、<font style="color:rgb(0, 0, 0);">efak.url</font>
、<font style="color:rgb(0, 0, 0);">efak.username</font>
、<font style="color:rgb(0, 0, 0);">efak.password</font>
等參數 ),滿足不同用戶對于數據存儲的需求。
:::