基于 SQS 消息触发 SWF 工作流

Posted

技术标签:

【中文标题】基于 SQS 消息触发 SWF 工作流【英文标题】:Triggering a SWF Workflow based on SQS messages 【发布时间】:2013-12-31 04:15:59 【问题描述】:

序言:我正在尝试针对我认为非常常见的用例提出一个建议,并且我想使用 Amazon 的 SWF 和 SQS 来实现我的目标。可能还有其他服务更适合我正在尝试做的事情,所以如果您有任何建议,请随时提出。

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

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

不过,我似乎不知道如何触发工作流程开始。从我一直在阅读的内容来看,工作流程并不意味着是一个不确定的过程。它有开始、中间和结束。根据 SWF 文档,工作流可以运行不超过一年 (Setting Timeout Values in SWF)。

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

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

提前谢谢你。

【问题讨论】:

无论如何,您可以限制 Amazon SNS 的速率,以减少扩展问题。在此处查看设置:docs.aws.amazon.com/sns/latest/dg/… 【参考方案1】:

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

【讨论】:

这几乎就是我们最终所做的一些小的变化。感谢您的回复。【参考方案2】:

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

【讨论】:

是的,当时的情况可能有点不同 lambda 是否必须在工作流运行的整个时间内运行?还是只需要启动工作流程(然后 lambda 可以退出)? 它只需要启动工作流程。但是工作流(决策者)工作者仍然必须一直运行。不幸的是,SWF 团队仍然不支持作为 lambda 函数运行的决策者。

以上是关于基于 SQS 消息触发 SWF 工作流的主要内容,如果未能解决你的问题,请参考以下文章

AWS SWF和SQS关系是否与Celery和RabbitMQ类似?

更长触发 lambda 的 SQS 消息

消息发布到 SQS 时如何触发 lambda?

Amazon Elastic Beanstalk Worker cronjob (SQS) 多次触发同一消息

在 SQS 消息触发的 Lambda 上跟踪 AWS API Gateway request_id

无服务器中的 SQS 触发 lambda 存在延迟