SQS / SNS和一次性计算架构(EC2 SPOT实例)

时间:2013-11-25 07:03:33

标签: amazon-ec2 amazon-sqs amazon-sns

我有一个应用程序从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

干杯!

1 个答案:

答案 0 :(得分:7)

首先,进程A不应该从其SQS队列中删除消息,直到它将SNS消息发送到第二个进程。从队列中删除消息是你应该做的最后一件事来表明'我的工作已经完成'。在发送SNS消息之前,工作尚未完成。

其次,在设计这样的流程时(尤其是在使用点实例时),您需要采用的一个关键事项是 Idempotence http://en.wikipedia.org/wiki/Idempotence

  

一元操作(或函数)是幂等的,如果,只要对任何值应用两次,它就会产生与应用一次相同的结果

更多:http://aws.amazon.com/sqs/faqs/#How_many_times_will_I_receive_each_message

  

Amazon SQS旨在为其队列中的所有邮件提供“至少一次”传递。虽然大多数情况下每封邮件只会传递给您的应用程序一次,但您应该设计系统,以便多次处理邮件不会产生任何错误或不一致。

这最终意味着,无论现场实例是否在进程中关闭,SQS队列中的给定消息将同时传递给多个工作进程或传递到同一进程的可能性更大不止一次,要么是因为SQS发送了两次,要么在发送SNS消息之后但在更新SQS队列之前现场失败。

如果不确切知道您的处理需要什么,我无法告诉您如何使您的流程具有幂等性,但不要尝试解决问题'如果点实例在流中关闭时会发生什么',考虑'我如何设计流程中的每一步,以便它可以多次运行,使用相同的输入而不会导致任何问题 - 如果你这样做,你将杀死两个一石二鸟。