我正在构建一个处理订单的系统。每个订单都将遵循工作流程。因此,该订单可以是例如预订,接受,付款批准,取消等。 每次订单状态发生变化时,我都会将此更改发布到SNS。要知道状态订单是否已更改,我需要向外部API发出请求,并与上次已知状态进行比较。 问题是:存储最后已知订单状态的最佳位置是什么? 1. SQS队列。因此,每次我从队列中读取消息时,使用外部API检查状态,删除消息并插入另一个具有新状态的消息。 2.使用数据库(如Dynamo DB)控制订单状态。
答案 0 :(得分:4)
你不应该使用“store”这个词来描述有状态事实和队列发生的事情。应将有状态的事实信息存储(保存)到数据库中。
队列消息应被视为需要完成哪些工作的“提示” - 请求考虑建议操作的合理性,如果合理,则执行操作。
我的意思是,当队列消费者看到要创建订单的消息时,它应检查数据库并创建订单(如果尚未存在)。更新订单?检查数据库以查看订单是否处于正确状态以进行更新。 (取消已经发货的订单将是不匹配状态的示例)。
按照设计,队列在操作中不能像数据库那样精确和原子。 Two Generals Problem是处理队列(以及设计队列系统)时出现问题的几种情况之一 - 消息可能会丢失或多次传递。
当多次传递(从队列接收)消息时,“队列是权威的”场景会发生什么?如果邮件丢失会发生什么?使用队列没有任何问题,但我恭敬地建议在这种情况下不应将队列视为权威。
答案 1 :(得分:1)
我将使用数据库选项而不是SQS:
1)选项SQS:
2)选项DynamoDB:
Lambda函数将发送通知
数据库选项看起来很清楚,您不必担心维护任何队列,除非您实现并行读取器以从队列中读取,否则您可以一次从队列中读取一条消息。在数据库中,您可以更新多行,它将触发lambda,您不必担心它。
希望有所帮助