5

前言:我正在尝试针对我认为非常常见的用例提出一个建议,并且我想使用亚马逊的 SWF 和 SQS 来实现我的目标。可能还有其他服务可以更好地匹配我正在尝试做的事情,所以如果您有建议,请随时将它们扔掉。

问题:最基本的需求是客户端(移动设备、Web 服务器等)发布一条消息,该消息将在不响应客户端的情况下异步处理 - 非常基本。

预期的实现是让客户端将消息发布到预先确定的 SQS 队列。至此,客户端就完成了。我们还将有一个已定义的 SWF 工作流,负责从队列中提取消息并(经过一些操作)将其放入 Dynamo DB 中——同样,这一切都相当简单。

不过,我似乎无法弄清楚如何触发工作流程开始。从我一直在阅读的内容来看,工作流程并不意味着是一个不确定的过程。它有开始、中间和结束。根据 SWF 文档,工作流可以运行不超过一年(在 SWF 中设置超时值)。

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

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

先感谢您。

4

2 回答 2

6

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

于 2013-12-12T18:19:41.030 回答
3

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

于 2016-05-08T21:50:36.930 回答