Mad*_*Seb 4 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
Run Code Online (Sandbox Code Playgroud)
干杯!
首先,进程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队列之前发现了现场.
如果不确切知道你的处理需要什么,我就无法告诉你如何使你的过程具有幂等性,但是不要试图解决问题' 如果现场实例在中游关闭时会发生什么 ',请考虑' 我该如何设计这个过程中的每一步都可以运行多次,使用相同的输入并且不会引起任何问题 - 如果你这样做,你将一石二鸟.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           637 次  |  
        
|   最近记录:  |