如何确保在相应的死信队列中有消息时阻止SQS FIFO

时间:2019-07-23 11:19:39

标签: amazon-web-services amazon-sqs

想象一下订单的以下生存期。

  1. 已付款订单
  2. 订单已批准
  3. 订单已完成

我们选择使用SQS FIFO来确保按照生成的顺序处理所有这些消息,从而避免例如将订单的状态仅在已付款而不是在完成后才更改为“已批准”。

但是,假设尝试批准订单时出现错误,并且多次尝试后,消息将被移至Deadletter队列。

我们注意到的问题是下一条消息,即“订单已完成”,即使前一条消息“已批准”,它也处于死信队列中。

我们应该如何处理?

假设能够做到这一点,我们是否应该检查死信队列的内容以获取具有与使用方相同的MessageGroupID的消息?

我们缺少一种机制吗?

1 个答案:

答案 0 :(得分:1)

对我来说,就像您对多个事件使用单个队列一样,我可能会建议(至少)三个独立的队列:

  • 已付款订单事件队列
  • 订单批准事件队列
  • 已完成订单的事件队列

当收到订单付款时,将一个事件放入第一个队列,一旦系统成功处理了该付款,它将从第一个队列中删除该项目(删除消息),然后插入“订单已批准”事件进入第二个队列。

负责处理这些事件的进程仅监视该队列并执行所需的操作,完成后,将删除该消息并将第三条消息插入到第三队列中,以便另一个进程可以看到该事件并对其执行操作消息-处理它,然后将其删除。

如果在此过程中发生任何故障,则消息最终将最终陷入死信队列(相同的队列或每个队列一个),这没有什么区别,但在事件失败后不会发生任何应有的事情。 / p>

在这种情况下,我什至没有听起来像您根本需要一个FIFO队列,尽管这并没有真正的危害(除了较高的成本和较低的吞吐量限制)。