使用SQS或DynamoDB控制订单状态

时间:2016-05-24 03:29:24

标签: amazon-dynamodb message-queue amazon-sqs

我正在构建一个处理订单的系统。每个订单都将遵循工作流程。因此,该订单可以是例如预订,接受,付款批准,取消等。 每次订单状态发生变化时,我都会将此更改发布到SNS。要知道状态订单是否已更改,我需要向外部API发出请求,并与上次已知状态进行比较。 问题是:存储最后已知订单状态的最佳位置是什么? 1. SQS队列。因此,每次我从队列中读取消息时,使用外部API检查状态,删除消息并插入另一个具有新状态的消息。 2.使用数据库(如Dynamo DB)控制订单状态。

2 个答案:

答案 0 :(得分:4)

你不应该使用“store”这个词来描述有状态事实和队列发生的事情。应将有状态的事实信息存储(保存)到数据库中。

队列消息应被视为需要完成哪些工作的“提示” - 请求考虑建议操作的合理性,如果合理,则执行操作。

我的意思是,当队列消费者看到要创建订单的消息时,它应检查数据库并创建订单(如果尚未存在)。更新订单?检查数据库以查看订单是否处于正确状态以进行更新。 (取消已经发货的订单将是不匹配状态的示例)。

按照设计,队列在操作中不能像数据库那样精确和原子。 Two Generals Problem是处理队列(以及设计队列系统)时出现问题的几种情况之一 - 消息可能会丢失或多次传递。

当多次传递(从队列接收)消息时,“队列是权威的”场景会发生什么?如果邮件丢失会发生什么?使用队列没有任何问题,但我恭敬地建议在这种情况下不应将队列视为权威。

答案 1 :(得分:1)

我将使用数据库选项而不是SQS:

1)选项SQS:

  • 您将拥有一个将更改状态的应用程序
  • 将状态值添加到SQS
  • 现在,另一个应用程序将检查您的消息并发送通知,删除消息

2)选项DynamoDB:

  • 在DynamoDB中插入更新状态
  • 在更新该字段时配置Lambda函数
  • Lambda函数将发送通知

    数据库选项看起来很清楚,您不必担心维护任何队列,除非您实现并行读取器以从队列中读取,否则您可以一次从队列中读取一条消息。在数据库中,您可以更新多行,它将触发lambda,您不必担心它。

希望有所帮助