死信队列

用来保存处理失败或者过期的消息。

出现下面情况时,消息会被重发:

  1. 事务会话被回滚。
  2. 事务会话在提交之前关闭。
  3. 会话使用CLIENT_ACKNOWLEDGE模式,并且Session.recover()被调用。
  4. 自动应答失败。

当一个消息被重发超过最大重发次数(缺省为6次,消费者端可以修改)时,会给Broker发送一个"有毒标记“,这个消息被认为是有问题,这时Broker将这个消息发送到死信队列,以便后续处理。

可以通过设置PMQConnectionFactory和PMQConnection来定制想要的再次传送策略。配置RedeliveryPolicy属性,用来定义重传策略的具体细节。

属性 默认值 说明
collisionAvoidanceFactor 0.15 设置防止冲突范围的正负百分比,只有启用useCollisionAvoidance参数时才生效。也就是在延迟时间上再加一个时间波动范围。
maximumRedeliveries 6 最大重传次数,达到最大重连次数后抛出异常。为-1时不限制次数,为0时表示不进行重传。
maximumRedeliveryDelay -1 最大传送延迟,只在useExponentialBackOff为true时有效,假设首次重连间隔为10ms,倍数为2,那么第二次重连时间间隔为 20ms,第三次重连时间间隔为40ms,当重连时间间隔达到最大重连时间间隔时,以后每次重连时间间隔都为最大重连时间间隔。
initialRedeliveryDelay 1000L 初始重发延迟时间。
redeliveryDelay 1000L 重发延迟时间,当initialRedeliveryDelay=0时生效。
useCollisionAvoidance false 启用防止冲突功能,因为消息接收时是可以使用多线程并发处理的,应该是为了重发的安全性,避开所有并发线程都在同一个时间点进行消息接收处理。所有线程在同一个时间点处理时会发生什么问题呢?应该没有问题,只是为了平衡broker处理性能,不会有时很忙,有时很空闲。
useExponentialBackOff false 启用指数倍数递增的方式增加延迟时间。
backOffMultiplier 5 重连时间间隔递增倍数,只有值大于1和启用useExponentialBackOff参数时才生效。

缺省的死信队列是PMQ.DLQ,如果没有特别指定,死信都会被发送到这个队列。

缺省所有队列的死信消息都被发送到同一个缺省死信队列,不便于管理。可以通过individualDeadLetterStrategy或sharedDeadLetterStrategy策略来进行修改。如下:

<broker...>
  <destinationPolicy>
    <policyMap>
      <policyEntries>
        <!-- 设置所有队列,使用 '>' ,否则用队列名称 -->
        <policyEntry queue=">">
          <deadLetterStrategy>
           <!-- 
           queuePrefix:设置死信队列前缀
           useQueueForQueueMessages: 设置使用队列保存死信,
           还可以设置useQueueForTopicMessages,使用Topic来保存死信
           -->
            <individualDeadLetterStrategy queuePrefix="DLQ." 
                            useQueueForQueueMessages="true"/>
          </deadLetterStrategy>
        </policyEntry>
      </policyEntries>
    </policyMap>
  </destinationPolicy>
  ...
</broker>

results matching ""

    No results matching ""