五、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.mzph.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 (往左寻找) 若…