消息隊列的使用場景
異步處理
,比如用戶註冊後需要發送註冊郵件或者註冊短信,可以將發送郵件消息放到消息隊列再異步去處理,用戶就不需要等到發送完才返回註冊響應,提高了響應速度。應用解耦
,比如訂單系統和庫存系統之間使用消息隊列進行解耦,避免了庫存系統故障而導致訂單也無法完成的嚴重錯誤。流量削鋒
,比如秒殺活動,大量用戶請求涌進,服務器接收後寫入消息隊列。假如消息隊列消息的長度超過最大數量,則直接拋棄用戶請求或者跳轉到錯誤頁面。業務部分再根據消息隊列中的請求做後續的處理。消息通訊
,比如實現點對點消息隊列,或者聊天室等。日誌處理
,比如Kafka,解決大量日誌傳輸的問題,日誌採集客戶端負責日誌的採集,定時寫入消息隊列;Kafka再負責日誌數據的接收、存儲和轉發。
消息的重發補償解決思路
消息的冪等性解決思路
消息的堆積解決思路
增大批次
:瓶頸在消費吞吐量的時候,增加批次也可以改善性能增加線程數
:如果一些消費者組中的消費者線程還是有 1 個消費者線程消費多個分區的情況,建議增加消費者線程。儘量 1 個消費者線程對應 1 個分區,從而發揮現有分區數下的最大並行度。
自己如何實現消息隊列
如何保證消息的有序性
- 拆分多個 queue,每個 queue 一個 consumer,就是多一些 queue 而已,確實是麻煩點;或者就一個 queue 但是對應一個 consumer,然後這個 consumer 內部用內存隊列做排隊,然後分發給底層不同的 worker 來處理。