消息隊列是一種異步的服務間通訊方式,適用於無服務器和微服務架構。消息在被處理和刪除以前一直存儲在隊列上。每條消息僅可被一位用戶處理一次。消息隊列可被用於分離重量級處理、緩衝或批處理工做以及緩解高峯期工做負載。java
在現代雲架構中,應用程序被分解爲多個規模較小且更易於開發、部署和維護的獨立構建塊。消息隊列可爲這些分佈式應用程序提供通訊和協調。docker
消息隊列能夠顯著簡化分離應用程序的編碼,同時提升性能、可靠性和可擴展性。此外,您還能夠採用扇出設計模式將消息隊列與發佈/訂閱消息收發結合起來。數據庫
1.提升性能
消息隊列支持異步通訊,這意味着建立和處理消息的終端節點將與隊列進行交互,而不是彼此交互。建立器能夠將請求添加到隊列中,無需再等待這些請求接受處理。處理器僅在消息可用時纔會處理消息。系統中的任何組件都不會停下等待其餘組件,從而優化了數據流。apache
2.加強可靠性
隊列可永久保留您的數據,並減小系統的不一樣部件離線時發生的錯誤。經過利用消息隊列分離不一樣的組件,能夠提升容錯性。即便系統的某一部分沒法訪問,其餘部分也仍可繼續與隊列進行交互。隊列自己也能夠進行鏡像,以提供更高的可用性。設計模式
3.可拓展性
消息隊列可根據您的須要精確擴展。當工做負載到達峯值時,應用程序的多個實例均可以將請求添加到隊列,並且不會產生衝突。隨着隊列因這些傳入請求的增多而愈來愈長,您能夠將這些工做負載分發給一組處理器。建立器、處理器和隊列自己均可以按需擴展和縮減。安全
4.分離解耦
消息隊列消除了組件之間的依賴關係,並顯著簡化了分離應用程序的編碼。軟件組件沒必要承擔通訊代碼的重壓,而是能夠在通過設計後執行離散的業務功能。服務器
不管您使用的是總體式應用程序、微服務仍是無服務器架構,消息隊列都是一種簡單且出色的應用程序分離方法。架構
官網: www.rabbitmq.com/
開發語言: Erlang
支持客戶端語言言: Erlang,java,Ruby等
協議: AMQP, STOMP, XMPP, SMTP
消息推拉模式: pull/push均支持
數據可靠性: 保證數據不丟,有Slave用做備份
單機吞吐量: 萬級
持久化能力: 內存, 文件異步
RabbitMQ是一個消息傳遞代理—消息傳遞的中介。它爲您的應用程序提供了一個發送和接收消息的公共平臺,併爲您的消息提供了一個安全的地方,直到收到消息爲止。它的特性包括可靠性、高可用性、集羣和聯合。RabbitMQ附帶一個易於使用的管理UI,容許您監視和控制消息代理的各個方面。幾乎任何您能想到的語言都有RabbitMQ客戶機。分佈式
官網: rocketmq.incubator.apache.org/
開發語言: Java
支持客戶端語言: Java, C++, Go
協議: JMS,MQTT
消息推拉模式: pull/push均支持
數據可靠性: 支持異步實時刷盤,同步刷盤,同步複製,異步複製
單機吞吐量:十萬級
持久化能力: 磁盤文件
其中
NameServer: 爲 producer 和 consumer 提供路由信息
Producer: 爲消息生產者,生產者的做用就是將消息發送到MQ,生產者自己既能夠產生消息
Consumer: 爲消息消費者,消費 MQ 上的消息的應用程序就是消費者
Broker: RocketMQ系統的主要角色,及隊列。Broker接收來自生產者的消息,儲存以及爲消費者拉取消息的請求作好準備。
Apache RocketMQ是一個低延遲、可靠、可伸縮、易於使用的消息中間件,誕生於阿里巴巴龐大的消息業務。 它提供的各類功能以下:
官網: activemq.apache.org/
開發語言: Java
支持客戶端語言: Java, .NET, C++ 等
協議: OpenWire, STOMP, REST, XMPP, AMQP
消息推拉模式: pull/push均支持
數據可靠性: master/slave
單機吞吐量:萬級
持久化能力: 內存, 文件, 數據庫
p2p模式:
pub/sub模式:
Apache ActiveMQ是最流行、功能最強大的開源消息傳遞和集成模式提供者。Apache ActiveMQ速度快,支持許多跨語言客戶機和協議,具備易於使用的企業集成模式和許多高級特性,同時徹底支持JMS 1.1和J2EE 1.4。
官網: kafka.apache.org/
開發語言: Java & Scala
支持客戶端語言: Java, Scala 等
協議:自有協議
消息推拉模式: pull
數據可靠性: 數據可靠,並有replication機制,有容錯容災能力
單機吞吐量:十萬級
持久化能力: 磁盤文件,能夠作到無限消息堆積
內部結構圖:
如上圖所示,一個典型的kafka集羣中包含若干producer,若干broker(Kafka支持水平擴展,通常broker數量越多,集羣吞吐率越高),若干consumer group,以及一個Zookeeper 集羣。Kafka經過Zookeeper管理集羣配置,選舉leader,以及在consumer group發生變化時進行rebalance。producer使用push模式將消息發佈到broker,consumer使用pull模式從broker訂閱並消費消息。
喜歡能夠關注公衆號: 終身幼稚園