首页 > 解决方案 > RabbitMQ frame_too_large 异常

问题描述

我将消息发布到队列中,预计消费者无法解析消息并将其放入 DLQ,但消息卡在 Unacked 状态。我能看到的例外是

错误:#method(reply-code=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 是不是更好?或者什么可能是更好的方法?

标签: rabbitmqspring-cloud-streamspring-rabbit

解决方案


这个问题

我怀疑的第一件事是消息的属性或标头(而不是内容)编码为大于 4k,因为 AMQP 没有规定对消息内容以外的任何内容进行分段。这在您的应用程序中可能吗?

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

客户端要求 0(无限制),但代理默认限制为 131072。

文档在这里

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

默认值:131072

我们可以考虑截断堆栈跟踪,我在这里打开了一个问题


推荐阅读