协议间属性转换 | RabbitMQ 消息队列
版本:4.0
RabbitMQ 是一个支持多种协议的代理,支持
消息可以很容易地由一种协议发布,并由其他协议消费。这需要在不同协议格式之间进行数据格式转换。在 RabbitMQ 3.13 之前,所有消息在发布到 RabbitMQ 时都转换为基于 AMQP 0.9.1 协议的内部格式。这种方法通常会导致不必要的转换和/或数据保真度问题。
在当前的 RabbitMQ 版本中,AMQP、AMQP 0.9.1 和 MQTT 协议的方法发生了变化,消息将始终以其原始格式存储,并且仅在由与原始协议不同的协议消费时才进行转换。这样一来,当原始协议和消费协议相同时,就不会丢失任何协议特定的信息。
此规则的唯一例外是 流:无论使用哪种协议发布,流都会将其消息内部存储为 AMQP 编码的数据。因此,例如,当使用 AMQP 0.9.1 发布时,会发生转换为 AMQP 的操作。
所有转换都已重新编写并形式化。本文档旨在捕获已实现的转换规则,以便应用程序开发人员可以参考本文档,了解其消息在多协议消息传递应用程序中将如何转换。
shortstr
:(条件)小于 256 字节的字符串,并且仅包含有效的 UTF-8 编码数据,不包含 NUL
(二进制零八位字节组)字符。
*
:读作“任何”(字段/类型等)。
条件可以理解为按其写入的顺序进行评估。例如,类型为 utf8
且超过 255 字节的 AMQP message_id
将首先不满足 shortstr
条件,然后继续执行下一行。如果没有匹配的行,则数据将不会转换(因此消费应用程序也无法使用)。
AMQP 1.0 -> AMQP 0.9.1
如果消息使用 AMQP 0.9.1 消费,并且消息
则会进行从 AMQP 到 AMQP 0.9.1 的转换。 | AMQP 部分 | AMQP 字段 | AMQP 类型 | 条件 | AMQP 0.9.1 部分 | AMQP 0.9.1 字段 | AMQP 0.9.1 类型 |
---|
注释 | 头部 | 持久化 | | 布尔值 | 属性 | 投递模式 | 无符号字节 |
注释 | 2 = 持久化,1 = 短暂 | 投递模式 | | 布尔值 | 2 = 持久化,1 = 短暂 | 投递模式 | |
注释 | 优先级 | 生存时间 | | 布尔值 | 毫秒(无符号整数) | 过期时间 | 短字符串 |
布尔值 | 毫秒转换为字符串值 | 消息 ID | 过期时间 | 布尔值 | 毫秒转换为字符串值 | 过期时间 | |
布尔值 | 毫秒转换为字符串值 | 消息 ID | UTF-8 | 布尔值 | > 256 字节 | 头部,键:x-message-id | |
布尔值 | 毫秒转换为字符串值 | 长字符串 | | 布尔值 | 毫秒转换为字符串值 | 过期时间 | UUID(16 字节二进制) |
布尔值 | 毫秒转换为字符串值 | 转换为文本,例如“urn:uuid:550e8400-e29b-41d4-a716-446655440000” | | 布尔值 | 毫秒转换为字符串值 | 过期时间 | 无符号长整数 |
布尔值 | 毫秒转换为字符串值 | 转换为文本 | | 布尔值 | > 256 字节 | 转换为文本 | |
布尔值 | 二进制 | 转换为文本 | 过期时间 | 布尔值 | 二进制 | 过期时间 | |
布尔值 | 用户 ID | 至 | | | | | |
布尔值 | 地址 | 消息 ID | | | | | |
布尔值 | 主题 | 至 | 过期时间 | 布尔值 | 主题 | 过期时间 | |
布尔值 | 回复地址 | 消息 ID | 过期时间 | 布尔值 | 回复地址 | 过期时间 | |
布尔值 | 回复地址 | 消息 ID | UTF-8 | 布尔值 | 相关 ID | 头部,键:x-message-id | |
布尔值 | 回复地址 | 长字符串 | | 布尔值 | 回复地址 | 过期时间 | 头部,键:x-correlation-id |
布尔值 | 回复地址 | 转换为文本,例如“urn:uuid:550e8400-e29b-41d4-a716-446655440000” | | 布尔值 | 回复地址 | 过期时间 | 转换为数字的文本表示形式 |
布尔值 | 回复地址 | 转换为文本 | | 布尔值 | 相关 ID | 转换为文本 | |
布尔值 | 内容类型 | 符号 | | 布尔值 | 内容类型 | 过期时间 | |
布尔值 | 内容编码 | 符号 | | 布尔值 | 内容编码 | 过期时间 | |
布尔值 | 绝对过期时间 | 时间戳 | | | | | |
布尔值 | 创建时间 | 时间戳 | | 布尔值 | 时间戳 | 时间戳 | 转换为秒 |
布尔值 | 组 ID | 消息 ID | 过期时间 | 布尔值 | 应用 ID | 过期时间 | |
布尔值 | 组序列号 | 序列号 | | | | | |
布尔值 | 回复组 ID | 消息 ID | | | | | |
应用程序属性 | * | *(参见类型转换) | 键:shortstr | 布尔值 | 头部 | * | |
消息注释 | *(符号 - x-cc*) | | 键:x-cc | 布尔值 | 头部,键:“CC” | 头部,键:x-message-id | |
消息注释 | *(符号 - x-*) | *(参见类型转换) | 键:shortstr & x-* | 布尔值 | 头部 | * | 通常这意味着 x- 头部 |
数据 | | 数据 | 单个数据部分 | 有效负载 | | 转换为文本 | 从数据部分提取的纯二进制数据 |
数据(多个) | * | * | 多个数据部分 | 有效负载 | | AMQP 1.0 编码的二进制数据 | properties.type 将设置为“amqp-1.0” |
amqp.value | * | * | | 有效负载 | | AMQP 1.0 编码的二进制数据 | properties.type 将设置为“amqp-1.0” |
amqp.sequence | * | * | | 有效负载 | | AMQP 1.0 编码的二进制数据 | properties.type 将设置为“amqp-1.0” |
类型转换
AMQP 1.0 类型 | AMQP 类型 | AMQP 0.9.1 类型 | AMQP 0.9.1 类型 |
---|
UTF-8(字符串) | | 头部,键:x-message-id | RabbitMQ 不支持 shortstr 头部值,因此所有 utf8 输入都转换为 longstr,除非它是基本属性中的字段 |
转换为文本 | | 转换为文本 | |
长整数 | | 长整数 | |
转换为文本,例如“urn:uuid:550e8400-e29b-41d4-a716-446655440000” | | 长整数 | 溢出风险 |
投递模式 | | 无符号字节 | |
短整数 | | 短整数 | |
无符号短整数 | | 无符号短整数 | |
无符号整数 | | 无符号整数 | |
整数 | | 有符号整数 | |
双精度浮点数 | | 双精度浮点数 | |
单精度浮点数 | | 单精度浮点数 | |
持久化 | | 布尔值 | |
时间戳 | | 时间戳(秒) | 值除以 1000 |
字节 | | 字节 | |
空 | | 无效 | |
列表 | | 数组 | |
映射 | | 表 | |
符号 | | 头部,键:x-message-id | |
AMQP 0.9.1 -> AMQP 1.0
条件 | AMQP 0.9.1 字段 | AMQP 0.9.1 类型 | AMQP 类型 | AMQP 1.0 部分 | AMQP 1.0 字段 | AMQP 1.0 类型 | AMQP 0.9.1 类型 |
---|
基本属性 | 毫秒转换为字符串值 | 过期时间 | 有效的 urn uuid | 布尔值 | 毫秒转换为字符串值 | uuid | |
基本属性 | 毫秒转换为字符串值 | 过期时间 | | 布尔值 | 毫秒转换为字符串值 | 消息 ID | |
基本属性 | 回复地址 | 过期时间 | 有效的 urn uuid | 布尔值 | 回复地址 | uuid | |
基本属性 | 回复地址 | 过期时间 | | 布尔值 | 回复地址 | 消息 ID | |
基本属性 | 二进制 | 过期时间 | | 布尔值 | 二进制 | 转换为文本 | |
基本属性 | 毫秒(无符号整数) | 过期时间 | 如果可转换为数值类型 | 注释 | 优先级 | 无符号整数 | |
基本属性 | 类型 | 过期时间 | | 消息注释 | x-basic-type | 消息 ID | |
基本属性 | 主题 | 过期时间 | | 布尔值 | 主题 | 消息 ID | |
基本属性 | 应用 ID | 过期时间 | | 布尔值 | 组 ID | 消息 ID | |
基本属性 | 时间戳 | 时间戳(秒) | | 布尔值 | 创建时间 | 时间戳 | 转换为毫秒 |
基本属性 | 内容类型 | 过期时间 | | 布尔值 | 内容类型 | 符号 | |
基本属性 | 内容编码 | 过期时间 | | 布尔值 | 内容编码 | 符号 | |
基本属性 | 投递模式 | 八位字节组 | | 注释 | 头部 | 持久化 | 以前在 x-basic-delivery-mode 中 |
基本属性 | 2 = 持久化,1 = 短暂 | 八位字节组 | | 注释 | 2 = 持久化,1 = 短暂 | 投递模式 | 以前在 x-basic-priority 中 |
basic.properties | 头部 | | 键=x-amqp-1.0-properties | 布尔值 | - | - | 旧版 1.0 插件头部 |
basic.properties | 头部 | | 键=x-amqp-1.0-application-properties | 应用程序属性 | - | - | 旧版 1.0 插件头部 |
basic.properties | 头部 | | 键=x-amqp-1.0-message-annotations | 消息注释 | - | - | 旧版 1.0 插件头部 |
basic.properties | 头部 | | 键=x-reply-to-topic | 布尔值 | 主题 | 消息 ID | "/topic/" RK |
基本属性 | 头部 | * | 键以“x-”开头 | 消息注释 | 键 | * | 参见类型转换规则 |
基本属性 | 头部 | 表 | 值不是数组或表 | 应用程序属性 | 键 | * | 参见类型转换规则 |
基本属性 | 头部 | 表 | 值是数组或表 | - | - | - | 不转换 |
有效负载 | - | 转换为文本 | | 数据 | - | 数据 | |
类型转换
AMQP 0.9.1 类型 | AMQP 类型 | AMQP 1.0 类型 | AMQP 0.9.1 类型 |
---|
头部,键:x-message-id | 过期时间 | 消息 ID | 性能/精度权衡 |
头部,键:x-message-id | | 转换为文本 | |
长整数 | | 长整数 | |
投递模式 | | 投递模式 | |
短整数 | | 短整数 | |
无符号短整数 | | 无符号短整数 | |
无符号整数 | | 无符号整数 | |
整数 | | 整数 | |
双精度浮点数 | | 双精度浮点数 | |
单精度浮点数 | | 单精度浮点数 | |
布尔值 | | 持久化 | |
转换为文本 | | 转换为文本 | |
时间戳 | | 时间戳 | 从秒转换为毫秒 |
字节 | | 字节 | |
无效 | | 空 | |
数组 | | 列表 | |
表 | | 映射 | |
table.key | x-* 头部 | 符号 | |
table.key | | 消息 ID | |
table.value | | * | 根据此表进行转换 |
MQTT 5.0 -> AMQP 1.0
MQTT 5.0 部分 | MQTT 字段 | MQTT 5.0 类型 | AMQP 类型 | AMQP 1.0 部分 | AMQP 1.0 字段 | AMQP 1.0 类型 | AMQP 0.9.1 类型 |
---|
固定头部 | 重复 | 位 | | | | | 将设置设置为 header first-acquirer 没有意义,因为 DUP 标志仅适用于客户端到服务器(从服务器到客户端的消费由队列发送的 Redelivered 标志确定) |
固定头部 | QoS | 位 | | 注释 | 头部 | 持久化 | 如果 QoS > 0,则持久化为真 |
固定头部 | 保留 | 位 | | | | | |
可变头部 | 有效负载格式指示器 | 位 | | | | | 参见“有效负载”行,条件为“设置有效负载格式指示器” |
可变头部 | 消息过期间隔 | 无符号整数 | | 注释 | 优先级 | 毫秒 | 秒转换为毫秒 |
可变头部 | 主题别名 | 无符号短整数 | | | | | |
可变头部 | 回复主题 | 消息 ID | | 布尔值 | 主题 | 消息 ID | 将 MQTT 主题转换为 AMQP 路由键 (RK)。将回复地址设置为“/exchange/” X “/” RK。 |
可变头部 | 相关数据 | 转换为文本 | urn:uuid | 布尔值 | 回复地址 | uuid | |
可变头部 | 相关数据 | 转换为文本 | | 布尔值 | 回复地址 | 转换为文本 | |
可变头部 | 用户属性 | 消息 ID | 键以“x-”开头,键为 ASCII | 消息注释 | | 值:UTF-8 | 键的类型为符号 |
| | | 键不以“x-”开头 | 应用程序属性 | | 值:UTF-8 | 键的类型为 UTF-8 |
可变头部 | 订阅标识符 | 无符号整数 | | | | | |
可变头部 | 内容类型 | 消息 ID | 有效的 ASCII | 布尔值 | 内容类型 | 符号 | MQTT 内容类型为 UTF-8,而 AMQP 1.0 内容类型仅为 ASCII |
有效负载 | | | 未设置有效负载格式指示器 | 数据 | | 数据 | |
有效负载 | | | 设置有效负载格式指示器 | amqp.value | | 消息 ID | 如果设置了有效负载格式指示器,则将 MQTT 有效负载转换为字符串(即单个 AMQP 值部分),因为 AMQP 字符串为 UTF-8 编码 |
类型转换
MQTT 5.0 类型 | AMQP 类型 | AMQP 1.0 类型 | AMQP 0.9.1 类型 |
---|
位 | | 持久化 | 仅转换选定的标志 |
无符号短整数 | | 无符号短整数 | |
无符号整数 | | 无符号整数 | |
消息 ID | | 消息 ID | |
二进制数据 | 消息 ID | 消息 ID | |
二进制数据 | | 转换为文本 | |
UTF-8 字符串对 | | 映射 | 删除重复的键,但保持顺序 |
MQTT 5.0 -> AMQP 0.9.1
MQTT 5.0 部分 | MQTT 5.0 字段 | MQTT 5.0 类型 | AMQP 类型 | AMQP 0.9.1 部分 | AMQP 0.9.1 部分 | AMQP 0.9.1 字段 | AMQP 0.9.1 类型 |
---|
固定头部 | 重复 | 位 | | | | | 将设置设置为 basic.deliver 字段 redelivered 没有意义,因为 DUP 标志仅适用于客户端到服务器(从服务器到客户端的消费由队列发送的 Redelivered 标志确定) |
固定头部 | QoS | 位 | | 布尔值 | 属性 | | QoS 0 映射到 delivery_mode 1 QoS 1 映射到 delivery_mode 2 |
固定头部 | 保留 | 位 | | | | | |
可变头部 | 有效负载格式指示器 | 位 | | | | | AMQP 0.9.1 content_encoding 指的是 MIME 内容编码,其有效值列在 https://www.iana.org/assignments/http-parameters/http-parameters.xml 中。因此 AMQP 0.9.1 content_encoding 是不同的东西。它最好映射到 content_type 的 text/<subtype>; charset="utf-8 ,但 <subtype> 未定义。此外,MQTT 5.0 属性 Content Type 已经定义。 |
可变头部 | 消息过期间隔 | 无符号整数 | | 布尔值 | 毫秒(无符号整数) | 过期时间 | 秒转换为毫秒 |
可变头部 | 主题别名 | 无符号短整数 | | | | | |
可变头部 | 回复主题 | 消息 ID | | 布尔值 | 头部,键:x-reply-to-topic | 头部,键:x-message-id | AMQP 0.9.1 属性 reply_to 指的是队列名称,而不是主题名称 |
可变头部 | 相关数据 | 转换为文本 | 过期时间 | 布尔值 | 回复地址 | 过期时间 | |
| | | | 布尔值 | 相关 ID | 头部,键:x-message-id | |
可变头部 | 用户属性 | UTF-8 字符串对 | 名称为 shortstr | 布尔值 | 头部 | 头部,键:x-message-id | RabbitMQ 不能将 shortstr 作为例如头部值。 |
可变头部 | 订阅标识符 | 可变字节整数 | | | | | |
可变头部 | 内容类型 | 消息 ID | 过期时间 | 布尔值 | 内容类型 | 过期时间 | |
有效负载 | | | | 有效负载 | | | |
类型转换
MQTT 5.0 类型 | AMQP 类型 | AMQP 0.9.1 字段 | AMQP 0.9.1 类型 |
---|
位 | | 位 | |
无符号短整数 | | 无符号短整数 | |
无符号整数 | | 无符号整数 | |
消息 ID | < 256 字节且目标不是头部 | 过期时间 | RabbitMQ 不能将 shortstr 作为例如头部值。 |
消息 ID | >= 256 字节 | 头部,键:x-message-id | |
转换为文本 | < 256 字节的 UTF-8 编码数据 | 过期时间 | |
转换为文本 | 无效的 UTF-8 或 >= 256 字节 | 头部,键:x-message-id | |
UTF-8 对 | | 表 | “在 AMQP 0.9.1 字段表中,重复字段是非法的”。RabbitMQ 按键对字段进行排序。
|
AMQP 1.0 -> MQTT 5.0
AMQP 1.0 部分 | AMQP 1.0 字段 | AMQP 1.0 类型 | AMQP 类型 | MQTT 5.0 部分 | MQTT 5.0 字段 | MQTT 5.0 类型 | AMQP 0.9.1 类型 |
---|
注释 | 头部 | 持久化 | | 固定头部 | QoS | 位 | durable=true 映射到 QoS 1 durable=false 映射到 QoS 0 |
布尔值 | 毫秒转换为字符串值 | * | | | | | |
布尔值 | 二进制 | 转换为文本 | | | | | |
布尔值 | 用户 ID | 至 | | | | | |
布尔值 | 地址 | 消息 ID | | | | | |
布尔值 | 主题 | 至 | "/exchange/" X "/" RK 其中 X 匹配 mqtt.exchange | 可变头部 | 回复主题 | 消息 ID | 将 AMQP 主题转换为 MQTT 主题 |
布尔值 | 回复地址 | * | | 可变头部 | 相关数据 | 转换为文本 | 转换为二进制 |
布尔值 | 内容类型 | 符号 | | 可变头部 | 内容类型 | 消息 ID | |
布尔值 | 内容编码 | 符号 | | | | | |
布尔值 | 绝对过期时间 | 时间戳 | | | | | |
布尔值 | 创建时间 | 时间戳 | | | | | |
布尔值 | 组 ID | 消息 ID | | | | | |
布尔值 | 组序列号 | 序列号 | | | | | |
布尔值 | 回复组 ID | 消息 ID | | | | | |
应用程序属性 | * | * | 不是数组、列表、映射或二进制 | 用户属性 | | 消息 ID | 值转换为字符串表示形式 |
消息注释 | * | * | 仅 x- headers,不包括具有数组、列表、映射或二进制值的那些 | 用户属性 | | 消息 ID | |
数据 | | 数据 | 一个或多个数据部分 | 有效负载 | | 转换为文本 | |
数据 | * | * | 单个 AMQP 二进制值部分 | 有效负载 | | 转换为文本 | |
数据 | | amqp.value(utf8) | 可转换为 UTF-8 的单个 AMQP 值部分 | 有效负载 | | 转换为文本 | Payload-Format-Indicator 设置为 1,以便 MQTT 5.0 客户端可以解析消息的文本表示形式,从而理解消息。 |
数据 | | * | 其他单个 AMQP 值部分或 amqp-sequence 部分 | 有效负载 | | 转换为文本 | 使用 AMQP 类型系统进行编码,并包含 Content Type message/vnd.rabbitmq.amqp 。此 Content Type 未注册。 |
AMQP 0.9.1 -> MQTT 5.0
条件 | AMQP 0.9.1 字段 | AMQP 0.9.1 类型 | AMQP 类型 | MQTT 5.0 部分 | MQTT 5.0 字段 | MQTT 5.0 类型 | AMQP 0.9.1 类型 |
---|
基本属性 | 毫秒转换为字符串值 | 过期时间 | | | | | |
基本属性 | 回复地址 | 过期时间 | | 可变头部 | 相关数据 | 转换为文本 | |
基本属性 | 二进制 | 过期时间 | | | | | |
基本属性 | 毫秒(无符号整数) | 过期时间 | | 可变头部 | 消息过期间隔 | 无符号整数 | 从毫秒转换为秒 |
基本属性 | 类型 | 过期时间 | | | | | |
基本属性 | 主题 | 过期时间 | | | | | |
基本属性 | 应用 ID | 过期时间 | | | | | |
基本属性 | 时间戳 | 时间戳(秒) | | | | | |
基本属性 | 内容类型 | 过期时间 | | 可变头部 | 内容类型 | 消息 ID | |
基本属性 | 内容编码 | 过期时间 | | | | | |
基本属性 | 属性 | 八位字节组 | | 固定头部 | QoS | 位 | delivery-mode 2 映射到 QoS 1 delivery-mode 1 映射到 QoS 0 |
基本属性 | 2 = 持久化,1 = 短暂 | 八位字节组 | | | | | |
basic.properties | 头部 | 头部,键:x-message-id | 键=x-reply-to-topic | 可变头部 | 回复主题 | 消息 ID | 将 AMQP 主题转换为 MQTT 主题 |
basic.properties | 头部 | 头部,键:x-message-id | Key=x-correlation-id | 可变头部 | 相关数据 | 转换为文本 | |
basic.properties | 头部 | * | 不是数组、表 | 用户属性 | | 消息 ID | 简单值转换为其字符串表示形式 |
基本属性 | 头部 | 表 | | | | | |
有效负载 | | 转换为文本 | | 有效负载 | | | |
© 2024 RabbitMQ. All rights reserved.