五、RabbitMQ的消息屬性(讀書筆記)

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

簡介

當使用RabbitMQ發布消息時,消息又AMQP規范中的三個低層幀類型組成:

  1. Basic.publish方法幀;
  2. 內容頭幀;
  3. 消息體幀;

這三種幀類型按順序一起工作,以便消息傳遞時完好無損。

其中,內容頭幀中的消息屬性是一種預定義的值,這些值通過設置Basic.Properties數據結構進行指定:

  • content-type屬性:讓消費者知道如何解釋消息體;
  • content-encoding屬性:指示消息體使用某種特殊的方式進行壓縮或編碼;
  • message-id和correlation-id屬性:表示唯一消息標識和消息響應標識,用于在工作流程中實現消息跟蹤;
  • timestamp屬性:表示消息創建時間;
  • expiration屬性:表示消息的過期時間;
  • delivery-mode屬性:將消息寫入磁盤或內存隊列;
  • app-id和user-id屬性:幫助追蹤出現問題的消息發布者應用程序;
  • type屬性:表示發布者和消費者之間的契約;
  • reply-to屬性:實現響應消息的路由;
  • headers屬性:定義自由格式的屬性和實現RabbitMQ路由;

不建議使用的屬性有:priority和cluster-id屬性。

content-type屬性介紹

content-type屬性用于描述消息體的數據格式,如同各種標準化的HTTP規范,content-type傳輸消息體也可以使用MIME類型。例如,如果應用程序正在發送JSON序列化的數據值,那么可以將content-type設置為application/json。如果客戶端支持自動序列化,可以在消費消息時,幫你進行序列化的工作。

content-encoding屬性

默認情況下,通過AMQP發送的消息不會被壓縮。但如果在消息數量較大的場景下,則可能會希望對消息進行壓縮。AMQP提供了content-encoding屬性設置壓縮編碼:

不要混淆content-encoding和content-type。與HTTP規范一樣,content-encoding用于指示content-type之外的某種編碼級別。它是一個修飾字段,通常用于表明消息體的內容已經使用gzip或其他形式的壓縮方式進行了壓縮。

結合content-type屬性后,content-encoding屬性使消費者應用程序能夠基于一種明確的契約與發布者進行交互。

message-id和correlation-id屬性

在AMQP規范中,message-id和correlation-id是“應用級別使用”的屬性,原則上,你可以利用它們實現任何目的。這兩個字段允許255個字節的UTF-8編碼數據,并以未壓縮的方式存儲在Basic.Properties數據結構中。

message-id屬性可以存放消息的唯一標識。

correlation-id屬性可以指定該消息是另一個消息的響應(另一個消息的標識)。

timestamp屬性

通過使用timestamp屬性來指示消息的創建時間,消費者可以用來評估消息投遞過程的性能。

該屬性沒有時區上下文,因此建議在所有消息中使用UTC或其他統一的時區。

expiration屬性

如果消息沒有被消費,expiration屬性會告訴RabbitMQ何時應該丟棄消息。它的格式是一個短字符串,允許255個字符。

想要利用expiration屬性來實現RabbitMQ消息的自動過期,它必須包含一個UNIX紀元時間或整數時間戳,然后把它存儲為字符串。如果把一個已經超時的消息發布到服務器,則該消息不會被路由到任何隊列,而是被直接丟棄。

RabbitMQ還有一個可以讓消息過期的功能,在聲明隊列時,將一個x-message-ttl參數和隊列定義在一起,這個值也是一個UNIX紀元時間戳,精度是毫秒,數據類型是整數值。

delivery-mode屬性

delivery-mode可能是很多人研發人員最感興趣的一個屬性,因為它關乎與RabbitMQ的性能。它表示在將消息投遞給任何消費者之前,是否希望先將它持久化到磁盤上,delivery-mode又2個值:1表示非持久化消息,2表示持久化消息。

不要把消息持久化和隊列持久化(durable)混淆,隊列持久化是告訴RabbitMQ隊列的定義在重啟RabbitMQ后是否仍然有效。只有設置了消息的delivery-mode才會告訴RabbitMQ消息是否應該被持久化。一個隊列可能包含持久化和未持久化的消息。

前面說過delivery-mode屬性關乎性能,是因為內存IO比磁盤IO要快,因此將delivery-mode設置為1將會盡可能降低消息投遞的延遲性。

盡管這可以保證RabbitMQ崩潰時消息不會丟失,但是它存在性能和伸縮性的問題,設置為持久化將會對消息投遞和性能有著很大的影響。

app-id和user-id屬性

app-id和user-id屬性提供了關于消息的另一層信息,可以攜帶一些信息以便消費者應用程序在處理消息之前進行驗證。

app-id屬性在AMQP規范中定義為“短字符串”,最多允許UTF-8字符。在生成消息時可以使用app-id傳遞特定API和版本號。可加強使用app-id可以更容易地追蹤惡意消息的來源。

user-id屬性一般用于存放已經登錄的用戶信息。

type屬性

type屬性被定義為“消息類型名稱”,一般可以用于描述消息中的內容,應用程序可以根據它來確定如何處理一個消息。

創建自描述消息時,type屬性非常有用,它可用于指定記錄類型或外部定義文件(使用Google的Protobuf)。

reply-to屬性

使用reply-to可以構件一個用來恢復消息的私有響應隊列。這個定義中有大多的不明確性,所以使用起來需謹慎。

headers屬性

headers屬性是key-value結構,允許用戶自定義任意的key和value。

key可以是ASCII或Unicode字符串,最大長度為255個字符。value可以是任何有效的AMQP值類型。

與其他屬性不同,header屬性允許你添加任何想要添加的數據到消息頭表中。并且,RabbitMQ可以根據headers表中填充的值來路由消息,而不需要依賴路由鍵。

priority屬性

截至3.5.0版本,RabbitMQ已經按照AMQP規范實現了priority字段,它的值被定義為0~9之間。用于指定隊列中消息的優先級。

priority字段實現為無符號字節,所以優先級可以是0~255,但優先級應該被限制在0~9之間。

不能使用的屬性:cluster-id/reserved

cluster-id屬性在AMQP0-8中定義的,但隨后被刪除。

AMQP0-9-1將其重命名為reserved,并聲明它必須為空,雖然RabbitMQ目前沒有根據規范要求它是空的,但你最好完全規避它。

轉載于:https://my.oschina.net/u/2450666/blog/3027667

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252059.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252059.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252059.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

異步和單線程

轉載于:https://www.cnblogs.com/sunmarvell/p/8674748.html

windows下解決mysql5中文亂碼的問題

1.問題描述:一開始無論是在命令行,還是在mysql的客戶端輸入中文都會出現 “???” 問題之類的亂碼問題; 2.解決辦法: 1)cmd 進入mysql ,命令mysql -uroot -p123456 2)然后執行 show variable…

C#:把dll封入exe中方法

在這個事件中,可以重新為加載失敗的程序集手動加載 如果你將dll作為資源文件打包的你的應用程序中(或者類庫中) 就可以在硬盤加載失敗的時候 從資源文件中加載對應的dll 就像這樣: class Program {static Program(){ //這個綁定事件必須要在引用到TestLibrary1這個程序…

P2685 [TJOI2012]橋

P2685 [TJOI2012]橋 思路: 先求出最短路: d1[u] : u 到 1 的最短路, d2[u] : u 到 n 的最短路 再求出一條從 1 到 n 的最短路鏈,然后從鏈上的每一個點出發dfs, 求出: l[u] : u 到 1 的最短路徑過中和鏈的交點&#xf…

C#結構類型圖

轉載于:https://www.cnblogs.com/kangao/p/8674838.html

C# 全局鉤子實現掃碼槍獲取信息

1.掃描槍獲取數據原理基本相當于鍵盤數據,獲取掃描槍掃描出來的數據,一般分為兩種實現方式。 a)文本框輸入獲取焦點,掃描后自動顯示在文本框內。 b)使用鍵盤鉤子,勾取掃描槍虛擬按鍵,根據按鍵頻…

Centos下安裝mysql(二進制版)

Centos下安裝mysql(二進制版) 1.下載安裝包,選擇相應的平臺、版本,比如,選擇64位Linux平臺下的MySQL二進制包“Linux-Generic (glibc 2.5)(x86,64-bit)&#…

使用gradle多渠道打包

以友盟的多渠道打包為例,如果我們須要打包出例如以下渠道:UMENG, WANDOUJIA, YINGYONGBAO。 第一種方法。是須要創建文件的。我們在寫完我們的代碼之后,在app/src以下。分別創建和main同級目錄的目錄umeng, wandoujia, yingyongbao,這三個目錄…

SMMS 2016 啟用深色主題

1、用文本類編輯器 打開C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio目錄下的 ssms.pkgundef 2、去除// Remove Dark theme行以下的注釋 3、重新打開SMMS,如果還沒有出現“深色”主題,請執行第4點 4、打開powershell【…

四大步驟,徹底關閉Win10自動更新

盡管Win11已經發布了一段時間,但目前互聯網上大部分電腦用戶所使用的的操作系統仍是Win10,對于Win10,筆者相信大部分人應該都不陌生,作為目前市面上占比最高的電腦系統,Win10的許多功能和操作邏輯都十分優秀&#xff0…

LeetCode算法題-Repeated String Match(Java實現)

這是悅樂書的第289次更新,第307篇原創 01 看題和準備 今天介紹的是LeetCode算法題中Easy級別的第156題(順位題號是686)。給定兩個字符串A和B,找到A必須重復的最小次數,使得B是它的子字符串。 如果沒有這樣的解決方案&a…

php

●轉載于:https://www.cnblogs.com/volcanorao/p/8678104.html

Vs快捷鍵設置(可搭配Vim使用)

設置方式: 通過在Vs菜單欄的工具->選項->環境->鍵盤。 常用快捷鍵: 推薦鍵位編輯.轉到定義Alt G切換標題代碼文件Alt Q查看.向前導航Alt D查看.向后導航Alt A調試.調用堆棧Alt 7調試.監視1Alt 8調試.內存1Alt 9查看.查找符號結果Alt 1查看.錯誤列表Alt …

虛擬機windows7安裝啟動MYSQL5.7

一.環境 環境:虛擬機VMVare 系統:windows7旗艦版 MYSQL版本:mysql5.7.25 二.具體步驟 1.首先下載安裝mysql5.7.25,這里用的是安裝版的mysql,網上大多數都是推薦去官網下載,這里推薦的是清華大學開源鏡像站…

故障轉移架構的本質:數據中心的基礎設施過剩

數據中心構成了全球互聯基礎設施的核心,我們稱之為“云”。從根本上講,云計算指的是基礎設施從桌面計算(文件和應用程序存儲在計算機的本地硬盤上)到在線計算(文件和應用程序存儲在可通過互聯網遠程訪問的數據中心中&a…

CentOS啟動Tomcat巨慢

在本地開發環境,應用正常啟動。 在CentOS測試環境,應用啟動速度也是正常的。 但是在阿里云的生產環境,tomcat啟動超級慢,并且在最終打印出來以下內容: org.apache.catalina.util.SessionIdGenerator createSecureRando…

Oracle 存儲過程

什么是存儲過程?存儲過程是一種命名的PL/SQL程序塊,它是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼像一個方法一樣實現一些功能(對單表或多表的增刪改查),可以有參數、輸入輸出參數,通常沒…

查看Oracle 版本信息

select * from v$version;轉載于:https://www.cnblogs.com/hanje/p/10614555.html

ubuntu上安裝docker

在Ubuntu16.04上安裝Docker Docker是一個開源的容器引擎,它有助于更快地交付產品。Docker可將應用程序和基礎設施層隔離,并且將基礎設施當作程序一樣進行管理。使用Docker,可以更快地打包,測試以及部署應用程序,并可以…

字符串問題之 在有序但含有空的數組中查找字符串

盡可能使用二分查找 假設在 left right 之間查找 關鍵是mid處理過程 導致 left 跟 right 的改變 控制去哪里尋找 分如下情況: 若 mid處 不為空,并且 此處就是 str 那么記下 mid ,同時把right-1 (往左尋找) 若…