目標:
利用rabbitmq實現訊息重試和失敗處理,實現可靠的消費消費。在訊息消費異常時,自動延時將訊息重試,當重試超過一定次數後,則列為異常訊息,等待後續特殊處理。
準備:
ttl:time-to-live,通過給訊息、佇列設定過期時間(單位:毫秒),來控制訊息、佇列的生命週期。在達到時間後,訊息會變成dead message。
dead letter exchanges:同普通的exchange無區別
訊息重制本質是通過訊息**來實現的。訊息**的觸發是:
這裡,我們使用expired來實現。給訊息設定ttl,到期後訊息未被消費,則會變成dead messager,**到dead letter exchange。
流程圖:
實現:
1、建立三個exchange。沒有特殊要求
2、建立三個queue。
clickqueue@retry作為重試佇列,需要特殊處理:
x-dead-letter-exchange:clickexchange
x-dead-letter-routing-key:clickkey
x-message-ttl:30000
3、處理**
public voidretry() throws ioexception catch (exception e)
properties.builder().headers(headers);
rabbitutil.send(dqconstant.click_failed_exchange_name
, dqconstant.click_failed_routing_key
, properties, getresponse.getbody());
} else
properties.builder().headers(headers);
rabbitutil.send(dqconstant.click_retry_exchange_name
, dqconstant.click_retry_routing_key
, properties, getresponse.getbody());
} }
}if(null != getresponse)
}
private long4、x-death的使用:message在轉換成dead letter時,會在其header裡新增乙個名為x-death的陣列。陣列元素就是一次dead lettering event的記錄。包含count:訊息幾次變成了dead letter。getretrycount(amqp.basicproperties properties) }}
return retrycount;
}
總結:
此處只是本人的拙見。如有更好的提議,歡迎拍磚。
RabbitMQ實戰 理解訊息通訊
前段時間總結完了 深入淺出mybatis 系列,對mybatis有了更全面和深入的了解,在掘金社群也收到了一些博友的喜歡,很高興。另外,短暫的陪產假就要結束了,小寶也二周了,下周二就要投入工作了,希望自己盡快調整過來,加油努力。從本篇開始總結 rabbitmq實戰 系列的閱讀筆記,rabbitmq是...
RabbitMQ實戰 理解訊息通訊
rabbitmq是乙個開源的訊息 和佇列伺服器,可以通過基本協議在完全不同的應用之間共享資料,可以將作業排隊以便讓分布式服務進行處理。本篇介紹下訊息通訊,首先介紹基礎概念,將這些概念對映到amqp協議,然後介紹訊息持久化 傳送方確認模式等訊息可靠性保證。通過本篇介紹,你會了解到 訊息通訊概念 此部分...
RabbitMQ (2) 理解訊息通訊
訊息包含兩部分 有效載荷 payload 和標籤 label 通道是建立在 真實的 tcp連線內的虛擬連線,amqp命令是通過通道傳送出去的 消費者通過以下兩種方式從特定的佇列中接收訊息 a.通過amqp的basic.consume命令訂閱 b.basic.get 確認a.basic.ack 顯示的...