使用Amazon SQS实现“完全一次交付”行为的良好做法是什么?

时间:2012-11-21 01:04:02

标签: amazon-sqs

根据documentation

  

问:我会收到多少次信息?

     

亚马逊SQS是   旨在为其中的所有消息提供“至少一次”交付   队列。虽然大多数时候每条消息都会传递给   你的应用程序只需要一次,你应该设计你的系统   多次处理消息不会产生任何错误或   不一致。

有没有什么好的做法可以实现一次性交付?

我在考虑使用DynamoDB “Conditional Writes”作为分布式锁定机制但是......还有更好的想法吗?


对此主题的一些参考:

3 个答案:

答案 0 :(得分:8)

FIFO队列现在可用并提供有序的,只需开箱即用。

https://aws.amazon.com/sqs/faqs/#fifo-queues

检查您所在地区的可用性。

答案 1 :(得分:7)

最佳解决方案实际上取决于您不会多次执行消息中建议的操作的严重程度。对于某些操作,例如删除文件或调整图像大小,如果它发生两次并不重要,所以什么也不做也没关系。当第二次不执行工作更为关键时,我为每条消息使用一个标识符(由发送方生成),接收方通过标记memchach中的ID来跟踪重复。许多事情很好,但如果生活或金钱依赖它,可能不会,特别是如果有多个消费者。

有条件的写入听起来像一个聪明的解决方案,但它让我想知道如果你需要一个完全一次的防弹解决方案,AWS是否对你的问题不是一个很好的解决方案。

答案 2 :(得分:2)

分布式锁定的另一种替代方法是Redis群集,也可以使用AWS ElasticCache进行配置。 Redis支持transactions,它保证并发调用将按顺序执行。

使用缓存的一个优点是您可以设置过期超时,因此如果您的邮件处理失败,锁定将获得定时释放。