1. 程式人生 > >RabbitMQ(二)AMQP協議mandatory和immediate標誌位區別

RabbitMQ(二)AMQP協議mandatory和immediate標誌位區別

mandatory和immediate是AMQP協議中basic.pulish方法中的兩個標誌位,它們都有當訊息傳遞過程中不可達目的地時將訊息返回給生產者的功能。具體區別在於:

1. mandatory標誌位

當mandatory標誌位設定為true時,如果exchange根據自身型別和訊息routeKey無法找到一個符合條件的queue,那麼會呼叫basic.return方法將訊息返還給生產者;當mandatory設為false時,出現上述情形broker會直接將訊息扔掉。

2. immediate標誌位

當immediate標誌位設定為true時,如果exchange在將訊息route到queue(s)時發現對應的queue上沒有消費者,那麼這條訊息不會放入佇列中。當與訊息routeKey關聯的所有queue(一個或多個)都沒有消費者時,該訊息會通過basic.return方法返還給生產者。

概括來說,mandatory標誌告訴伺服器至少將該訊息route到一個佇列中,否則將訊息返還給生產者;immediate標誌告訴伺服器如果該訊息關聯的queue上有消費者,則馬上將訊息投遞給它,如果所有queue都沒有消費者,直接把訊息返還給生產者,不用將訊息入佇列等待消費者了。

用前一篇中的程式amqp_sendstring來測試這兩個標誌位情況如下

設定了mandatory,路由不到佇列的情況:

    die_on_error(amqp_basic_publish(conn,
                                    1,
                                    amqp_cstring_bytes(exchange),
                                    amqp_cstring_bytes(routingkey),
                                    1,   //mandatory標誌位,訊息不能到達佇列則返回basic.return
                                    0,   //immediate標誌位,訊息不能到達消費者返回basic.return
                                    &props,
                                    amqp_cstring_bytes(messagebody)),
                 "Publishing");

./amqp_sendstring localhost 5672 amq.direct jfy test
method.id=003C0032,method.name=AMQP_BASIC_RETURN_METHOD
Return.reply_code=312
Return.reply_text=NO_ROUTE
Return.message=test

返回"NO_ROUTE"

設定了immediate,路由不到佇列的情況:
    die_on_error(amqp_basic_publish(conn,
                                    1,
                                    amqp_cstring_bytes(exchange),
                                    amqp_cstring_bytes(routingkey),
                                    0,   //mandatory標誌位,訊息不能到達佇列則返回basic.return
                                    1,   //immediate標誌位,訊息不能到達消費者返回basic.return
                                    &props,
                                    amqp_cstring_bytes(messagebody)),
                 "Publishing");

./amqp_sendstring localhost 5672 amq.direct jfy test
method.id=003C0032,method.name=AMQP_BASIC_RETURN_METHOD
Return.reply_code=313
Return.reply_text=NO_CONSUMERS
Return.message=test

返回"NO_CONSUMERS"

注意:在RabbitMQ3.0以後的版本里,去掉了immediate引數支援,傳送帶immediate標記的publish會返回如下錯誤:

“{amqp_error,not_implemented,"immediate=true",'basic.publish'}”

為什麼移除immediate標記,參見如下版本變化描述:

Removal of "immediate" flag
What changed? We removed support for the rarely-used "immediate" flag on AMQP's basic.publish.
Why on earth did you do that? Support for "immediate" made many parts of the codebase more complex, particularly around mirrored queues. It also stood in the way of our being able to deliver substantial performance improvements in mirrored queues.
What do I need to do? If you just want to be able to publish messages that will be dropped if they are not consumed immediately, you can publish to a queue with a TTL of 0.
If you also need your publisher to be able to determine that this has happened, you can also use the DLX feature to route such messages to another queue, from which the publisher can consume them.

這段解釋的大概意思就是:immediate標記會影響映象佇列效能,增加程式碼複雜性,並建議採用"設定訊息TTL"和"DLX"等方式替代。

相關推薦

RabbitMQAMQP協議mandatoryimmediate標誌區別

mandatory和immediate是AMQP協議中basic.pulish方法中的兩個標誌位,它們都有當訊息傳遞過程中不可達目的地時將訊息返回給生產者的功能。具體區別在於: 1. mandatory標誌位 當mandatory標誌位設定為true時,如果exchange

前端面試題----前端模組化元件化的區別聯絡

前端元件化開發和模組化開發的區別 之前一直以為模組化開發和元件化開發是一個意思,有次看到了類似這樣的題,發現自己還是太年輕,現在整理一點出來。 首先,元件化和模組化的意義都在於實現了分治,目前我們開發的專案複雜度不斷的上升,早已不是我們一個人能完成的工作,團

RabbitMQ訊息佇列系列教程Windows下安裝部署RabbitMQ

摘要 本篇經驗將和大家介紹Windows下安裝和部署RabbitMQ訊息佇列伺服器,希望對大家的工作和學習有所幫助! 目錄 一、Erlang語言環境的搭建 RabbitMQ開源訊息佇列服務是使用Erlang語言開發的,因此我們要使用他就必須先進行Erlang語言環境的搭建,其實是非常簡

linux網路程式設計之TCP/IP基礎:利用ARPICMP協議解釋ping命令

一、MTU 乙太網和IEEE 802.3對資料幀的長度都有限制,其最大值分別是1500和1492位元組,將這個限制稱作最大傳輸單元(MTU,Maximum Transmission Unit)。如果I

DNS服務器介紹——主從復制區域轉發

dns;區域轉發;主從復值背景介紹實際環境中為了避免單點故障,DNS服務器是由一組服務器組成每一個服務器上都有若幹個區域,不同服務器上的相同區域分為主和從兩種角色。由於正向和反向是不同的區域,所以多臺服務器間的相同區域可以互為主從或者一主多從,本處以右圖為例進行演示。DNS服務器的主從復制1.之前已經在172

apache atlas配置運行

altas href 訪問 min mage sta 功能 技術分享 -1 上一篇文章,我們已經構建出了altas的安裝包,所以我們繼續使用安裝包配置和運行atlas 首先解壓atlas壓縮包,授予bin目錄下的執行權限 1.默認啟動atlas cd atlas/bi

iptables實用教程:管理鏈策略

否則 命令顯示 accept 目的 number cep 存在 當前 末尾 概念和原理請參考上一篇文章“iptables實用教程(一)”。 本文講解如果管理iptables中的鏈和策略。 下面的代碼格式中,下劃線表示是一個占位符,需要根據實際情況輸入參數,不帶下劃線的表示是

分布式筆記一致性協議

分析 text 如何 更多 區別 accept 進行 當前 分布式系統 一致性協議 一、2PC與3PC 請自行回憶2PC與3PC的過程,及在正式提交階段的處理單點問題的區別。分析各自的優缺點。 二、Paxos算法 一)Paxos算法解決的問題:分布式系統中如何對一個問題

來學學數據分析吧第一章 預測關聯數量特征

想要 夠快 均方誤差 容易 預測 適用於 color 就是 工程 Chapter 1 Regression: Predicting and Relating Quantitative Features 1.1 統計學,數據分析,回歸 統計學是利用數學來研究和提高從不完

springMVC學習總結路徑映射請求方法限定

根路徑 後臺 mapping oca log alt public mes cti springMVC學習總結(二)路徑映射和請求方法限定 一、路徑映射 無參數的訪問路徑 對springmvc項目的訪問路徑,是由根路徑和子路徑組成;在註解式開發中,根路徑標註在類名之上,子

Linux故障處理更改root密碼修復文件系統

無法識別 丟失 ges 包括 故障處理 磁盤 free roo ext4 Linux故障處理(二)更改root密碼和修復文件系統一、遺忘root用戶的密碼大多數時候Linux主機中具有root權限的用戶只有一個,因此需要通過其他途徑來重設root賬號密碼。最簡單的途徑是在開

設計模式學習筆記--簡單工廠模式工廠模式

bsp bubuko rac oid nds gen body () pri 老生長談的兩個設計模式了,這裏把這兩個設計模式對比著來總結一下。 什麽是簡單工廠模式? 簡單工廠模式:根據傳入工廠類的參數動態決定要創建哪一個產品類的實例。 UML圖如下(以實現一個計算器為例):

RabbitMQ ——工作隊列

bin 生產 就是 發送 定時 順序 -h 預取 list RabbitMQ(二) ——工作隊列 (轉載請附上本文鏈接——linhxx) 一、概述 工作隊列模式(work queue),是有多個消費者的情況下,可以共同消費隊列內的內容,加快消息處理速度

QtCreator插件開發——QtCreator菜單菜單項

QtCreator插件開發 菜單QtCreator插件開發(二)——QtCreator菜單和菜單項 一、QtCreator菜單欄簡介 1、QtCreator菜單簡介 QtCreator菜單欄如下:QtCreator默認菜單包括“文件”、“編輯”、“工具”、“窗體”、“幫助”。“構建”、“調試”、“分析”由插

MyBatis入門—— 輸入映射輸出映射、動態sql、關聯查詢

輸出類型 sql name屬性 一對一 test HA h標簽 自動 CI p.p4 { margin: 0.0px 0.0px 0.0px 10.0px; font: 10.5px "PingFang SC" } p.p6 { margin: 0.0px 0.0px 0.

MySQLMySQL的安裝簡單使用

cti loaded 都差不多 插入記錄 tro 提高 CI bsp 一個數 1、MySQL產品的介紹 MySQL數據庫屬於MySQL AB公司,總部位於瑞典,後被Oracle收購。 優點: (1)成本低:開放源代碼,可以免費使用 (2)性能高:執行很快 (2)簡單:很容易

Java Web -- Http協議 & Servlet

通用 -i 文檔 ica exe 服務器端 get bat 多個 Http協議&Servlet Http協議 1、什麽是協議   雙方在交互、通訊的時候, 遵守的一種規範、規則。 2、http協議   針對網絡上的客戶端 與 服務器端在執行http請求的時候,遵守的

密碼協議仲裁協議

轉載 lock variant 社會地位 應該 bre 時間 tran poi 區塊鏈兄弟社區,區塊鏈技術專業問答先行者,中國區塊鏈技術愛好者聚集地作者:於中陽來源:區塊鏈兄弟原文鏈接:http://www.blockchainbrother.com/article/93著

C# 詞法分析器輸入緩沖代碼定位

自己 ML 轉換 .html 優點 有時 表示 error hub 系列導航 (一)詞法分析介紹 (二)輸入緩沖和代碼定位 (三)正則表達式 (四)構造 NFA (五)轉換 DFA (六)構造詞法分析器 (七)總結 一、輸入緩沖 在介紹如何進行

網絡編程——TCP協議、socket

cep 數據請求 b- aps pre alt 技術分享 隱藏 可靠 TCP協議與socket套接字 一、TCP協議 1、可靠傳輸,TCP數據包沒有長度限制,理論上可以無限長,但是為了保證網絡的效率,通常TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包不必