为什么要使用死信队列?

Hug*_*ugo 5 architecture publish-subscribe dead-letter

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

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

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

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

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

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

一定有什么东西我失踪了。

Kam*_*osn 9

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

  1. 发布消息中有错误(您的场景#1)
  2. 订阅者的行为发生了变化,现在它无法处理以前能够处理的消息。

理想情况下,当人们设置死信队列时,他们还会根据已发布到该队列的消息设置警报。然后,在某个单独的过程中,他们通过订阅死信主题的订阅来查看消息,以确定无法处理它们的原因。如果消息不正确,则订阅者的所有者可以联系发布者的所有者来修复消息(如果需要)。

如果消息正确并且订阅者中的错误阻止了消息的处理,那么就可以修复订阅者。一旦修复,消息就可以重新发布到原始主题,以便固定订阅者可以接收它们,或者可以使用搜索来重放消息。

消息由于缺乏处理能力而被传递到死信队列(因此​​取消它们或让确认截止日期到期)类似于#2,并且意味着需要增加订阅者的容量,并且可能将流量控制设置为与订阅者可以处理的内容一致的级别。然后,人们可以重新发布或使用“寻求”来再次取回消息。