五、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

C#:把dll封入exe中方法

在这个事件中,可以重新为加载失败的程序集手动加载 如果你将dll作为资源文件打包的你的应用程序中(或者类库中) 就可以在硬盘加载失败的时候 从资源文件中加载对应的dll 就像这样: class Program {static Program(){ //这个绑定事件必须要在引用到TestLibrary1这个程序…

C#结构类型图

转载于:https://www.cnblogs.com/kangao/p/8674838.html

使用gradle多渠道打包

以友盟的多渠道打包为例,如果我们须要打包出例如以下渠道:UMENG, WANDOUJIA, YINGYONGBAO。 第一种方法。是须要创建文件的。我们在写完我们的代码之后,在app/src以下。分别创建和main同级目录的目录umeng, wandoujia, yingyongbao,这三个目录…

四大步骤,彻底关闭Win10自动更新

尽管Win11已经发布了一段时间,但目前互联网上大部分电脑用户所使用的的操作系统仍是Win10,对于Win10,笔者相信大部分人应该都不陌生,作为目前市面上占比最高的电脑系统,Win10的许多功能和操作逻辑都十分优秀&#xff0…

虚拟机windows7安装启动MYSQL5.7

一.环境 环境:虚拟机VMVare 系统:windows7旗舰版 MYSQL版本:mysql5.7.25 二.具体步骤 1.首先下载安装mysql5.7.25,这里用的是安装版的mysql,网上大多数都是推荐去官网下载,这里推荐的是清华大学开源镜像站…

故障转移架构的本质:数据中心的基础设施过剩

数据中心构成了全球互联基础设施的核心,我们称之为“云”。从根本上讲,云计算指的是基础设施从桌面计算(文件和应用程序存储在计算机的本地硬盘上)到在线计算(文件和应用程序存储在可通过互联网远程访问的数据中心中&a…

常用模块之hashlib,configparser,logging模块

常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等。 那么什么是摘要算法呢?摘要算法又称为哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 注…

浙江嘉兴徒步游

最近参加了一个徒步团,趁着周末时光,来了一场徒步旅游,不一样的体验图片发自简书App一开始进山探秘外蒲岛的路程,荒草丛生图片发自简书App树木郁郁葱葱,蓝天白云,一切都很没好图片发自简书App漫山遍野都开满…

ASP.NET Web API 2 过滤器

前言 我们知道 ASP.NET Web API 过滤器,也是属于消息处理机制中的一部分。正因如此,我们经常使用它来完成对请求的授权验证、参数验证,以及请求的 Log 记录,程序异常捕获等。 1. 常用的四大过滤器 ASP.NET Web API 2 中的所有…

为选择合适的ERP供应商,是否该发布需求建议书(RFP)?

全球有成百上千家企业资源规划 (ERP) 解决方案供应商。在开展挑选 ERP 供应商的项目时,不可能与所有这些供应商都进行接触。不断缩小这一领域供应商的范围,直到最终敲定最适合的入围名单(通常被称为“最终候选人名单”)是项目成功…

java stream 原理

java stream 原理 需求 从"Apple" "Bug" "ABC" "Dog"中选出以A开头的名字,然后从中选出最长的一个,并输出其长度 1. 最直白的实现 缺点 迭代次数过多频繁产生中间结果,性能无法接受2. 平常写法 int …

Java常量池理解与总结

2019独角兽企业重金招聘Python工程师标准>>> 一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。Class文件中…

转载:https://blog.csdn.net/dcrmg/article/details/52939318

张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图)使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输…

Redis学习笔记--Redis数据过期策略详解==转

本文对Redis的过期机制简单的讲解一下  讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存session,又或者只存放日行…

会员连锁配置以及金额走向

PS:所有电子支付方式的资金走向都是同样的,配置的是什么支付方式就走什么支付方式;下面以支付宝为例说明 一、连锁非总机模式 资金走向: 支付宝:收到的钱在主账号配置的支付宝,会员卡的金额在主账号 微信:收…

C# 多线程及同步简介示例

60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是…

Spring Framework 5.1.6、5.0.13 与 4.3.23 发布

开发四年只会写业务代码,分布式高并发都不会还做程序员? Spring Framework 5.1.6、5.0.13 与 4.3.23 发布了。 v5.1.6 包含 49 个 bug 修复和功能改进;v5.0.13 是 5.0.x 系列的最后一个版本,包含了 25 个 bug 修复和功能改进&am…

单目视觉标定:世界坐标系、相机坐标系、图像坐标系、像素坐标系——简单粗暴,粗暴

转:https://blog.csdn.net/chentravelling/article/details/53558096 1.正文 图像处理、立体视觉等等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。例如下图: 构建世界坐标系只是为了更好的描述相机的位置在哪…

VSFTP的使用

一、基本安装 1.安装服务 yum -y install vsftpd //centos Redhat apt-get install vsftpd //debian ubuntu 2.开启服务 service vsftpd status //查看状态,默认是关闭的 service vsftpd start 3.开机随操作系统启动 chkconfig vsftpd on4.添加账号 useradd -d /…