是否有一种优雅的方式将消息发布到AWS SQS,可见延迟超过15分钟?

Hai*_*ter 14 timer amazon-sqs amazon-web-services

在Amazon Web Services中,他们的队列允许您发布最长15分钟的可见性延迟的消息.如果我不想在6个月内看到消息怎么办?

我正在尝试为轮询/推送问题提出一个优雅的解决方案.我可以每隔几秒编写一次代码来轮询SQS(或数据库),检查准备可见的消息,然后将它们移动到"可见队列",或类似的东西.我希望有一种更简单,更可靠的方法让消息在远期的队列中可见,而不必担心我的轮询应用程序始终完美运行.

我没有与AWS,SQS或其中任何一个结婚,但我更愿意找到一个稳定,可靠的云友好解决方案,并且将在未来触发一个事件,而不必担心检查其状态每天.

欢迎任何想法或替代树木让我探索咆哮.

谢谢!

Jay*_*ibb 8

听起来你可能误解了可见性延迟.其目的是确保轮询应用程序不会多次从队列中拉出相同的项目.

换句话说,当项目从队列中拉出时,如果轮询系统具有一次从队列中读取的一组机器,则它在预定的时间段内(默认为30秒,最长为15分钟)变得不可见.

这是相关文档:

http://docs.amazonwebservices.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/IntroductionArticle.html#AboutVT

......以及与我的评论相关的特别句子是:

"组件收到消息后,消息仍然在队列中.但是,您不希望系统中的其他组件再次接收和处理消息.因此,Amazon SQS会以可见性超时阻止它们,这是一个Amazon SQS阻止其他消费组件接收和处理该消息的时间段."

您应该能够将SQS用于您的目的,因为您可以根据需要将项目留在队列中.

  • 嘿周杰伦 - 对不起我对我的问题不太清楚.我不是指消息可见性,而是延迟队列,其中消息在一段时间内对任何人都不可见(而不是因为它们已经被其他一些进程检出).这可以防止在用户确定的时间段内根据任何事情处理消息.这是一个链接:http://docs.amazonwebservices.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/IntroductionArticle.html#sqs-delay-queues (2认同)
  • 你可能想看看http://www.iron.io,他们有几款新产品看起来非常适合你想做的事情. (2认同)

Ben*_*ler 7

7年后,亚马逊仍然不支持您需要的功能!

您可以通过以下两种方式使其发挥作用:

  • 消息在其message_attributes中包含一个传递目标日期时间,并让消耗该队列消息的工作者只删除并重新创建在其目标之前消耗的任何消息,其中delay = max(0,min(secs_until_target_datetime,900)); 这将允许您有效地为任意未来时间安排消息;

要么,

  • (稍微不那么频繁和常规:)类似地,如果消息尚未处理,则重新创建它并将其可见性超时更改为timeout = max(0,min(secs_until_target_datetime,43200))

使用可见性超时的缺点是任何读取都会重新触发它.