RabbitMQ消息属性详解

news2024/11/16 12:36:51

content-type属性

如同各种标准化的HTTP规范,content-type传输消息体的MIME类型。例如,如果你的应用程序正在发送JSON序列化的数据值,那么将content-type属性设置为application/json将允许尚待开发的消费者应用程序在收到消息时检查消息类型并对消息进行正确解码。

在 RabbitMQ 中,默认的 content-type 是 application/octet-stream。

application/octet-stream 是一个常见的 MIME 类型,它表示二进制数据流,也可以理解为未知的二进制文件类型。"octet" 指的是 8 位字节,表示该类型可以包含任意的二进制数据。由于它是一个通用的二进制数据流类型,它不会对数据进行解析或做出任何假设,而是将数据视为纯粹的字节序列。

application/octet-stream 类型的文件通常没有特定的格式或解析方式,因此接收者需要根据具体的需求和上下文来处理该文件。它可以用于传输任何类型的数据,例如图像、音频、视频、压缩文件等。

在 RabbitMQ 中,默认将消息的 content-type 设置为 application/octet-stream,因为 RabbitMQ 不对消息的内容进行解析或做任何假设,它仅负责将消息传递给消费者。消费者可以根据自己的需求和上下文来解析和处理接收到的消息数据。

content-encoding属性

默认情况下,通过AMQP发送的消息并不会被压缩。在处理如XML这种过于繁杂的标记语言时,甚至在消息数量较大的场景下处理像JSON或YAML等较少使用标记的轻量级格式时,这都可能会是个问题。你的发布者可以在发布消息之前压缩消息,并在收到消息时进行解压缩,如同我们使用gzip在服务器上压缩网页然后在浏览器端实时解压缩这些网页之后再进行展示一样。

RabbitMQ 的content-type和content-encoding是如何结合使用的

在 RabbitMQ 中,content-type 和 content-encoding 是两个相关但独立的消息属性,用于描述消息的内容类型和内容编码方式。

content-type 属性指定了消息体的内容类型,例如 application/json、text/plain、image/jpeg 等。它告诉消费者如何解析和处理消息的内容。

content-encoding 属性指定了消息体的内容编码方式,例如 gzip、deflate、identity 等。它告诉消费者消息体是否经过了压缩或其他编码方式的处理。

这两个属性可以结合使用,以便消费者能够正确地解码和处理消息。以下是一些示例:

 

消费者在接收到消息时,首先会检查 content-type 属性来确定消息的内容类型。然后,根据 content-encoding 属性,消费者可以选择是否需要解码消息体。

如果 content-encoding 属性为 identity,则消息体未经过任何编码处理,消费者可以直接读取和处理消息体。

如果 content-encoding 属性指定了某种编码方式(例如 gzip),则消费者需要根据指定的编码方式对消息体进行解码,以获取原始的消息内容。

需要注意的是,content-type 和 content-encoding 是消息的属性,由生产者在发送消息时设置。消费者在接收到消息时,可以读取这些属性来正确处理消息的内容

message-id和correlation-id

在AMQP规范中,message-id和correlation-id是“应用级别使用”的属性,并没有提供正式的行为定义。这意味着就规范而言,你可以利用它们实现任何目的。这两个字段允许多达255个字节的UTF-8编码数据,并以未压缩的方式存储在Basic.Properties数据结构中。

【Message-id】某些消息类型(如登录事件)并不需要与其关联的唯一标识,但我们很容易想象如销售订单或支持类请求等的消息需要具备这个唯一标识。当消息流经松耦合系统中的各个组件时,message-id属性使得消息能够在消息头中携带数据,该数据可以唯一地识别该消息。message-id 是消息的唯一标识符,由生产者在发送消息时设置。它用于唯一标识一条消息,并且在整个消息的生命周期中保持不变。message-id 属性可以用于跟踪消息、识别重复消息或在消息处理过程中进行日志记录

【Correlation-id】虽然在AMQP规范中没有关于correlation-id的正式定义,但它的一个用途是指定该消息是另一个消息的响应,通过携带关联消息的message-id可以做到这一点。另一种选择是使用它来传送关联消息的事务ID或其他类似数据。correlation-id 是用于关联消息的属性,通常在消息请求和响应之间使用。当一个系统发送请求消息时,它可以设置 correlation-id 属性为一个唯一的值。然后,当该请求消息被处理并得到响应时,响应消息的 correlation-id 属性会与请求消息的 correlation-id 相匹配,以表明响应消息与哪个请求消息相关联。

通过使用 correlation-id 属性,可以轻松地将请求和响应进行匹配和关联。这在分布式系统或异步消息传递中特别有用,允许跟踪消息的处理和建立请求-响应模式。

需要注意的是,message-id 和 correlation-id 都是可选的消息属性,生产者可以选择是否设置它们。如果生产者没有显式设置这些属性,RabbitMQ 会为消息自动生成一个唯一的 message-id。

消费者在接收到消息时,可以读取 message-id 和 correlation-id 属性来处理消息,并根据需要进行跟踪、日志记录或关联请求和响应。

timestamp属性

RabbitMQ 中的消息可以包含一个名为 timestamp 的属性,用于表示消息的时间戳。timestamp 属性指示消息发送的时间,它是一个整数值,表示自1970年1月1日以来的毫秒数。

生产者在发送消息时可以设置 timestamp 属性,以指定消息的时间戳。这对于在消息中包含时间信息,或者与消息的时间相关的处理非常有用。

消费者在接收到消息时可以读取 timestamp 属性,以获取消息的时间戳。这允许消费者根据消息的时间戳进行处理,例如根据消息的发送时间进行排序、计算消息的延迟等

需要注意的是,RabbitMQ 并不会自动为每条消息设置 timestamp 属性,它是可选的。如果生产者没有显式设置 timestamp 属性,则消息的 timestamp 默认为未设置状态。因此,消费者在处理消息时应该检查 timestamp 属性是否存在,以避免处理未设置时间戳的消息。

expiration属性

在 RabbitMQ 中,消息可以具有一个名为 expiration 的属性,用于指定消息的过期时间。expiration 属性是一个字符串,表示消息在队列中可以保留的时间。

当消息在队列中等待被消费时,RabbitMQ 会根据消息的 expiration 属性进行判断。如果消息在队列中的时间超过了指定的过期时间,RabbitMQ 将会自动将该消息从队列中移除,并发送给死信交换机(Dead Letter Exchange)进行进一步处理。

通过设置 expiration 属性,可以实现消息的自动过期和延迟处理。这对于处理具有时间敏感性的消息非常有用,例如在一定时间内未被消费的消息可以被认为是过期的,从而进行相应的处理。

需要注意的是,expiration 属性的值是以毫秒为单位的时间间隔,指示消息在队列中保留的时长。如果 expiration 属性设置为 0 或负数,则表示消息不会过期,会一直保留在队列中。

在 RabbitMQ 中,默认情况下,消息的 expiration 属性是未设置的(unset)。这意味着消息不会自动过期,除非你在发送消息时显式地设置了 expiration 属性。

如果你没有设置消息的 expiration 属性,消息将保留在队列中直到被消费或手动从队列中删除。

需要注意的是,RabbitMQ 中可以配置针对队列级别的消息过期策略,该策略可以在创建队列时指定。这将应用于所有发送到该队列的消息,除非单独设置了消息的 expiration 属性。如果设置了队列级别的消息过期策略,它将覆盖消息的个别 expiration 设置。但是,默认情况下,RabbitMQ 不会对消息应用任何过期策略,消息将保留在队列中直到被处理。

delivery-mode

delivery-mode属性是一个字节字段,向消息代理服务器表明在将消息投递给任何正在等待的消费者之前,是否希望先将它持久化到磁盘上。在RabbitMQ中,持久化消息意味着即使RabbitMQ服务器重新启动,消息也会保留在队列中直到被消费。delivery-mode属性有两个可能的值:1表示非持久化消息,2表示持久化消息。

需要注意的是,默认情况下,RabbitMQ 将消息视为非持久性消息,即 delivery-mode 属性为 1。这意味着,如果没有显式地设置消息的 delivery-mode 属性,消息将被标记为非持久性消息。

app-id和user-id

在 RabbitMQ 中,消息可以包含两个与身份相关的属性:app-id 和 user-id。

app-id 属性用于标识发送消息的应用程序的标识符。它可以是应用程序的名称、ID 或其他标识符。app-id 属性可以帮助消费者识别消息来自哪个应用程序,并根据需要进行处理或路由。

user-id 属性用于标识发送消息的用户的标识符。它可以是用户的名称、ID 或其他标识符。user-id 属性用于在多用户环境中跟踪消息的来源,并可能用于进行权限验证或其他身份验证操作。

这些属性通常由生产者在发送消息时设置,以提供有关消息来源和身份的信息。消费者在接收到消息时可以读取这些属性,以便根据需要进行相应的处理。

消费者在接收到消息时可以通过读取消息的 app-id 和 user-id 属性来识别消息的来源和用户,然后根据需要进行相应的处理。这对于应用程序的日志记录、审计跟踪、权限验证等场景非常有用。

headers消息头自定义属性

headers属性是一个键/值对表,允许用户自定义任意的键和值。键可以是ASCII或Unicode字符串,最大长度为255个字符。而值可以是任何有效的AMQP值类型。

与其他属性不同,headers属性允许你添加任何你想要添加的数据到消息头表中。它还具有另一个独特的功能:RabbitMQ可以根据headers表中填充的值路由消息,而不需要依赖于路由键。

priority优先级属性

在 RabbitMQ 中,消息可以具有一个名为 priority 的属性,用于指定消息的优先级。priority 属性是一个整数值,范围从 0 到 9,其中 0 表示最低优先级,9 表示最高优先级。

通过设置消息的 priority 属性,可以使具有较高优先级的消息在消息队列中被优先处理。RabbitMQ 使用优先级来决定消息的处理顺序。在相同的队列中,具有更高优先级的消息将优先于具有较低优先级的消息被消费。

需要注意的是,RabbitMQ 默认情况下是不支持消息优先级的,除非你在队列的定义中明确启用了消息优先级。在创建队列时,可以通过设置 x-max-priority 参数来启用队列的消息优先级支持。

消费者在接收消息时可以读取消息的 priority 属性,并根据消息的优先级进行相应的处理。具有更高优先级的消息将优先于具有较低优先级的消息被消费。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BiFormer实战:使用BiFormer实现图像分类任务(一)

文章目录 摘要安装包安装timm安装 grad-cam 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文翻译:https://wanghao.blog.csdn.net/article/details/130186102 官方源码:https://github.com/rayleizhu/BiFormer BiFormer是今年提出…

java idea常用的快捷方式

文章目录 java idea常用的快捷方式快速复制选多行改变代码格式化 快速代码编辑psvmsout5.for java idea常用的快捷方式 快速复制 c t r l d \color{red}{ctrld} ctrld 选多行改变 A l t 鼠标 \color{red}{Alt鼠标} Alt鼠标 代码格式化 C t r l A l t l \color{red}{Ctrl…

Web的基本漏洞--代码执行漏洞

目录 一、代码执行漏洞的介绍 1.代码执行漏洞的原理 2.常用含有的代码执行漏洞的函数 3.代码执行漏洞的危害 4.代码执行漏洞的防范措施 一、代码执行漏洞的介绍 1.代码执行漏洞的原理 web应用程序是指程序员在代码中使用了一些执行函数例如php的eval,assert等…

全球冰川均衡调整(GIA)数据下载链接汇总

在处理GRACE数据时,由于GRACE监测的信号包含地表的质量迁移信号和固体地球物理信号,因此研究地表的质量迁移时需要扣除固体地球的信号,目前最主要的时冰川均衡调整(冰后回弹)的信号。具体的关于冰川均衡调整的信息可参…

Unity——在C#中调用C++动态链接库(DLL)

一、创建C动态链接库(DLL) 1、新建C空项目 打开VS,新建一个C空项目,自命名项目名称与位置。 2、配置项目属性为动态链接库 右键项目,点击属性,打开项目属性页,将常规中的配置类型改为动态库&…

无需租云服务器,Linux本地搭建web服务,并内网穿透发布公网访问(1)

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 转载自cpolar文章:Linux CentOS本地搭建…

HTB soccer

title: HTB_soccer description: HTB靶机 难度:easy date: 2023-05-31 categories: [渗透,靶机] HTB soccer 信息收集 ┌──(kali㉿kali)-[~] └─$ sudo nmap --min-rate 10000 -p- 10.10.11.194 [sudo] kali 的密码: Starting Nmap 7.93 ( https:/…

路径规划算法:基于水循环优化的路径规划算法- 附代码

路径规划算法:基于水循环优化的路径规划算法- 附代码 文章目录 路径规划算法:基于水循环优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法…

【数据分享】1929-2022年全球站点的逐年最高气温(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据! 之前我们分享过1929-2022年全球气象站…

工业智能终端配合MES系统真的可以提高生产效率吗?

工业智能终端可以实现数据分析和预测,通过对生产数据的分析和预测,可以更好地把握生产趋势和变化,及时调整生产计划和资源配置,提高生产效率和降低成本。 工业显示交互终端:解决MES系统软硬结合的难题,集显…

交叉编译成LoongArch(Makefile,CMake,AutoTool,Qt等方式)

在嵌入板卡中由于资源有限常常使用像busybox这样的轻量文件系统。由于这类轻量文件系统没有编译系统在里面,所以如果需要软件在板卡上运行,那么交叉编译是必不可少的。 如果对交叉编译(cross compile)这个概念不太清楚的话,可以参考以下的一…

加盐算法:手撕+Spring Security、提高密码安全性的必杀技

目录 一、概念和理解 (一)MD5加密 (二)加密解密过程 (三)加盐 1.什么是盐值? 2.如何加盐? 二、手写加盐算法 (一)密码工具类 (二)项目改动 注册 …

Spring Boot如何实现自定义Spring Boot启动器

Spring Boot如何实现自定义Spring Boot启动器 在Spring Boot中,启动器(Starter)是一组依赖项的集合,它们一起提供了某个特定的功能。使用Spring Boot启动器可以让我们更加方便地集成第三方库和框架,并且可以避免版本冲…

2023年京东618预售数据重磅出炉!(大家电篇:预售额550亿)

2023年5月23日至5月31日,京东618预售期正式落幕。今年的预售,不少行业及品牌首战告捷,拿下了不错的成绩。 数据统计时间:5月23日至5月30日 平台:京东 今晚,鲸参谋率先来盘点一下大家电行业在23日至30日预售…

知名大厂的UI组件库有哪些?

以下是 5 款优秀的 UI 设计组件库的推荐,这些组件库都可以免费获取,帮助你解答疑惑,提供设计参考,并提高工作效率 1、MUI(Material-UI) 包含 60 类别的 UI 设计组件,可在即时设计资源广场一…

开源!AREX接口自动化回归测试的全过程

AREX是一款开源的基于真实请求与数据的自动化回归测试平台(项目地址:https://github.com/arextest),利用JavaAgent技术与比对技术,通过流量录制回放能力实现快速有效的回归测试。同时提供了接口测试、接口比对测试等丰…

Sentinel 介绍及整合OPenFeign及GateWay

Sentinel 介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景: Sentinel 承接了阿里巴巴近…

IDEA 插件上新! 生成接口文档就是这么快!

当有接口对接需求的时候,开发终于不用再担心 API 文档难写了,也不用再一个个接口文档重新写!安装这个 IDEA 插件,可以一步将文档导入到 Postcat。 这款插件操作简单,容易上手,能够让开发者省去API文档编写的…

STM32G0x0系列-软件定时器解决HAL_Delay问题

目录 HAL_Delay函数源码 软件定时器 创建工程试验 1.将对应文件移动到项目位置 2.添加现有文件放到工程中 3.重定向printf 3.验证自己的软件定时器 4.查看现象 HAL_Delay函数使用了中断机制来实现延时功能,当在中断函数中调用HAL_Delay函数需要考虑中断优先…

《操作系统》by李治军 | 实验5.pre - copy_process 代码详解

目录 【前言】 代码分析 1. 申请子进程 PCB 空间 2. 找到子进程的内核栈 3. 父子进程共用同一内存、堆栈和数据代码块 4. 相关寄存器入栈 5. switch_to 返回位置 6. 响应 switch_to 的弹栈工作 7. 更新子进程 PCB 8. 子进程切换流程 【前言】 在李治军老师的《操作系…