消息隊列(如下簡稱MQ)是一種跨進程的通訊機制,用於上下游傳遞消息。前端
1.數據驅動的任務依賴數據庫
如:定時任務tast1, task2, task3之間存在任務依賴關係,必須task1先執行,再task2執行,載task3執行後端
此時,MQ用來傳遞上游任務執行完成的消息。服務器
2.上游不關心執行結果微信
3.上游關注執行結果,但執行時間很長架構
跨公網調用微信支付接口,使用回調網關+MQ來解耦。併發
調用與被調用的關係,是沒法被MQ取代的。運維
用戶登陸場景,登陸頁面調用passport服務,passport服務的執行結果直接影響登陸結果,此處的「登陸頁面」與「passport服務」就必須使用調用關係,而不能使用MQ通訊。異步
不管如何,記住這個結論:調用方實時依賴執行結果的業務場景,請使用調用,而不是MQ。分佈式
使用MQ可能存在的問題:
- 系統更復雜,多了一個MQ組件
- 消息傳遞路徑更長,延時會增長
- 消息可靠性和重複性互爲矛盾,消息不丟(架構師之路-消息總線可否實現消息必達?)不重(冪等性設計)難以同時保證
- 上游沒法知道下游的執行結果,這一點是很致命的
遠程調用服務(RPC)和消息(Message Queue)對比及其適用/不適用場合
吞吐量極高的分佈式消息系統,總體設計是典型的發佈與訂閱系統。下圖1爲Kafka架構圖:
圖-1 Kafka架構圖
消息生產者:即Producer,消息源頭,負責發送消息併發送到Kafka服務器上。
消息消費者:即Consumer,消息的使用方,負責消費Kafka服務器上的消息。
主題:Topic,用戶配置並定義在Kafka服務端,用於創建生產者和消費者之間的訂閱關係:生產者發送消息到指定topic下,消費者從這個topic下訂閱消息。
參考連接
高效開發運維-漫談消息隊列:以Kafka和RocketMQ爲例
芋道源碼-爲何須要消息隊列?使用消息隊列有什麼好處?(主流消息隊列對比)
芋道源碼-分佈式消息隊列RocketMQ源碼分析—Message順序發送與消費(順序消費問題,RocketMQ支持可是通常場景不推薦使用,Kafka只能保證每一個partition內的消息順序傳輸)