RabbitMQ 发送到 dql 时抛出异常(最大 frame_size)
Posted
技术标签:
【中文标题】RabbitMQ 发送到 dql 时抛出异常(最大 frame_size)【英文标题】:RabbitMQ throw exception when send to dql (max frame_size) 【发布时间】:2022-01-02 08:05:14 【问题描述】:当我从队列中获取消息并且如果抛出异常,我想再次获取消息。 所以,我用 dql 队列创建了我的消费者:
spring:
cloud:
stream:
bindings:
to-send-output:
destination: to-send-event
producer:
required-groups:
- to-send-event-group
to-send-input:
destination: to-send-event
group: to-send-event-group
consumer:
max-attempts: 1
requeueRejected: true
rabbit:
bindings:
#forever retry
to-send-input:
consumer:
autoBindDlq: true
dlqTtl: 5000
dlqDeadLetterExchange:
maxConcurrency: 300
frameMaxHeadroom: 25000 #added this as in documentation
我按照documentation 中的说明添加了属性frameMaxHeadroom: 25000
,但它仍然无法正常工作。
我的springCloudVersion="Hoxton.RELEASE"
。
我的依赖:
dependencies
...
implementation "org.springframework.cloud:spring-cloud-starter-stream-rabbit"
...
在github 的存储库中,我在属性文件中看到frameMaxHeadroom
属性。
UPD:我看到code 将堆栈跟踪减少了我设置的值(来自变量frameMaxHeadroom
)。我希望我不会减少堆栈跟踪,而是增加消费者标头的值,如文档中所述。为什么它在我等待时不起作用?
【问题讨论】:
属性确实存在github.com/spring-cloud/spring-cloud-stream-binder-rabbit/blob/… - 也许25000还不够?默认值仅少 5000。 @GaryRussell 当我发送消息时,我停在AMQCommand.class
并在第 109 行看到 frameMax=131072
(它不是文档中的 20000)
【参考方案1】:
frameMax
在 amqp 客户端和服务器之间协商;所有标题必须适合一帧。您可以通过代理配置来增加它。
堆栈跟踪可能很大,很容易超过单独的frameMax
;为了给其他标头留出空间,框架会为其他标头留出至少 20,000 个字节(默认情况下),必要时通过截断堆栈跟踪标头。
如果您超出了frameMax
,则必须有其他大标题 - 您需要增加空间以允许这些标题,因此堆栈跟踪被进一步截断。
【讨论】:
所以,我可以减少标题x-exception-stacktrace
。而且我无法增加所有其他标题的空间。这是真的吗?
frame_max 由服务器决定 - 默认情况下客户端在协商时发送 0 - 这意味着协商的大小将是服务器上配置的最大大小。根据这个blog.rabbitmq.com/posts/2012/11/…(向下滚动到frame_max
)默认为128kb,但可以在服务器上增加。
我怎样才能增加它?
我不知道 - 我在这里看不到 rabbitmq.com/configure.html#config-items,但它确实显示了 These variables are the most common. The list is not complete, as some settings are quite obscure.
- 我建议你在他们的 rabbitmq-users
Google 群组中询问 RabbitMQ 人员。跨度>
以上是关于RabbitMQ 发送到 dql 时抛出异常(最大 frame_size)的主要内容,如果未能解决你的问题,请参考以下文章
C# HttpClient.SendAsync 在测试某些 URL 时抛出“发送请求时发生错误”异常
当有任何 SOAP 请求的挂起的实体框架数据库迁移时抛出 SOAP 异常