想象一下订单的以下生存期。
我们选择使用SQS FIFO来确保按照生成的顺序处理所有这些消息,从而避免例如将订单的状态仅在已付款而不是在完成后才更改为“已批准”。
但是,假设尝试批准订单时出现错误,并且多次尝试后,消息将被移至Deadletter队列。
我们注意到的问题是下一条消息,即“订单已完成”,即使前一条消息“已批准”,它也处于死信队列中。
我们应该如何处理?
假设能够做到这一点,我们是否应该检查死信队列的内容以获取具有与使用方相同的MessageGroupID的消息?
我们缺少一种机制吗?
答案 0 :(得分:1)
对我来说,就像您对多个事件使用单个队列一样,我可能会建议(至少)三个独立的队列:
当收到订单付款时,将一个事件放入第一个队列,一旦系统成功处理了该付款,它将从第一个队列中删除该项目(删除消息),然后插入“订单已批准”事件进入第二个队列。
负责处理这些事件的进程仅监视该队列并执行所需的操作,完成后,将删除该消息并将第三条消息插入到第三队列中,以便另一个进程可以看到该事件并对其执行操作消息-处理它,然后将其删除。
如果在此过程中发生任何故障,则消息最终将最终陷入死信队列(相同的队列或每个队列一个),这没有什么区别,但在事件失败后不会发生任何应有的事情。 / p>
在这种情况下,我什至没有听起来像您根本需要一个FIFO队列,尽管这并没有真正的危害(除了较高的成本和较低的吞吐量限制)。