????????消息隊列是分布式系統中重要的組件之一。使用消息隊列主要是為了通過異步處理提高系統性能和削峰、降低系統耦合性。
????????使用消息隊列主要有三點好處:
(1)通過異步處理提高系統性能(減少響應所需時間):用戶提交請求后,服務器將其發送到消息隊列后直接就給出響應,相較于傳統的服務器收到請求后,對數據庫進行處理,得到結果再響應這個流程,消息隊列通過處理和響應的分離,大大提高了系統性能。
(2)削峰/限流:先將短時間高并發產生的事務消息存儲在消息隊列中,然后后端服務再慢慢根據自己的能力去消費這些消息,這樣就避免直接把后端服務打垮掉。
(3)降低系統耦合性:一個模塊將信息放入消息隊列中,其他模塊再來消息隊列中取走需要的信息,可以減少模塊之間的依賴,大大降低耦合性。
? ? ? ? 消息隊列主要采用兩種方式:發布-訂閱模式和點對點模式。如果把消息的提供者視為生產者,使用消息的部分視為消費者,那么這兩個模式中,前者是一個生產者把生產的消息發布到消息隊列中,多個消費者訂閱消息;后者是一個生產者專門給一個消費者生產消息。
? ? ? ? 雖然消息隊列好處多多,但也有一些顯而易見的缺點:
????????系統可用性降低: 系統可用性在某種程度上降低,引入后,程序員需要額外考慮消息在傳輸中丟失的可能
系統復雜性提高: 加入消息隊列后之后,程序員需要保證消息沒有被重復消費、處理消息丟失的情況、保證消息傳遞的順序性等等問題
一致性問題: 消息隊列可以實現異步,消息隊列帶來的異步確實可以提高系統響應速度。但是這也會導致出現消息隊列會出現內容不一致的情況。
? ? ? ? 常見的消息隊列主要有:ActiveMQ、RabbitMQ、RocketMQ、Kafka,其差異如下:
對比方向 | 概要 |
---|---|
吞吐量 | 萬級的 ActiveMQ 和 RabbitMQ 的吞吐量(ActiveMQ 的性能最差)要比 十萬級甚至是百萬級的 RocketMQ 和 Kafka 低一個數量級。 |
可用性 | 都可以實現高可用。ActiveMQ 和 RabbitMQ 都是基于主從架構實現高可用性。RocketMQ 基于分布式架構。 kafka 也是分布式的,一個數據多個副本,少數機器宕機,不會丟失數據,不會導致不可用 |
時效性 | RabbitMQ 基于erlang開發,所以并發能力很強,性能極其好,延時很低,達到微秒級。其他三個都是 ms 級。 |
功能支持 | 除了 Kafka,其他三個功能都較為完備。 Kafka 功能較為簡單,主要支持簡單的MQ功能,在大數據領域的實時計算以及日志采集被大規模使用,是事實上的標準 |
消息丟失 | ActiveMQ 和 RabbitMQ 丟失的可能性非常低, RocketMQ 和 Kafka 理論上不會丟失。 |