RabbitMQ隊列中間件消息持久化?確認(rèn)機(jī)制?死信隊列原理
持久化和應(yīng)答機(jī)制Ack
消息隊列中間件系列的最后一篇了,RabbitMQ消息的持久化、確認(rèn)機(jī)制、死信隊列、負(fù)載均衡等一系列進(jìn)行說明。
消息持久化
- 當(dāng)RabbitMq重啟以后,未消費的消息,可以在服務(wù)重啟后繼續(xù)消費,不會丟失。
應(yīng)答機(jī)制Ack
兩種方式:一種是自動確認(rèn),一種是手動確認(rèn)
- 自動確認(rèn)就是消費者接收消息以后,立即ack,然后再慢慢處理業(yè)務(wù)邏輯,假如業(yè)務(wù)邏輯出現(xiàn)異常,消息也會被確認(rèn)的。
- 手動確認(rèn),消費者接收消息以后,消息狀態(tài)被置為unack狀態(tài),然后由業(yè)務(wù)邏輯指定ack的位置,假如沒有手動ack,則mq中的消息不回減少。
死信隊列
死信隊列 DLX(Dead-Letter-Exchange) 也可以成為死信交換機(jī),就是當(dāng)一個隊列中的消息變成死信以后,會被重新發(fā)送到另一個交換機(jī),這個交換機(jī)就是DLX,而綁定DLX的隊列就是死信隊列。
死信隊列的成因:
**消息被拒絕,**消費者中使用 (basic.reject/basic.nack),并且 requeue = false , 消息被拒絕接收后就會進(jìn)入到死信隊列中。
# 消費者 $callback = function ($msg) { // 拒絕接收消息 $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']); }; $channel->basic_qos(null, 1, null); $channel->basic_consume($queueName,'', false,false,false,false,$callback);
**消息過期,**可以使用 x-message-ttl 參數(shù)設(shè)置當(dāng)前隊列中所有消息的過期時間(單位毫秒)。一旦消息過期,就會從隊列中刪除。
// 在正常隊列中設(shè)置消息過期時間 $channel->exchange_declare('logs', 'direct',false, false, false); $args = new AMQPTable([ // 消息過期時間 'x-message-ttl' => 20000, // 死信交換機(jī) 'x-dead-letter-exchange' => 'dead-exc', // 死信路由鍵 'x-dead-letter-routing-key' => 'dead-key' ]); $channel->queue_declare($queue_name, false, true,false,false,false,$args); $channel->queue_bind($queue_name, 'logs');
隊列達(dá)到最大長度: x-max-length
設(shè)置最大消息數(shù),x-max-length-bytes
設(shè)置最大長度(以字節(jié)為單位)。如果設(shè)置了兩個參數(shù),則兩者都將適用,將強(qiáng)制執(zhí)行首先達(dá)到的限制。
$args = new AMQPTable([ // 設(shè)置最大消息數(shù) 'x-max-length' => 2, 'x-dead-letter-exchange' => 'dead-exc', 'x-dead-letter-routing-key' => 'dead-key' ]);
設(shè)置死信隊列,只需要定義隊列的時候設(shè)置x-dead-letter-exchange
指定交換機(jī)就可以了
延時隊列
延時隊列就是當(dāng)消息發(fā)送以后,并不想讓消費者立刻拿到消息,而是等待特定時間后消費者才能拿到消息來消費。
集群模式
- 允許生產(chǎn)者和消費者在RabbitMQ節(jié)點崩潰的情況下繼續(xù)運行。
- 允許通過添加更多的節(jié)點來擴(kuò)展消息通信的吞吐量。
RabbitMQ會始終記錄以下四種類型的內(nèi)部元數(shù)據(jù):
- 隊列元數(shù)據(jù),隊列名稱和它們的屬性(是否持久化,是否自動刪除)
- 交換機(jī)元數(shù)據(jù),交換器類型、名稱和屬性
- 綁定元數(shù)據(jù),一張簡單的表格展示了如何將消息路由到隊列
- vhost元數(shù)據(jù),為vhost內(nèi)的隊列、交換機(jī)和綁定提供命名空間和安全屬性
RabbitMQ集群分為3個模式,主備模式,鏡像模式,異地多活模式。
- 主備模式,從節(jié)點相當(dāng)于主節(jié)點的鏈接,所有從節(jié)點收到的請求,真實轉(zhuǎn)向的都是主節(jié)點,一般在并發(fā)和數(shù)據(jù)不是特別多的情況下使用,當(dāng)主節(jié)點掛掉會從備份的節(jié)點中選擇一個節(jié)點出來作為主節(jié)點對外提供服務(wù)。
- 鏡像模式,將需要消費的隊列變成鏡像隊列,存在于多個節(jié)點,這樣就可以實現(xiàn)RabbitMQ的HA高可用,作用就是消息實體會主動在鏡像節(jié)點之間實現(xiàn)同步,任何一個節(jié)點宕機(jī)都都關(guān)系,保證100%數(shù)據(jù)不丟失,在實際工作中用的最多的。
- 異地多活模式,用來實現(xiàn)異地的數(shù)據(jù)復(fù)制,使用多活模式需要借助federation插件來實現(xiàn)集群間或節(jié)點間的消費復(fù)制,廣泛用于多互聯(lián)網(wǎng)公司。
以上就是消息隊列中間件 - RabbitMQ消息的持久化、確認(rèn)機(jī)制、死信隊列的詳細(xì)內(nèi)容,更多關(guān)于消息隊列中間件 - RabbitMQ的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ArcGIS Pro 按照字段進(jìn)行融合或拆分的操作步驟
ArcGIS Pro 是 Esri 提供的功能全面的專業(yè)桌面 GIS 應(yīng)用程序,這篇文章主要介紹了ArcGIS Pro 按照字段進(jìn)行融合或拆分,需要的朋友可以參考下2024-02-02JetPack開發(fā)中使用CameraX完成拍照和拍視頻功能
CameraX 是一個 Google 推出的 JetPack 組件。今天給大家分享JetPack之使用CameraX完成拍照和拍視頻,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-06-06趁熱打鐵!HTTPGet與HTTPPost的區(qū)別詳解
這篇文章主要介紹了趁熱打鐵!HTTPGet與HTTPPost的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10