初識消息中間件

文章目錄

 

1, 引題

消息中間件是什麼,是一種標準,仍是一種具體的 工具爲何叫消息中間件?帶着這些疑問,筆者開始走進消息中間件的世界。html

2, 消息中間件的定義

通俗來講,就是能夠對數據信息進行異步傳遞的中介。從編程的角度來講,這裏的消息就是咱們一般意義上的數據,中間件是某種軟件或者程序,接收咱們的消息並分發給指定的目標程序,中間件並不關注參數自己的意義,可是其須要遵循必定的標準,好比平臺特性、消息傳遞方式、消息傳遞可靠性等。(叫作數據中轉站怎麼樣?)數據庫

3, 消息中間件出現的背景

伴隨着分佈式系統的出現,各系統之間的交互愈來愈複雜,一次業務處理須要調用的 API 愈來愈多,系統耦合性在加大,處理效率卻在急劇降低。再一個,系統存在高峯調用和低峯調用,高峯調用所需的性能超過了系統的承受能力,而低峯時段系統的性能卻白白浪費了。這個時候,人們就開始思考解決這個問題了,伴隨着一些列的努力和探索,消息中間件終於出現了,而且呈現出了一種百花齊放的局面。apache

4, 消息中間件解決了什麼問題?

4.1 業務解耦:相比於傳統 RPC 調用,消息中間件對數據的處理是異步的,這意味着客戶端無需等待消息處理結束,而只須要關注消息是否成功投送給消息中間件,至於結果的處理則由後面的環節去負責。客戶端經過消息中間件傳遞數據給服務端,業務解耦了,從而下降了系統的耦合度,有利於系統擴展和報錯時的問題排查。
4.2 系統效率提高:將緊迫程度較高的業務使用傳統同步調用的方式處理,對緊迫程度較低的業務經過異步的消息中間件傳遞給下游服務端處理,相比同步調用而言,所耗費的時間較少了,從而提高了系統效率。固然,隨着業務的發展和人們孜孜不倦的探索,消息中間件已經能夠用於對時效性要求較高的場景了。
4.3 系統綜合可用性提高:從系統解耦的角度來講,串行的調用100個接口和並行的調用100個接口,其中一個接口出現問題對系統整體可用性的影響度是顯而易見的。再一個,消息中間件異步處理消息的模式,能夠對系統起到「削峯填谷」的做用,當客戶端訪問量大於服務端的時候,能夠先將過量的服務存儲在消息隊列中,待到服務端有富餘的性能時再對消息隊列中的業務數據進行處理,從而提高了系統的綜合可用性。編程

5, 生產者和消費者的概念

生產者即消息的產生者,生產者將消息發送給消息中間件,消息中間件對消息進行轉發或者存儲,消費者從消息中間件獲取消息。生產者是產生消息的程序,消費者是消耗消息的程序,消息中間件是中介。安全

6, 消息中間件的標準JMS 和 AMQP

須要強調的是,消息中間件並不是只有 JMS 和 AMQP 兩種標準。
如下內容摘自《Spring 實戰第4版》
6.1 JMS (Java消息服務,Java Message Service): 是一個Java標準, 定義了使用消息代理的通用API。 在JMS出現以前, 每一個消息代理都有私有的API, 這就使得不一樣代理之間的消息代碼很難通用。 可是藉助JMS, 全部聽從規範的實現都使用通用的接口, 這就相似於JDBC爲數據庫操做提供了通用的接口同樣。
在JMS中, 有三個主要的參與者: 消息的生產者、 消息的消費者以及在生產者和消費者之間傳遞消息的通道( 隊列或主題)
6.2 AMQP (高級消息隊列協議 Advanced Message Queuing Protocol): AMQP的線路層協議規範了消息的格式, 消息在生產者和消費者間傳送的時候會遵循這個格式。 這樣AMQP在互相協做方面就要優於JMS——它不只能跨不一樣的AMQP實現, 還能跨語言和平臺。相比JMS, AMQP另一個明顯的優點在於它具備更加靈活和透明的消息模型。 使用JMS的話, 只有兩種消息模型可供選擇: 點對點和發佈-訂閱。 這兩種模型在AMQP固然都是能夠實現的, 但AMQP還可以讓咱們以其餘的多種方式來發送消息, 這是經過將消息的生產者與存放消息的隊列解耦實現的。服務器

7, 常見的消息中間件

下面內容摘自 https://mp.weixin.qq.com/s/Zwd1USlOCkQvsG96eSwvpg#%23
7.1 ActiveMQ: 是Apache出品的、採用Java語言編寫的徹底基於JMS1.1規範的面向消息的中間件,爲應用程序提供高效的、可擴展的、穩定的和安全的企業級消息通訊。不過因爲歷史緣由包袱過重,目前市場份額沒有後面三種消息中間件多,其最新架構被命名爲Apollo,號稱下一代ActiveMQ,有興趣的同窗可行了解。據官網瞭解 ,ActiveMQ 目前已經支持AMQP v1.一、MQTT v3.一、Stomp 和 OpenWire。初識 ActiveMQ 及 安裝和啓動
7.2 RabbitMQ: 是採用Erlang語言實現的AMQP協議的消息中間件,最初起源於金融系統,用於在分佈式系統中存儲轉發消息。RabbitMQ發展到今天,被愈來愈多的人承認,這和它在可靠性、可用性、擴展性、功能豐富等方面的卓越表現是分不開的。
7.3 Kafka: 起初是由LinkedIn公司採用Scala語言開發的一個分佈式、多分區、多副本且基於zookeeper協調的分佈式消息系統,現已捐獻給Apache基金會。它是一種高吞吐量的分佈式發佈訂閱消息系統,以可水平擴展和高吞吐率而被普遍使用。目前愈來愈多的開源分佈式處理系統如Cloudera、Apache Storm、Spark、Flink等都支持與Kafka集成。
7.4 RocketMQ: 是阿里開源的消息中間件,目前已經捐獻給Apache基金會,它是由Java語言開發的,具有高吞吐量、高可用性、適合大規模分佈式系統應用等特色,經歷過雙11的洗禮,實力不容小覷。移步 http://rocketmq.apache.org/docs/motivation/
7.5 ZeroMQ: 號稱史上最快的消息隊列,基於C語言開發。ZeroMQ是一個消息處理隊列庫,可在多線程、多內核和主機之間彈性伸縮,雖然大多數時候咱們習慣將其納入消息隊列家族之中,可是其和前面的幾款有着本質的區別,ZeroMQ自己就不是一個消息隊列服務器,更像是一組底層網絡通信庫,對原有的Socket API上加上一層封裝而已。網絡

7.6 目前市面上的消息中間件還有不少,好比騰訊系的PhxQueue、CMQ、CKafka,又好比基於Go語言的NSQ,有時人們也把相似Redis的產品也看作消息中間件的一種,固然它們都很優秀······
 多線程

參考連接

文獻很豐富,網絡讓知識自由流動架構

[1].《Spring 實戰 第4版》
[2].https://blog.csdn.net/winter_chen001/article/details/78409125
[3].https://blog.csdn.net/u013123635/article/details/78362360
[4].https://www.cnblogs.com/Peter2014/p/8080192.html
[5].https://blog.csdn.net/wowwilliam0/article/details/81110943
[6].https://blog.csdn.net/lsj960922/article/details/79926947
[7].https://blog.csdn.net/wangfengwf/article/details/78966704
[8].https://blog.csdn.net/hpttlook/article/details/23391967異步

相關文章
相關標籤/搜索