在过去的几年里,我们使用自己的RM应用程序来处理与我们的应用程序相关的事件。这通过每隔几分钟轮询一次数据库表,查找任何在现在之前具有截止日期且尚未处理的行来工作。
我们目前正在过渡到 SNS,由 SQS 工作线程层处理它们。这种方法的问题在于我们无法将来确定消息的日期。我们的应用程序有时会包含我们不想在一周后处理的事件。
是否有任何设计方法,替代服务,我们可以采用的聪明技巧来实现这一目标?
一种解决方案是保持我们现有的应用程序在简化的级别上运行,因此它所做的只是在到期时发送 SNS 通知,但该项目的目的是尝试取消我们现有的应用程序。
数据库方法是最明智的,要注意每一行只处理一次。
Amazon Simple Notification Service (SNS( 旨在立即发送通知。没有延迟发送的功能(尽管某些通知类型如果失败,则会重试(。
AmazonSimple Queue Service (SQS( 确实具有延迟功能,但最多只能延迟 15 分钟 - 如果您需要在处理消息之前执行一些工作,例如将相关数据复制到 Amazon S3,这将非常有用。
鉴于您的要求是等到将来的某个任意时间(实际上类似于调度系统(,您可以启动一个进程并告诉它休眠一段时间(在系统重新启动的情况下这是一个坏主意(,或者继续从数据库轮询的方法。
如果所有作业都安排在遥远的未来(例如至少一小时(,理论上只需要每小时轮询一次数据库即可检索最早的计划时间。
一周可能太长,因为 SQS 邮件保留期本身只有 15 天。如果您可以接受最长 15 天的保留期,一个想法是每次收到消息时保持更改消息的可见性,直到它准备好进行处理。允许的最大可见性超时为 12 小时。详细了解可见性超时和用于更改它们的 API,
http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibility.html
http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/AboutVT.html
我找到了这种方法:https://github.com/alestic/aws-sns-delayed。基本上,您可以使用带有等待步骤的步骤函数