带有SNS-SQS的管道
工作流由按动态条件确定的特定顺序执行的独立任务组成。 工作流通常代表业务流程,例如电子商务商店中的订单处理步骤。 Amazon Web Services提供了各种工具来构建分布式和可扩展的工作流应用程序。 构建此类应用程序的一种方法是使用主题和队列来连接工作流程中的不同步骤。 然后,我们可以使用发布/订阅,竞争的使用者和其他机制来扩展我们的应用程序,甚至最简单的应用程序都将具有类似于以下内容的形状:
流水线的每个步骤都通过队列连接到下一个步骤,并且每个步骤执行一些操作并决定下一步是什么。 此外,使用SNS / SQS还涉及其他一些底层任务: –序列化/反序列化数据 –确保SQSmessages的一致性(FIFO顺序) –确保不超过消息大小 –发明某种审计支持 –订户排队到主题,分配权限 –管理DLQ 最后,它可以工作,但是克服这些技术挑战所需的时间与编写可提供业务价值的实际代码所花费的时间一样多。
简单的工作流程服务
另一方面,SWF提供了用于编写分布式异步工作流应用程序的更高级别的API。 它会自动对数据进行序列化/反序列化,管理应用程序状态,提供可审核性,确保强一致性,支持多个版本。 最重要的是,它确保工作流程编排和业务逻辑执行分开。 任何典型的SWF应用程序都具有以下构造块:
用SWF术语来说,工作流是实际的模板,描述了流程应遵循的不同步骤。 而工作流执行就是该模板的运行。 Starter –可以启动,停止和与工作流执行交互的过程。 决策者 –协调和决定工作流程执行下一步的过程。 工作者 –执行特定类型任务的过程。 SWF控制台 –提供完整的可见性和执行控制权。 工作流执行示例可以通过以下步骤进行:启动程序启动工作流执行,SWF接收该工作流,询问决策者下一步是什么,然后根据该决定将任务传递给适当的活动工作者。 一旦收到了来自活动工作人员的结果,SWF就会再次向决策者询问下一步,并且取决于响应是否可以执行其他工作人员。 该流程一直持续到决策者答复工作流程完成为止。 您可以看到决策者如何协调工作流的每个步骤以及活动工作人员如何执行各个任务。 所有这些都由SWF管理,并且可以在任何阶段进行审核。
为什么要使用骆驼?
亚马逊提供的Java客户端通过使用注释生成代理类来访问SWF服务来工作。 生成和使用代理类以及从启动器到决策器以及从决策器到活动工作者的依赖关系的整个过程并不是很愉快。 还有什么比使用骆驼路线进行编排和使用另一条路线进行实际活动更好的呢? 结果是现在在Camel master中的Camel SWF组件。 Camel-swf组件具有两种类型的端点: 工作流和活动 。 工作流生产者允许我们启动,终止,取消,发信号,获取状态或检索工作流执行的整个执行历史。 在我们的图中,它表示启动器。 这是如何开始执行工作流程的示例:
from("direct:start")
.setHeader(SWFConstants.OPERATION, constant("START"))
.log("Starting a workflow task ${body}")
.to("aws-swf://workflow?domainName=demo&workflowList=demo-flow&version=1.0&eventName=processWorkflows");
工作流使用者是决定者。 它从SWF服务接收决策任务,并计划执行活动任务或指示工作流执行已完成。 这是一条无状态的确定性路线,只有工作才能安排任务:
from("aws-swf://workflow?domainName=demo&workflowList=demo-flow&version=1.0&eventName=processWorkflows")
.log("Received a workflow task ${body}")
.filter(header(SWFConstants.ACTION).isEqualTo(SWFConstants.EXECUTE_ACTION))
.to("aws-swf://activity?domainName=demo&activityList=demo-activity&version=1.0&eventName=processActivities");
活动端点允许我们与活动任务进行交互。 活动生产者用于安排活动任务,并且只能在决策者路线(实际上是决策者线程)中使用。 这是因为只有决策者才能安排活动任务。 我们图中必须提供实现的最后一个框是活动工作程序,可以使用活动使用者来创建活动工作程序。 该端点将从SWF接收活动任务,执行任务并将结果返回给SWF。 这是实际执行业务逻辑的部分:
from("aws-swf://activity?domainName=demo&activityList=demo-activity&version=1.0&eventName=processActivities")
.log("Received Activity task ${body}")
.setBody(constant("1"));
因此,任何SWF应用程序都由启动执行程序的启动程序(工作流生产者),接收决策任务并计划活动任务的决策者(工作消费者)(使用活动生产者)和执行任务的活动工作者(活动消费者)组成。 这些端点之间的通信是异步的,一致的,并且由SWF服务进行管理。
它不是最容易使用的组件,但是它具有简单且可扩展的体系结构。 PS:感谢我的前经理S. Wheeler让我将此组件贡献给Camel社区。