消息隊列是分佈式系統中重要的組件,在不少生產環境如商品搶購等須要控制併發量的場景下都須要用到。最近組內須要作流水server的選型升級,這裏對消息隊列及常見的消息隊列進行了一次調研,整理了相關資料,分享給你們。php
1、消息隊列(MQ)概述html
消息隊列(Message Queue),是分佈式系統中重要的組件,其通用的使用場景能夠簡單地描述爲:java
當不須要當即得到結果,可是併發量又須要進行控制的時候,差很少就是須要使用消息隊列的時候。python
消息隊列主要解決了應用耦合、異步處理、流量削鋒等問題。c++
當前使用較多的消息隊列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分數據庫如Redis、Mysql以及phxsql也可實現消息隊列的功能。git
2、消息隊列使用場景web
消息隊列在實際應用中包括以下四個場景:redis
下面詳細介紹上述四個場景以及消息隊列如何在上述四個場景中使用:sql
2.1 異步處理 具體場景:用戶爲了使用某個應用,進行註冊,系統須要發送註冊郵件並驗證短信。對這兩個操做的處理方式有兩種:串行及並行。數據庫
(1)串行方式:新註冊信息生成後,先發送註冊郵件,再發送驗證短信;
在這種方式下,須要最終發送驗證短信後再返回給客戶端。
(2)並行處理:新註冊信息寫入後,由發短信和發郵件並行處理;
在這種方式下,發短信和發郵件 需處理完成後再返回給客戶端。
假設以上三個子系統處理的時間均爲50ms,且不考慮網絡延遲,則總的處理時間:
串行:50+50+50=150ms
並行:50+50 = 100ms
若使用消息隊列:
並在寫入消息隊列後當即返回成功給客戶端,則總的響應時間依賴於寫入消息隊列的時間,而寫入消息隊列的時間自己是能夠很快的,基本能夠忽略不計,所以總的處理時間相比串行提升了2倍,相比並行提升了一倍;
2.2 應用耦合
具體場景:用戶使用QQ相冊上傳一張圖片,人臉識別系統會對該圖片進行人臉識別,通常的作法是,服務器接收到圖片後,圖片上傳系統當即調用人臉識別系統,調用完成後再返回成功,以下圖所示:
該方法有以下缺點:
若使用消息隊列:
此時圖片上傳系統並不須要關心人臉識別系統是否對這些圖片信息的處理、以及什麼時候對這些圖片信息進行處理。事實上,因爲用戶並不須要當即知道人臉識別結果,人臉識別系統能夠選擇不一樣的調度策略,按照閒時、忙時、正常時間,對隊列中的圖片信息進行處理。
2.3 限流削峯
具體場景:購物網站開展秒殺活動,通常因爲瞬時訪問量過大,服務器接收過大,會致使流量暴增,相關係統沒法處理請求甚至崩潰。而加入消息隊列後,系統能夠從消息隊列中取數據,至關於消息隊列作了一次緩衝。
該方法有以下優勢:
2.4 消息驅動的系統
具體場景:用戶新上傳了一批照片, 人臉識別系統須要對這個用戶的全部照片進行聚類,聚類完成後由對帳系統從新生成用戶的人臉索引(加快查詢)。這三個子系統間由消息隊列鏈接起來,前一個階段的處理結果放入隊列中,後一個階段從隊列中獲取消息繼續處理。
該方法有以下優勢:
3、消息隊列的兩種模式
消息隊列包括兩種模式,點對點模式(point to point, queue)和發佈/訂閱模式(publish/subscribe,topic)。
3.1 點對點模式
點對點模式下包括三個角色:
消息發送者生產消息發送到queue中,而後消息接收者從queue中取出而且消費消息。消息被消費之後,queue中再也不有存儲,因此消息接收者不可能消費到已經被消費的消息。
點對點模式特色:
3.2 發佈/訂閱模式
發佈/訂閱模式下包括三個角色
發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。
發佈/訂閱模式特色:
4、經常使用消息隊列介紹
本部分主要介紹四種經常使用的消息隊列(RabbitMQ/ActiveMQ/RocketMQ/Kafka)的主要特性、優勢、缺點。
4.1 RabbitMQ
RabbitMQ 2007年發佈,是一個在AMQP(高級消息隊列協議)基礎上完成的,可複用的企業消息系統,是當前最主流的消息中間件之一。
主要特性:
使用RabbitMQ須要:
RabbitMQ能夠運行在Erlang語言所支持的平臺之上:
優勢:
缺點:
4.2 ActiveMQ
ActiveMQ是由Apache出品,ActiveMQ 是一個徹底支持JMS1.1和J2EE 1.4規範的 JMS Provider實現。它很是快速,支持多種語言的客戶端和協議,並且能夠很是容易的嵌入到企業的應用環境中,並有許多高級功能。
主要特性:
使用ActiveMQ須要:
ActiveMQ能夠運行在Java語言所支持的平臺之上。
優勢:
缺點:
4.3 RocketMQ
RocketMQ出自 阿里公司的開源產品,用 Java 語言實現,在設計時參考了 Kafka,並作出了本身的一些改進,消息可靠性上比 Kafka 更好。RocketMQ在阿里集團被普遍應用在訂單,交易,充值,流計算,消息推送,日誌流式處理,binglog分發等場景。
主要特性:
使用RocketMQ須要:
RocketMQ能夠運行在Java語言所支持的平臺之上。
優勢:
缺點:
4.4 Kafka
Apache Kafka是一個分佈式消息發佈訂閱系統。它最初由LinkedIn公司基於獨特的設計實現爲一個分佈式的提交日誌系統( a distributed commit log),,以後成爲Apache項目的一部分。Kafka系統快速、可擴展而且可持久化。它的分區特性,可複製和可容錯都是其不錯的特性。
主要特性:
快速持久化,能夠在O(1)的系統開銷下進行消息持久化;
高吞吐,在一臺普通的服務器上既能夠達到10W/s的吞吐速率;
.徹底的分佈式系統,Broker、Producer、Consumer都原生自動支持分佈式,自動實現負載均衡;
支持同步和異步複製兩種HA;
支持數據批量發送和拉取;
zero-copy:減小IO操做步驟;
數據遷移、擴容對用戶透明;
無需停機便可擴展機器;
其餘特性:嚴格的消息順序、豐富的消息拉取模型、高效訂閱者水平擴展、實時的消息訂閱、億級的消息堆積能力、按期刪除機制;
使用Kafka須要:
Java JDK
Kafka安裝包
優勢:
客戶端語言豐富,支持java、.net、php、ruby、python、go等多種語言;
性能卓越,單機寫入TPS約在百萬條/秒,消息大小10個字節;
提供徹底分佈式架構, 並有replica機制, 擁有較高的可用性和可靠性, 理論上支持消息無限堆積;
支持批量操做;
消費者採用Pull方式獲取消息, 消息有序, 經過控制可以保證全部消息被消費且僅被消費一次;
有優秀的第三方Kafka Web管理界面Kafka-Manager;
在日誌領域比較成熟,被多家公司和多個開源項目使用;
缺點:
Kafka單機超過64個隊列/分區,Load會發生明顯的飆高現象,隊列越多,load越高,發送消息響應時間變長
使用短輪詢方式,實時性取決於輪詢間隔時間;
消費失敗不支持重試;
支持消息順序,可是一臺代理宕機後,就會產生消息亂序;
社區更新較慢;
4.5 RabbitMQ/ActiveMQ/RocketMQ/Kafka對比
這裏列舉了上述四種消息隊列的差別對比
注意:其實RabbitMQ也是支持事物的
結論:
Kafka在於分佈式架構,RabbitMQ基於AMQP協議來實現,RocketMQ/思路來源於kafka,改爲了主從結構,在事務性可靠性方面作了優化。普遍來講,電商、金融等對事務性要求很高的,能夠考慮RabbitMQ和RocketMQ,對性能要求高的可考慮Kafka。
5、參考資料:
5.1 消息隊列:
大型網站架構之分佈式消息隊列 blog.csdn.net/shaobingj12…
消息隊列的使用場景 www.zhihu.com/question/34…
淺談異步消息隊列模型 www.cnblogs.com/sunkeydev/p…
消息隊列的兩種模式 blog.csdn.net/heyutao007/…
5.2 RabbitMQ
RabbitMQ主頁 www.rabbitmq.com/
RabbitMQ學習教程 www.rabbitmq.com/getstarted.…
專欄:RabbitMQ從入門到精通 blog.csdn.net/column/deta…
RabbitMQ能爲你作些什麼 rabbitmq.mr-ping.com/description…
RabbitMQ指南(1)-特性及功能 blog.zenfery.cc/archives/79…
5.3 ActiveMQ
ActiveMQ主頁 activemq.apache.org/
Apache ActiveMQ介紹 jfires.iteye.com/blog/118768…
ActiveMQ的簡介與安裝 blog.csdn.net/sl1992/arti…
ActiveMQ 和消息簡介 www.cnblogs.com/craftsman-g…
5.4 RocketMQ
RocketMQ 原理簡介 rocketmq.apache.org/docs/quick-…
RocketMQ與kafka對比(18項差別) jm.taobao.org/2016/03/24/…
5.5 Kafka
1.Kafka主頁: kafka.apache.org/
Kafka特性 www.cnblogs.com/lsx1993/p/4…
Kafka客戶端支持語言 cwiki.apache.org/confluence/…
5.6 RabbitMQ/ActiveMQ/RocketMQ/Kafka對比
RocketMQ,隊列選型 www.zmannotes.com/index.php/2…
RabbitMQ和Kafka www.dongcoder.com/detail-4168…
即時通訊RabbitMQ二-性能測試 www.jianshu.com/p/d31ae9e3b…
RabbitMq、ActiveMq、ZeroMq、kafka之間的比較,資料彙總 blog.csdn.net/linsongbin1…
消息隊列軟件產品大比拼 www.cnblogs.com/amityat/arc…
總結:
消息隊列利用高效可靠的消息傳遞機制進行平臺無關的數據交流,並基於數據通訊來進行分佈式系統的集成。目前業界有不少的MQ產品,例如RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,也有直接使用數據庫redis充當消息隊列的案例。而這些消息隊列產品,各有側重,在實際選型時,須要結合自身需求及MQ產品特徵,綜合考慮。
note:只有作好今天,才能夢想明天。