rabbitmq - 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 是不是更好?或者什么可能是更好的方法?
解决方案
从这个问题。
我怀疑的第一件事是消息的属性或标头(而不是内容)编码为大于 4k,因为 AMQP 没有规定对消息内容以外的任何内容进行分段。这在您的应用程序中可能吗?
因此,由于堆栈跟踪如此之大;您可以减少堆栈跟踪大小(通过在代码中捕获异常并抛出一个具有足够信息的新异常 - 但不要添加原因),或者您可以增加 frame_max.
客户端要求 0(无限制),但代理默认限制为 131072。
与客户端协商的最大允许帧大小(以字节为单位)。设置为 0 表示“无限制”,但会在某些 QPid 客户端中触发错误。设置较大的值可能会提高吞吐量;设置较小的值可能会改善延迟。
默认值:131072
我们可以考虑截断堆栈跟踪,我在这里打开了一个问题。
推荐阅读
- javascript - WebGL INVALID OPERATION 缓冲区大小不足
- javascript - 如何在 NextJs 中的页面转换之间使用相同的 Apollo 缓存?
- git - gitlab CI 管道构建作业没有从 git 的本地 m2repo 访问依赖项
- powershell - Powershell 在输出时更改属性名称
- python - 使用 Python 优化从 Postgres 到 Oracle 数据库的迁移
- python - Flask-sqlalchemy 相当于查询一个数据库的多个 WHERE 条件
- python - python中的k_mean结果图
- azure - 所有订阅的 Azure 区域列表是否相同?
- sql - 如何在 Oracle 中删除多个函数
- javascript - 改进这种定时攻击的方法(代码挑战)