基于SQS消息触发SWF工作流

时间:2013-12-12 16:26:59

标签: amazon-sqs amazon-swf

序言:我正在尝试整理一个我认为是一个非常常见的用例的提案,我想使用亚马逊的SWF和SQS来实现我的目标。可能还有其他服务可以更好地匹配我正在尝试的内容,因此如果您有任何建议,请随时将它们删除。

问题最基本的需求是客户端(移动设备,网络服务器等)发布一条消息,该消息将异步处理而不会响应客户端 - 非常基本

预期的实现是客户端将消息发布到预定的SQS队列。此时,客户端已完成。我们还有一个定义的SWF工作流,负责从队列中拾取消息,并且(在一些操作之后)将它放在Dynamo DB中 - 再次,这一切都相当简单。

我似乎无法弄清楚,是如何触发工作流程的开始。从我一直在阅读的工作流程来看,并不是一个无限期的过程。它有一个开始,一个中间和一个结尾。根据SWF文档,工作流程可以运行不超过一年(Setting Timeout Values in SWF)。

所以,我的问题是:如果我假设工作流代表一个消息处理流程,那么每当消息发布到SQS时如何启动工作流程?

警告:我也考虑过使用SNS而不是SQS。这将允许我运行可以订阅SNS的服务器,然后在发布通知时启动工作流。这当然是一种解决方案,但我想避免为单个Web服务设置服务器,然后我必须根据正在处理的消息数量来管理/扩展。我首先考虑使用SQS / SWF的原因是有一个我不必担心的自动缩放系统。

提前谢谢。

2 个答案:

答案 0 :(得分:6)

我会创建一个侦听SQS队列的工作进程。收到消息后,它会调用SWF API来启动工作流程执行。应基于消息内容生成工作流执行ID,以确保重复的消息不会导致重复的工作流。

答案 1 :(得分:2)

您可以将AWS Lambda用于此目的。 SQS事件将调用lambda函数,因此您不必显式编写队列轮询器。然后lambda函数可以向SWF发出post请求以启动工作流程