跳至主要内容
版本: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 1.0 发布,或者
  • 从流中消费,
则会进行从 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过期时间布尔值毫秒转换为字符串值过期时间
布尔值毫秒转换为字符串值消息 IDUTF-8布尔值> 256 字节头部,键:x-message-id
布尔值毫秒转换为字符串值长字符串布尔值毫秒转换为字符串值过期时间UUID(16 字节二进制)
布尔值毫秒转换为字符串值转换为文本,例如“urn:uuid:550e8400-e29b-41d4-a716-446655440000布尔值毫秒转换为字符串值过期时间无符号长整数
布尔值毫秒转换为字符串值转换为文本布尔值> 256 字节转换为文本
布尔值二进制转换为文本过期时间布尔值二进制过期时间
布尔值用户 ID
布尔值地址消息 ID
布尔值主题过期时间布尔值主题过期时间
布尔值回复地址消息 ID过期时间布尔值回复地址过期时间
布尔值回复地址消息 IDUTF-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-idRabbitMQ 不支持 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.keyx-* 头部符号
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-idAMQP 0.9.1 属性 reply_to 指的是队列名称,而不是主题名称
可变头部相关数据转换为文本过期时间布尔值回复地址过期时间
布尔值相关 ID头部,键:x-message-id
可变头部用户属性UTF-8 字符串对名称为 shortstr布尔值头部头部,键:x-message-idRabbitMQ 不能将 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 类型
注释头部持久化固定头部QoSdurable=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
基本属性内容编码过期时间
基本属性属性八位字节组固定头部QoSdelivery-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-idKey=x-correlation-id可变头部相关数据转换为文本
basic.properties头部*不是数组、表用户属性消息 ID简单值转换为其字符串表示形式
基本属性头部
有效负载转换为文本有效负载
© 2024 RabbitMQ. All rights reserved.