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)的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 函数在部署时抛出异常

C# HttpClient.SendAsync 在测试某些 URL 时抛出“发送请求时发生错误”异常

使用 POST 方法上传 JSON 对象时抛出错误请求异常

当有任何 SOAP 请求的挂起的实体框架数据库迁移时抛出 SOAP 异常

SqlDataReader 在尝试将数据加载到 DataGrid WPF 时抛出异常

UI 元素添加到控件集合时抛出异常