编排引擎和框架?

16
我正在寻找一个编排框架/引擎/工具包,以替换/升级现有软件,主要是因为可扩展性的限制。通过编排,我指异步和分布式执行通用任务和工作流程。
更具体地说,要求如下: - 包装和执行通用任务,如果依赖于语言,则使用Java - API以触发任务和工作流程 - 最好还包括调度功能 - 支持分布式架构和可扩展性(主要针对大量小型任务) - 持久性和弹性 - 高级工作流配置功能(按优先级、依赖关系等配置) - 监控和管理UI(或至少API)
现有系统是一个老式的单体服务(使用Java),其中大部分都有,包括执行逻辑本身,应尽可能保持不变。
有没有人遇到过类似的问题?我觉得这应该是相当普遍的,如果我必须完全自己实现它,那就很奇怪了。我在这里找到了一些问题(比如thisthis),讨论编排和编舞系统的理论,但没有真正实现它的工具的实际例子。此外,我认为我们并不完全是在谈论微服务——任务并不是长时间而繁重的,它们只是许多在后台运行、执行许多类型的短任务。我不会为每种工作类型创建一个服务。
我目前也寻找云和容器服务——据我所知,部署是一个不同的问题。
我找到的最接近的是Netflix Conductor engine,它通过运行一个编排服务器来管理在servlets中实现的任务(或任何语言的任何Web服务——加分)。然而,它似乎主要是为了安排工作流中的重任务而构建的,而不是运行大量小任务,这让我想知道在servlets中调用许多小任务的开销是多少。
有没有人对Conductor或其他我可以使用的工具有经验或任何输入?甚至对我的整个解决方案有什么看法?
编辑:我意识到这有点像“需要研究建议”,所以让我们简单地把它分为3个问题:
  1. 我是否正确地寻找了一个针对上述要求的编排解决方案?
  2. 有没有人对Netflix Conductor有经验?对此有什么反馈?
  3. 它有好的竞争对手吗?

你看过Apache Camel吗?它是EIP的事实标准实现,可以完成你列出的所有任务以及更多的功能。 - Pavel Lechev
3个回答

8
Netflix Conductor的主要竞争对手是Temporal Workflow。它采用代码而非JSON DSL实现编排逻辑,因此具有更好的可扩展性和更加开发者友好的特点。
此外,Temporal还通过实现特定的优化(本地活动)来处理细粒度任务,从而允许将多个小任务批量处理为单个数据库更新。
Temporal已在Uber、Coinbase、HashiCorp、Dagadog、Stripe等数百家公司中进行了五年以上的生产测试。

3
FYI,这个答案是由Temporal的创作者提供的,这并不会降低其价值。我唯一看到的问题是Temporal在SDK支持方面存在限制,特别是在.NET生态系统中(例如C#语言)。在这种情况下,我会选择Conductor。 - Theodore Zographos
Temporal 还需要太多的硬件,并且与 Cassandra 的高吞吐量绑定,它不能保证像货币交易等重要事务的确切一次语义。对于竞态条件,活动负责确保唯一的事务。 - prashant
跟什么相比太多了?我不知道有哪个其他解决方案具有可比较的功能且更有效率。没有一个微服务编排系统支持完全没有两阶段提交的,这是无法扩展的。例如 Coinbase,语义已经足够好了:https://docs.temporal.io/blog/reliable-crypto-transactions-at-coinbase/ - Maxim Fateev

6
也许您正在寻找类似于Airflow https://airflow.apache.org/ 的东西吗? Java中通用任务的包装和执行,如果需要则依赖于语言

https://github.com/apache/incubator-airflow/tree/master/airflow/hooks https://github.com/apache/incubator-airflow/tree/master/airflow/contrib/operators

任务和工作流API按需触发

https://airflow.apache.org/api.html (实验性)

调度功能也很不错

想象一下 cron 加强版 - https://airflow.apache.org/scheduler.html

支持分布式架构和可扩展性(主要针对大量小任务)

使用 dask 或 celery 节点进行扩展 - Airflow + celery or dask. For what, when?

持久性和韧性

使用 postgres 数据库和 rabbitMQ - 如果您的部署架构是无状态的 (例如,使用 docker 中的可重复容器和卷),则使用 WAL 复制应该能够满足您的需求。如果您使用 Kubernetes 或 Consul,则可以实现其他组件的更多韧性

高级工作流配置功能(先做这个,然后这三个任务并行执行,然后再做这个,具有优先级、依赖关系等)

Airflow使用DAG。其功能可以称为相当先进。如果确实需要,你还可以使用XCOM进行参数共享。 监控和管理UI(或至少API) 有一个UI,显示任务和调度,拥有甘特图视图,可以轻松查看日志和运行详细信息,也可以直接从UI手动调度任务。
还可以查看oozie和azkaban。
这有帮助吗?

2
您可以看一下 unify-flowret,这是我在开发美国运通新平台时创建的轻量级 Java 编排引擎。如果您认为 Netflix Conductor 是解决您问题的好选择,那么一定要看一下 unify-flowret,因为在构建 unify-flowret 之前,我们已经评估了 Netflix Conductor 等选项。
Unify-flowret 提供核心编排功能,并依赖于应用程序提供其他所有内容。您可以使用步骤和路由在一个非常简单的 JSON 文件中定义工作流程。然后,在想要使用 flowret 的应用程序中,您可以创建某些实现,例如将状态持久化到数据库的实现(这样就可以使用任何数据存储)或返回对象给 flowret 的实现,flowret 将调用步骤函数。这样,与其在编排引擎内部实现各种要求以保持简单性,大部分要求都被推迟到了应用程序中。
Unify-flowret 在嵌入模式下运行,因此可以水平扩展。它会从上次离开的地方恢复。它对崩溃具有弹性,并将从上次记录的位置恢复。它通过在工作流程 JSON 中定义来提供真正的技术并行处理。它提供了一个 SLA 框架,可告知应用程序未来要设置的里程碑。它以工作篮的形式提供了工作管理功能。还有许多其他功能!
我们在美国运通公司内部使用它,针对非常复杂的编排需求取得了巨大成功。
你可以在https://github.com/americanexpress/unify-flowret上检查 unify-flowret。

我一直对unify-flowret很感兴趣,但是我似乎找不到它是否适用于分布式(微服务)架构,其中可能会有多个节点运行实现编排的服务。假设数据库可能是单节点或多节点,那么在工作流编排方面,例如用于表示案例/旅程/工作流的唯一标识符是否会存在冲突?还有其他限制吗?应用程序是否应该自行处理此类冲突,还是flowret隐含地处理它们? - Ankur
我认为更合适的说法是,统一流程(unify-flowret)更像是一种状态管理和本地编排,而不是一个分布式平台。这个框架可以创建一个很好的状态机,但并不仅限于外部事件来触发自身。我刚刚开始使用统一流程,只花了15分钟,这就是我找到的内容。 - SydMK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接