我有一个应用程序从 SQS 读取消息(我们称之为队列“p”),进行计算量大的图像处理(步骤 #1),将结果上传到 S3 并从队列“p”中删除消息,然后发送一个通知到 SNS 主题(此 SNS 主题将消息路由到另一个名为“q”的队列)。还有另一个应用程序从队列“q”中读取并执行图像处理的第二阶段(从 S3 下载步骤 #1 的结果并对该结果执行额外的数学运算)。
我有运行第 1 步应用程序的常规实例 + 现货实例的组合。我知道(由于 SQS 可见性超时概念)如果现场实例在图像处理阶段关闭,SQS 会使消息再次对其他消费者可见,因此非现场 EC2 实例最终将完成现场的工作由于系统关闭,实例无法完成。
现在我的问题是:如果现场实例在删除之后但在消息发送到 SNS 之前完全关闭会发生什么?我们怎样才能从这样的事件中恢复过来?
# PSEUDO CODE
msg = read message from queue
result = doWork(msg)
upload result to S3
delete msg
publish to sns about result
干杯!