RabbitMQ 消息是否有大小限制 header?

Is there a size limit on a RabbitMQ message header?

我计划在 RabbitMQ 消息中存储堆栈跟踪 header。消息 header 有大小限制吗?

由于您使用的是 RabbitMQ,我猜您使用的是标准协议,即 AMQP。 在那种情况下,您不应该在 header 中添加类似堆栈跟踪的内容,因为根据 AMQP specification 3.2.1,header 用于 standard delivery details:

The header section carries standard delivery details about the transfer of a message through the AMQP network. If the header section is omitted the receiver MUST assume the appropriate default values (or the meaning implied by no value being set) for the fields within the header unless other target or node specific defaults have otherwise been set.

根据我的发现,规格没有提及任何关于特定大小的内容,因此如果您愿意,可以在其中填充一个堆栈跟踪:)

RabbitMQ 默认使用 AMQP 版本 0.9.1。根据第 31 页的 AMQP protocol specification,一个 field-table 可以包含 40 亿个条目:

long-uint = 4*OCTET

field-table = long-uint *field-value-pair

一个 long-string 条目的长度最多可达 40 亿个八位字节:

long-string = long-uint *OCTET ; length + content

AMQP 消息分为 3 个部分,header,属性,消息。在属性部分,您可以输入 application-specific 信息。因此属性可能包含您的堆栈跟踪。

顺便说一下,headers 和属性必须尽可能小,因为有 performance penalty

到目前为止的答案似乎表明在 header 中填充堆栈跟踪没有问题。然而,我实际上尝试了这个,并且运行进入了这个问题:

Caused by: java.lang.IllegalArgumentException: Content headers exceeded max frame size: 163475 > 131072
    at com.rabbitmq.client.impl.AMQCommand.transmit(AMQCommand.java:115) ~[amqp-client-5.7.3.jar:5.7.3]

在我看来,某处强制执行了 128kB 的限制(默认情况下)。

The answers so far seem to indicate that it would be no problem to cram a stacktrace in a header.

正如 John 之前在他的回答中暗示的那样,几年前进行了一些更改,当 header 大小超过 frame_max 时会导致抛出 IllegalArgumentException(默认情况下,这确实是 128kB)。

(The source code I'm referring to can be found here!)

作为一个(有趣的)旁注,这样做是为了防止一个问题,即具有超过最大帧大小的单个巨大 header 的消息会导致客户端创建和传输巨大 header 帧到服务器,结果,服务器关闭连接并出现 frame_too_large 错误,这会中断所有打开的通道!

为了在 header 中包含堆栈跟踪,您 可以 增加 header 大小,或将其设置为 0 'unlimited',但您应该知道,在大多数情况下这并不是特别可取的(较大的值可能会提高吞吐量,而较小的值可能会改善延迟)。

当为 nodejs 使用 amqplib 客户端时,headers 有 4k 字节的限制。超过此值时,您将收到异常“帧大小超过帧最大值”并且消费者死亡。

https://github.com/squaremo/amqp.node/issues/462