1. 程式人生 > >訊息佇列介紹以及對比

訊息佇列介紹以及對比

一、什麼是訊息佇列

訊息佇列(Message Queue),是分散式系統中重要的元件,主要解決了應用耦合、非同步處理、流量削鋒等問題。當前主要使用的訊息佇列有RabbitMQRocketMQActiveMQKafkaZeroMQMetaMq,部分DB類儲存系統也可以實現訊息佇列,本質類似於javajms,主要實現訊息物件的接收、儲存與傳送。

二、訊息佇列的應用

訊息佇列在實際應用中包括:

1.   應用耦合,多個系統需要呼叫統一介面,對同一引數進行處理,為避免併發呼叫導致系統壓力,導致整個系統失敗。之前公司做的電商系統,屬於一個偽微服務的系統,只是將幾個不是訂單處理的系統分離出來,在物流

,倉庫等多個服務呼叫訂單系統的時候用到ActiveMQ

2.      非同步處理,多系統對單一系統中的同一訊息都需要進行處理,使用訊息佇列的廣播模式進行併發處理,縮短了時間;

3.      廣泛應用於秒殺或搶購活動中,避免流量過大導致應用系統掛掉的情況;

三、訊息佇列的模式

         1.點對點模式:訊息生產者將訊息傳送到佇列中,然後訊息接收者從佇列中取出並消費訊息,被消費的訊息會直接刪除,不會出現重複消費;

                   特點是:每個訊息只有一個消費者,傳送者和消費者沒有依賴關係,消費者消費成功之後會響應訊息佇列,以便刪除訊息;

         2.釋出/訂閱模式:釋出者將A主題的訊息傳送到訊息佇列,消費者可以根據主題消費響應的訊息,或佇列將訊息推送給消費者

                   特點:每個訊息可以被多個消費者消費,消費者和生產者之間有時間依賴性;為了消費訊息,訂閱者需要提前訂閱該角色主題;

四、接觸過的訊息佇列的對比

         第一個公司做的電商專案中用到了ActiveMQ進行訂單處理和秒殺系統的處理,第二個公司使用RabbitMQ作為分散式系統的訊息通訊,非同步處理和削鋒的工具,因為使用,所以調研過MQ,加上RocketMQ是馬家的,所以關注了一下,以下是這三個MQ的對比:

ActiveMQ

RabbitMQ

RocketMQ

關注度

成熟度

成熟

成熟

比較成熟

社群

Apache

Mozilla開源社群

Alibaba

社群活躍度

文件

特點

功能齊全,被大量使用

由於Erlang語言的併發能力,使得效能很好

各個環節分散式擴充套件設計,主從高可用群集;支援上萬個佇列;多種消費模式;效能很好

開源

開源

開源

開源

語言

Java

Erlang(面向併發程式語言)

Java

Client語言

支援Java

支援Java

支援Java

支援協議

OpenWire、STOMP、REST、XMPP、AMQP

AMQP

自定義的一套,提供了支援JMS客戶端的API

持久化

記憶體,檔案,資料庫

記憶體,檔案

磁碟檔案

事務

支援

不支援

支援

叢集和負載均衡

支援

支援

支援

管理頁面

一般

部署方式

獨立,嵌入

獨立

獨立

評價

優點:成熟的產品,已經在很多公司得到應用(非大規模場景)。有較多的文件。各種協議支援較好,有多重語言的成熟的客戶端;

缺點:根據其他使用者反饋,會出莫名其妙的問題,並且會丟訊息。其重心放到activemq6.0產品—apollo上去了,目前社群不活躍,且對5.x維護較少; Activemq 不適合用於上千個佇列的應用場景

優點:由於erlang語言的特性,mq效能較好;管理介面較豐富,在網際網路公司也有較大規模的應用;支援amqp協議,有多中語言且支援 amqp 的客 戶端可用。

缺點:erlang語言難度較大。

優點:模型簡單,介面易用。在阿里大規模應用。目前支付寶中的餘額寶等新興產品均使用rocketmq。叢集規模大概在50臺左右,單日處理訊息上百億;效能非常好,可以大量堆積訊息在 broker 中;支援多種消費,包括叢集消費、廣播消費等。開發度較活躍,版本 更新很快。

缺點:產品較新,文件比較缺乏。沒有在 mq 核心中去實現 JMS 等介面,對 已有系統而言不能相容

五、總結

         綜合以上來看,三種MQ各有優劣,ActiveMQ和RabbitMQ相對成熟,使用起來略微順手,網上文件也很多,坑基本上被踩完了,前者使用java寫的,學習成本低,後者使用Elang語言比較難以學習,都支援出就花和叢集,唯一的是RabbitMQ不支援事務,但是公司現在也用不到這個。RabbitMQ是阿里自己開發的,設計的很強大,但是肯定會偏向阿里的業務,不一定對所有的公司都適合,加上文件少,不是很成熟,沒有深厚的技術底蘊,難以放心的使用;總之,技術沒有最好的,只有最適合的,貼合自己公司的業務和實際情況選出來的就是最好的!