我计划在RabbitMQ消息头中存储堆栈跟踪。邮件标题是否有大小限制?
答案 0 :(得分:5)
RabbitMQ默认使用AMQP版本0.9.1。根据第31页的AMQP protocol specification,field-table
可以包含4亿条条目:
long-uint = 4 * OCTET
field-table = long-uint * field-value-pair
long-string
条目的长度最多可达40亿个字节:
long-string = long-uint * OCTET;长度+内容
AMQP消息分为3个部分,标题,属性和消息。在属性部分中,您可以放置特定于应用程序的信息。因此属性可能包含您的堆栈跟踪。
顺便说一句,标题和属性必须保持尽可能小,因为performance penalty
答案 1 :(得分:1)
由于您正在使用RabbitMQ,我猜测您正在使用标准协议,即AMQP。
在这种情况下,您不应在标题中添加类似堆栈跟踪的内容,因为根据AMQP specification 3.2.1标题用于standard delivery details
:
标题部分包含有关通过AMQP网络传输消息的标准交付详细信息。如果省略了标题部分,则接收方必须为标题内的字段采用适当的默认值(或者没有设置值所暗示的含义),除非另外设置了其他目标或节点特定的默认值。
根据我的发现,规格并未提及任何有关特定尺寸的内容,因此如果您愿意,可以在那里填写堆栈跟踪:)
答案 2 :(得分:0)
到目前为止,似乎所有的答案都表明在头文件中填充堆栈跟踪信息没有问题。但是,我实际上尝试了此问题,并遇到了这个问题:
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的限制(默认情况下)。
答案 3 :(得分:0)
到目前为止的答案似乎表明,将标头中的堆栈跟踪塞满是没有问题的。
正如John在先前的回答中所暗示的那样,在进行了几年的更改后,当标头大小超过IllegalArgumentException
时,将引发frame_max
(默认情况下确实为128kB) )。
(The source code I'm referring to can be found here!)
作为一个(有趣的)旁注,这样做是为了避免出现这样的问题,即单个超大标头超过最大帧大小的消息将导致客户端创建并将超大标头帧传输到服务器,从而,服务器以frame_too_large
错误关闭连接,从而中断了所有打开的通道!
为了在标头中包含堆栈跟踪,您可以可以增加标头的大小,或者将其设置为0
以表示“无限制”,但是您应该意识到这不是“在大多数情况下特别建议(较大的值可能会提高吞吐量,而较小的值可能会提高延迟)。