可靠性投遞(100%投遞成功)java
冪等性(解決重複消費)redis
confirm機制、return機制數據庫
自定義消費者緩存
消息的Ack和重回隊列併發
消息限流分佈式
TTL消息高併發
死信隊列fetch
生產端的可靠性投遞spa
解決方案3d
方法1:消息入庫、定時任務補償
biz/MsgDB -> sender -> mq broker -> confirm Listener -> MsgDB
schedule -> MsgDB -> retry sender -> retry count -> MsgDB
方法二:消息和數據庫無關、延遲投遞、二次確認
消息端屢次消費保障結果不會累計
數據表保障惟一性
消息的確認:
broker給producer的confirm報文。
step1: 開啓確認模式 channel.confirmSelect()
step2: 在channel添加監聽 addConfirmListener
return listener 用於處理不可路由的消息
生產者監聽不可達的消息
在基礎API有一個關鍵配置項:
Mandatory
若是爲true,則監聽器接收到路由不可達的消息,而後進行後續處理;若是爲false則broker自動刪除這些消息。
consumer 繼承 DefaultConsumer
實現 handleDelivery
因爲高併發或延遲,致使隊列中堆積巨量的消息。
而後這巨量的消息所有推送給消費者,可是單一的消費客戶端沒法同時處理這巨量的消息。
auto ack 設爲 false
basic qos
Rabbitmq提供了一種Qos(服務質量保證)的功能。即在非自動確認的前提下,若是必定數目的消息未被確認前,不進行消費。
basicQos(unit prefetchSize,ushort prefetchCount,bool global)
TODO
: 搞清楚這裏的含義,怎麼設置的
消費端的手工ACK和NACK
/ * nack
* @param deliveryTag 標籤
* @param multiple true 批量處理
* @param requeue true 重回隊列 扔到隊尾
*/
channel.basicNack(envelope.getDeliveryTag(), false, true);
/** * ack */
channel.basicAck(envelope.getDeliveryTag(),false);
複製代碼
注意:重回隊列(requeue)和死信隊列(dead letter)區別
消息的生存時間有2種
arguments
DLX、Dead-Letter-Exchange
定義:利用DLX 當消息在一個隊列中變成死信後,它能從新push到另外一個exchange,這個exchange稱爲DLX。
消息變成死信的狀況
DLX是正常的exchange和其餘沒什麼區別,能在任何隊列上指定
當隊列中有死信時,rabbitMq自動將這個消息從新發布到設置的exchange,被路由到另外一個隊列。
能夠監聽死信隊列作相應的處理
Exchange:cdlx.exchange Queue:dlx.queue RoutingKey:#
x-dead-letter-exchange
dlx.exchange
死信隊列使用流程圖: