说明
死信队列(Dead-Letter-Queue,DLQ)用于处理无法被正常消费的消息。达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时 CMQ 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中,这个特殊队列就是 DLQ。对新建的队列,或存量的队列,您都可以启用死信队列。
应用场景
定位问题:例如,某条消息被多次消费后却未被删除,一般是由于该消息未被正确消费,可能存在问题需要回溯定位。 您可以设置最大接收次数,超额后该消息会被淘汰到指定的死信队列,便于后续问题发现。
优先级队列:例如,摩拜单车等 O2O 客户,对访问时延、实时性要求非常高。单车开锁逻辑中,当 CMQ 堆积了1亿条消息时,会优先处理最新生产的部分消息,老的消息淘汰到死信队列,在消费者有能力时再处理。
老的消息(如用户扫码开车场景)在等待时已流失了用户,老的消息的价值会偏小,建议优先处理最新消息。
技术原理
客户端消费源队列信息,broker 检测是否满足死信策略配置的触发条件,若满足则投递到死信队列。
死信策略:触发死信消息的方式。
最大接收次数:将消息发送到死信队列前允许接收该消息的最大次数,支持设定值为1 - 1000次。
最大未消费时间:将消息发送到死信队列前达到了最大未消费时间,允许设置5分钟 - 12小时。注意
当 CMQ 触发高可用性时,CMQ 服务器 leader 切换有可能会导致计算消费次数不准确。
使用规则
一个队列只能绑定一个死信队列。
绑定的死信队列必须是同地域、同账号下的队列。
如果死信队列已被其他队列绑定,则不能直接删除该死信队列。
开启事务消息的队列,不能成为其他队列的死信队列。
多个队列(最多6个)可以指定同一个队列作为死信队列,但死信队列本身不能再指定其他队列作为死信队列 ,避免嵌套。
可以在源队列(客户端生产、消费的数据队列)中解绑死信队列,解绑后无其他队列绑定,可删除死信队列。
一个已存在的普通队列在 T 时刻被指定为死信队列,若在 T 时刻之前队列中还存在未被消费的消息,需要将 T 时刻之前的消息全部消费完成后才可以触发死信策略。