为什么要使用死信队列?

Why use a dead-letter queue?

我正在考虑为一组服务用来相互通信的队列实施死信队列。

一直萦绕在我脑海中的是它如何解决未处理消息的问题。

在我看来,消息不会在以下两种情况之一中得到处理:

  1. 由于消息本身的某些原因(例如格式不正确),无法处理消息本身。
  2. 接收消息的应用程序没有能力处理它。

在场景 1 中,按原样将消息保存在死信队列中不执行任何操作。应用程序仍然无法处理它。

在场景 2 中,应用程序还需要以某种方式处理来自死信队列的消息。但是,如果它没有能力处理来自其主队列的消息,为什么它有能力从第二个队列中获取工作?

一定是我遗漏了什么。

dead-letter 队列的目标不是将其视为同一订户从中读取的辅助队列。相反,它是一个发送意外无法处理的消息的地方。造成这种情况的主要原因有两个:

  1. 发布消息中存在错误(您的场景 #1)
  2. 订户的行为已经改变,现在它无法处理以前能够处理的消息。

理想情况下,当一个人设置 dead-letter 队列时,他们也会 set up alerting 基于已发布到该队列的消息。然后,在某个单独的进程中,他们通过订阅 dead-letter 主题上的订阅来查看消息,以确定无法处理它们的原因。如果消息不正确,如果需要,订阅者的所有者可以联系发布者的所有者来修复消息。

如果消息是正确的并且订阅者中的错误阻止了它们被处理,那么可以修复订阅者。固定后,消息可以重新发布到原始主题,以便固定订阅者可以接收它们,或者可以使用 seek 重播消息。

消息由于缺乏处理能力而被传递到 dead-letter 队列(因此​​正在取消它们或让 ack 截止日期到期)类似于 #2,这意味着需要增加订阅者的容量,并可能将 flow control 设置为符合订阅者可以处理的水平。然后,人们会重新发布或使用 seek 再次取回消息。