秒懂MQ
訊息佇列 所能承受的併發遠高於 資料庫
主流MQ
:RabbitMQ
,RocketMQ
,ActiveMQ
,Kafka
ActiveMQ
:最早,處理併發量較低.Kafka
:併發量最高,效能高,速度快,但資料不嚴謹,漏發重複發訊息RocketMQ
:阿里自研開發,並是開源的,速度快,並修復了Kafka前期的不嚴謹,但部分功能是收費的RabbitMQ
:整體的併發及處理速度不如Kafka
和RocketMQ
,但比ActiveMQ
強,基本上不是太多的併發它都能扛得住,真真的開源的,外掛較多
MQ
訊息佇列 → 取代多執行緒(自理解)
程序間通訊或統一程序的不同執行緒間的通訊方式,軟體的貯列用來處理一系列的輸入,通常來自使用者.訊息佇列提供了一步的通訊協議,每一個貯列中的記錄包含詳細說明的資料,包含發生的時間,輸入裝置的種類,以及特定的輸入引數,也就是說:訊息的傳送者和接收者不需要同時與訊息佇列互動,訊息會儲存在佇列中,直到接受者取回.
實現:
-
訊息佇列常常儲存在連結串列結構中,擁有許可權的程序可以向訊息佇列中寫入或讀取訊息,
-
目前訊息佇列有很多開源的實現:括
JBoss Messaging
、JORAM
、Apache
,ActiveMQ
、Sun Open Message Queue
、IBM MQ
、Apache Qpid
和HTTPSQS
。 -
當前使用較多的訊息佇列有
RabbitMQ
、RocketMQ
(阿里自研) 、ActiveMQ
、Kafka
、ZeroMQ
、MetaMq
等,而部分資料庫如Redis
、Mysql
以及phxsql
也可實現訊息佇列的功能。
特點:
MQ
是消費者-生產者模型的一個典型代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取或者訂閱佇列中的訊息而另一端則可以讀取或者訂閱佇列中的訊息。MQ
JMS
類似,但不同的是JMS
是SUN JAVA
訊息中介軟體服務的一個標準和API
定義,而MQ
則是遵循了AMQP
協議的具體實現和產品
注意:
AMQP
即Advanced Message Queuing Protocol
,一個提供統一訊息服務的應用層標準高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。基於此協議的客戶端與訊息中介軟體可傳遞訊息,並不受客戶端/中介軟體不同產品,不同的開發語言等條件的限制。JMS
,Java訊息服務(Java Message Service
)應用程式介面,是一個Java平臺中關於面向訊息中介軟體的API
,用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。 Java訊息服務是一個與具體平臺無關的API
JMS
提供支援。常見的訊息佇列,大部分都實現了JMS API
,如ActiveMQ
,Redis
以及RabbitMQ
等
優點:
應用耦合,非同步處理,流量削峰
-
解耦
傳統模式
中間接模式
-
非同步
傳統模式
中介軟體模式
-
削峰
傳統模式
中介軟體模式
缺點:
系統可用性降低、系統複雜性增加
使用場景
訊息佇列,是分散式系統中重要的元件,其通用的使用場景可以簡單的描述為:當不需要立即獲得結果,但是併發量又需要進行控制的時候,差不多就是需要使用訊息佇列的時候,在專案中,將一些無需即時返回且耗時的操作提取出來,進行了非同步處理,而這種非同步處理的方式大大的節省了伺服器的請求響應時間,從而提高了系統的吞吐量
為什麼使用RabbitMQ
AMQP
,即Advanced Message Queuing Protocol
,高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。訊息中介軟體主要用於元件之間的解耦,訊息的傳送者無需知道訊息使用者的存在,反之亦然。
AMQP
的主要特徵是面向訊息、佇列、路由(包括點對點和釋出/訂閱)、可靠性、安全。
RabbitMQ
是一個開源的AMQP
實現,伺服器端用Erlang語言編寫,支援多種客戶端,如:Python
、Ruby
、 .NET
、 Java
、 JMS
、 C
、PHP
、 ActionScript
、 XMPP
、 STOMP
等,支援AJAX。用於在分散式系統中儲存轉發訊息,在易用性、擴充套件性、高可用性等方面表現不俗。
總結如下:
- 基於
AMQP
協議 - 高併發(是一個容量的概念,伺服器可以接受的最大任務數量)
- 高效能(是一個速度的概念,單位時間內伺服器可以處理的任務數)
- 高可用(是一個持久的概念,單位時間內伺服器可以正常工作的時間比例)
- 強大的社群支援,以及很多公司都在使用
- 支援外掛
- 支援多語言
)
- 高可用(是一個持久的概念,單位時間內伺服器可以正常工作的時間比例)
- 強大的社群支援,以及很多公司都在使用
- 支援外掛
- 支援多語言