RabbitMQ frame_too_large异常

时间:2018-06-12 20:34:05

标签: rabbitmq spring-cloud-stream spring-rabbitmq

我在队列中发布了一条消息,消费者无法解析消息并将其放入DLQ,但消息仍处于Unacked状态。 我能看到的例外是

  

错误:#method(回复代码= 501,   reply-text = FRAME_ERROR - 类型2,所有八位字节=<<>>:   {frame_too_large,206219,131064},class-id = 0,method-id = 0)

消息实际上小于默认帧大小,但在尝试将其丢弃到DLQ时会突然变大。 RabbitMQ配置为默认frame_max = 131072。如果它增加到大于206219工作正常并成功进入DLQ。 不确定它是否正在计算消息的大小,包括抛出的异常以及以frame_too_large错误结束的其他元数据。

增加frame_max更好吗?或者什么是更好的方法?

1 个答案:

答案 0 :(得分:2)

来自this issue

  

我首先要怀疑的是,消息的属性或标头(而不是内容)编码为4k以上,因为AMQP没有提供对消息内容以外的任何内容进行分段的规定。在您的应用程序中有可能吗?

因此,由于堆栈跟踪非常大;您可以减小堆栈跟踪的大小(通过在代码中捕获异常并抛出具有足够信息的新异常-但不要添加原因),也可以增加frame_max。

客户要求0(无限制),但默认情况下,经纪人的限制为131072。

Documentation here

  

与客户端协商的最大允许帧大小(以字节为单位)。设置为0表示“无限制”,但会在某些QPid客户端中触发错误。设置较大的值可以提高吞吐量。设置较小的值可能会改善延迟。

     

默认值:131072

我们可以考虑截断堆栈跟踪,我打开了issue here