Amazon SQS 消息多路传送
Posted
技术标签:
【中文标题】Amazon SQS 消息多路传送【英文标题】:Amazon SQS message multi-delivery 【发布时间】:2013-09-05 03:51:49 【问题描述】:我了解,为了带来巨大的可扩展性和可靠性,SQS 对资源进行了广泛的并行化。它甚至为小型队列使用冗余服务器,甚至发布到队列的消息也作为多个副本冗余存储。这些是阻止它像在 RabbitMQ 中那样只发送一次的因素。我什至看到了被删除的消息被传递。
对开发人员的影响是,他们需要为消息的多次传递做好准备。亚马逊声称这不是问题,但它确实是,然后开发人员必须使用一些同步结构,如数据库事务锁或发电机数据库条件写入。这两者都会降低可扩展性。
问题是,
鉴于重复传递问题,message-invisible-period 功能如何保持?不保证该消息是不可见的。如果开发人员必须自己安排同步,那么隐身期有什么好处。我已经看到消息被重新发送,即使它们应该是不可见的。
编辑
这里我包括一些参考资料
-
What is a good practice to achieve the "Exactly-once delivery" behavior with Amazon SQS?
http://aws.amazon.com/sqs/faqs/#How_many_times_will_I_receive_each_message
http://aws.amazon.com/sqs/faqs/#How_does_Amazon_SQS_allow_multiple_readers_to_access_the_same_message_queue_without_losing_messages_or_processing_them_many_times
http://aws.amazon.com/sqs/faqs/#Can_a_deleted_message_be_received_again
【问题讨论】:
我很好奇 - 我已经对 SQS 进行了大量工作,但从未见过这些问题。不确定是运气,还是我用它构建的应用程序和企业系统是否接收到相同的消息并不重要。你有关于这方面的文档的参考吗? @PeterH.,我用参考更新了这个问题 尴尬 - 就在常见问题解答中!谢谢。适合我的 RTFM。 SQS 现在有 FIFO 队列,可以保证消息只传递一次。见docs.aws.amazon.com/AWSSimpleQueueService/latest/… @danny,是的,曾经有几千人。对我来说,它看起来像一个爆裂的东西。一旦它开始重新交付,它会继续这样做几秒钟。我在我的日志中发现了这样的事件集群。我使用 dynamodb + 强一致性 + 条件写入来解决问题。 【参考方案1】:消息不可见性解决了与保证一次且仅一次传递不同的问题。考虑对队列中的项目进行长时间运行的操作。如果处理器在操作过程中出现故障,您不想删除该消息,而是希望它重新出现并由另一个处理器再次处理。
所以模式是……
-
将项目写入(推送)到队列中
查看(查看)队列中的项目
将项目标记为不可见
对项目执行流程
写入结果
从队列中删除(弹出)项目
因此,无论您是否收到重复交付,您仍然需要确保处理队列中的项目。如果您在将其从队列中拉出时将其删除,然后您的服务器死机,您可能会永远丢失该消息。它通过使用 Spot 实例来实现积极的扩展 - 并保证(使用上述模式)您不会丢失消息。
但是 - 它不保证一次且仅一次交付。但我不认为它是为这个问题而设计的。我也不认为这是一个无法克服的问题。在我们的例子中(我明白为什么我以前从未注意到这些问题)——我们正在将结果写入 S3。如果它用相同的数据覆盖相同的文件,这没什么大不了的。当然,如果它是通过银行账户进行的借记交易,您可能需要某种相关 ID……而且大多数系统已经有了这些。所以如果你得到一个重复的相关值,你会抛出一个异常并继续前进。
好问题。为我突出了一些东西。
【讨论】:
所以我知道消息不可见是针对故障安全工作人员崩溃而不是单次交付。所以message-invisibility
更像是timeout-and-requeue
,而不是prevent-the-other-worker
来完成相同的任务。因为其他工人可能会得到副本......??我的理解正确吗?
那种。绝对是timeout-and-requeue
。但我建议它也是try-to-prevent-the-other-worker
。如果可能,您不希望其他工人抢到它,因为如果抢到了并且您有一个农场,那么他们全部抢下一个项目。在大多数情况下,它的行为类似于prevent-the-other-worker
,但这并不能保证行为。以上是关于Amazon SQS 消息多路传送的主要内容,如果未能解决你的问题,请参考以下文章
Amazon Elastic Beanstalk Worker cronjob (SQS) 多次触发同一消息