何為中間件
中間件是將具體業務和底層邏輯解耦的軟體,分為:MOM(訊息中間件)、RPC(遠程程序呼叫中間件)、UDA(資料訪問中間件)、TPM(交易中間件)等,
訊息中間件,又稱為訊息佇列、訊息佇列中間件,分為RabbitMQ、ActiveMQ、Kafka等,
原理
各部分的名字和作用?
1.Brocker:訊息佇列服務器物體,Rabbitmq可以作為一個選擇,
2.Exchange:訊息交換機,用于接收、分配訊息,指定訊息按什么規則,路由到哪個佇列,
3.Queue:訊息佇列,用于存盤生產者的訊息,每個訊息都會被投入到一個或者多個佇列里,
4.Binding Key:系結關鍵字,用于把交換器的訊息系結到佇列中,它的作用是把exchange和queue按照路由規則binding起來,
5.Routing Key:路由關鍵字,用于把生產者的資料分配到交換器上,exchange根據這個關鍵字進行訊息投遞,
6.Vhost:虛擬主機,一個broker里可以開設多個vhost,用作不用用戶的權限分離,
7.Producer:訊息生產者,就是投遞訊息的程式,
8.Consumer:訊息消費者,就是接受訊息的程式,
9.Channel:信道,訊息推送使用的通道,可建立多個channel,每個channel代表一個會話任務,
使用流程
使用流程?
1.訊息接收客戶端連接到訊息佇列服務器,打開一個channel,
2.客戶端宣告一個exchange,并設定相關屬性,
3.客戶端宣告一個queue,并設定相關屬性,
4.客戶端使用routing key,在exchange和queue之間建立好系結關系,
5.訊息發布客戶端投遞訊息到exchange,
6.exchange接收到訊息后,就根據訊息的key和已經設定的binding,進行訊息路由,將訊息投遞到一個或多個佇列里,
總結起來就是:生產者發送一條訊息給交換機——交換機根據關鍵字匹配到對應的佇列——將訊息存入佇列——消費者從佇列中取出訊息使用,
佇列模式
在官網中有明確的說明:http://www.rabbitmq.com/getstarted.html
1.簡單佇列模式:一個生產者對應一個消費者,

2.作業佇列模式:一個生產者產生的訊息可以供多個消費者消費,但是一個訊息只能被其中一個消費者消費,

3.發布/訂閱模式:多了一個交換機,生產者將訊息發送到交換機上,交換機發送訊息給各個佇列,此時,一個訊息可以被多個消費者獲取,
值得一提的是,這又叫廣播模式,是最常用的模式了,在ITOO中使用的就是這種模式,

4.路由模式:又多了一個routing key,生產者發送訊息帶有routingkey,消費者選擇自己需要的訊息進行消費,也配置一個routing key,

5.主題模式:又多了一個通配符,這樣消費端如果需要好幾種訊息的時候,不用一個一個的設定,直接用通配符可以接收自己想要的各種訊息,

6.RPC(遠程呼叫):c對s說“我這有個任務需要你的幫助”,s處理完后,將結果回傳給c,

為什么選擇rabbitMQ
1.除了Qpid,RabbitMQ是唯一一個實作了AMQP標準的訊息服務器;
2.可靠性,RabbitMQ的持久化支持,保證了訊息的穩定性;
3.高并發,RabbitMQ使用了Erlang開發語言,Erlang是為電話交換機開發的語言,具備高并發和高可用特性;
4.集群部署簡單,正是因為Erlang使得RabbitMQ集群部署變的超級簡單;
5.社區活躍度高,根據網上資料來看,RabbitMQ也是首選;
應用場景
RabbitMQ以至于MQ的應用場景有4個:異步處理、應用解耦、流量削峰、日志處理,
異步處理
案例:用戶下單后,訂單系統完成持久化處理后,將訊息寫入訊息佇列,回傳用戶訂單下單成功,
庫存系統訂閱下單資訊(訊息佇列),采用拉/推的方式,獲取下單資訊后,進行庫存操作,
流量削峰
在秒殺活動中,極短的時間內,有大量的請求涌入,如果都從資料庫層面操作,就會讓資料庫癱瘓,
解決辦法就是加入訊息佇列,這樣就將請求“積壓”在了訊息佇列中,資料庫能盡可能多地呼叫就調,呼叫不了的可以先存著,
當然,訊息佇列也有滿的時候,如果超過了容量,它就會直接拋棄用戶請求或跳轉到錯誤頁面,
日志處理
日志處理和流量削峰的程序大致一樣,解決的是大量日志傳輸的問題,Rabbitmq也能進行日志處理,但是我們一般使用Kafka進行日志處理,

kafka和RabbitMQ的區別
1.應用場景方面
RabbitMQ:用于實時的,對可靠性要求較高的訊息傳遞上,
kafka:用于處于活躍的流式資料,大資料量的資料處理上,
2.語言方面
RabbitMQ是由內在高并發的erlanng語言開發,用在實時的對可靠性要求比較高的訊息傳遞上,
kafka是采用Scala語言開發,它主要用于處理活躍的流式資料,大資料量的資料處理上
3.吞吐量方面
RabbitMQ:支持訊息的可靠的傳遞,支持事務,不支持批量操作,基于存盤的可靠性的要求存盤可以采用記憶體或硬碟,吞吐量小,
kafka:內部采用訊息的批量處理,資料的存盤和獲取是本地磁盤順序批量操作,訊息處理的效率高,吞吐量高,
4.Brokerr與Consume互動方式不同
RabbitMQ 采用push的方式
kafka采用pull的方式
5.集群負載均衡方面
RabbitMQ:本身不支持負載均衡,需要loadbalancer的支持
kafka:采用zookeeper對集群中的broker,consumer進行管理,可以注冊topic到zookeeper上,通過zookeeper的協調機制,producer保存對應的topic的broker資訊,可以隨機或者輪詢發送到broker上,producer可以基于語意指定分片,訊息發送到broker的某個分片上,
相關知識
AMQP理論
即Advanced Message Queuing Protocol,一個提供統一訊息服務的應用層標準高級訊息佇列協議,RabbitMQ遵循此協議,
ACK機制
每次消費者取出訊息時會通知佇列,我拿到了,當佇列接收到這條訊息,就會把訊息洗掉,這是默認的ACK機制,如果在接收訊息之后,消費者掛掉,或者任何情況沒有回傳ack,佇列中這條訊息將不會洗掉,可以一直存著,等待其他消費者來取,
Erlang
我們知道,安裝Rabbitmq時,需要先下載安裝Erlang,因為Rabbitmq是由Erlang語言撰寫的,
參考:
- https://blog.csdn.net/weixin_43194723/article/details/114263025
- https://blog.csdn.net/qsbbl/article/details/82941986
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333617.html
標籤:其他
下一篇:數倉搭建 ODS 層
