根据文档:
问:每条消息我会收到多少次?
Amazon SQS 旨在提供其队列中所有消息的“至少一次”传输。尽管大多数情况下每条消息将只传递给您的应用程序一次,但您应该设计您的系统,以便多次处理消息不会产生任何错误或不一致。
有没有什么好的做法可以实现一次性交付?
我正在考虑使用 DynamoDB “条件写入”</a> 作为分布式锁定机制,但是......有更好的主意吗?
对此主题的一些参考:
根据文档:
问:每条消息我会收到多少次?
Amazon SQS 旨在提供其队列中所有消息的“至少一次”传输。尽管大多数情况下每条消息将只传递给您的应用程序一次,但您应该设计您的系统,以便多次处理消息不会产生任何错误或不一致。
有没有什么好的做法可以实现一次性交付?
我正在考虑使用 DynamoDB “条件写入”</a> 作为分布式锁定机制,但是......有更好的主意吗?
对此主题的一些参考:
最佳解决方案实际上取决于您不多次执行消息中建议的操作的重要性。对于某些操作,例如删除文件或调整图像大小,它是否发生两次并不重要,所以什么都不做也没关系。当第二次不做这项工作更为关键时,我为每条消息(由发送者生成)使用一个标识符,接收者通过标记在 memchachd 中看到的 id 来跟踪 dups。对很多事情都很好,但如果生活或金钱依赖于它,可能就不行了,尤其是在有多个消费者的情况下。
条件写入听起来像是一个聪明的解决方案,但它让我想知道如果您需要一个防弹的完全一次性解决方案,AWS 是否不是解决您的问题的一个很好的解决方案。
分布式锁定的另一个替代方案是 Redis 集群,它也可以使用 AWS ElasticCache 进行预置。Redis 支持保证并发调用按顺序执行的事务。
使用缓存的优点之一是您可以设置过期超时,因此如果您的消息处理失败,锁将得到定时释放。
在这篇博文中,还建议使用像 Amazon DynamoDB 这样的低延迟控制数据库: https ://aws.amazon.com/blogs/compute/new-for-aws-lambda-sqs-fifo-as-an-事件源/
Amazon SQS FIFO 队列确保处理顺序遵循消息组内的消息顺序。但是,它不保证在用作 Lambda 触发器时只交付一次。如果只有一次交付在您的无服务器应用程序中很重要,则建议使您的函数具有幂等性。您可以通过使用可扩展的低延迟控制数据库(如 Amazon DynamoDB)跟踪消息的独特属性来实现这一点。
简而言之 - 我们可以使用条件表达式属性_not_exists (用于放置)或if_not_exists (用于更新)将项目或更新项目放入dynamodb表中,请在此处查看示例 https://stackoverflow.com/a/55110463/9783262
如果我们在put/update操作期间遇到异常,我们必须从 lambda 返回而不进行进一步处理,如果没有得到它,则处理消息(https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function -幂等/ )
以下资源对我也有帮助:
https://ably.com/blog/sqs-fifo-queues-message-ordering-and-exactly-once-processing-guaranteed
https://aws.amazon.com/blogs/aws/introducing-amazon-sns-fifo-first-in-first-out-pub-sub-messaging/