14

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

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

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

欢迎任何想法或替代树让我探索吠叫。

谢谢!

4

3 回答 3

8

听起来您可能误解了能见度延迟。其目的是确保轮询应用程序不会多次从队列中拉出同一个项目。

换句话说,当轮询系统有一组机器同时从队列中读取数据时,当项目被拉出队列时,它会在预定的时间段内不可见(默认为 30 秒,最长为 15 分钟)。

以下是相关文档:

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

...特别是与我的评论有关的句子是:

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

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

于 2011-12-13T02:53:49.650 回答
7

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

有两种方法可以让它工作:

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

或者,

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

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

于 2017-09-11T18:45:37.243 回答
4

自 2016 年 12 月 1 日以来,一直有一个直接的 AWS 解决方案:AWS Step Functions

每次执行可以持续/空闲长达一年,在转换之间保持状态,并且在等待期间不会花费你任何钱。

于 2019-01-19T17:23:18.980 回答