写点什么

Netflix Conductor:流程的反转控制

  • 2017-05-10
  • 本文字数:2306 字

    阅读完需:约 8 分钟

本文首发于 Netflix ,经网站授权由 InfoQ 翻译为中文版分享给中文读者。

In December 2016, we open sourced Netflix Conductor .

2016 年 12 月, Netflix Conductor 开源了。

自此以后,增加了更多的特性,增加了工作流临近的用户界面,并使系统更稳定了。使用率、新的用例、特性需求都显著增加了,社区里也出现了许多有意思的事情。在本文中,我们将讨论本季度添加到 Conductor 中的几个主要特性。

Conductor 中的反转控制

Conductor 使工作流的复用以及作为子流程嵌入到其他流程中更为简单了。子流程是使过程复用和模块化的好方法。随着 Netflix Conductor 使用率的上升,我们发现了一些有趣的用例,里边的业务流程是基于其他流程中的事件和状态变化而启动的。

传统上,应用是这样实现类似用例的:使用公共 / 子系统并随应用状态变化发布事件,并订阅感兴趣的事件以发起行为。

我们寻求具有以下特征的解决方案:

  • 工作流之间松散耦合
  • 能基于其他流程中的状态变化启动流程
  • 为通过 SQS/SNS 生产或消费事件的外部系统提供集成

现在说说工作流的反转控制。这个思想使流程的启动、流程中任务的完成等等绑定到流程行为上成为了可能。

为进一步说明这一点,让我们看两个在文件提取之后触发“质量控制流程”的解决方案。一旦文件提取完毕,就会触发由不同应用所有的多个流程。其中一个是文件验证流程(质量控制流程),它被触发去识别文件的类型(音频、视频等等),执行适当的检查,然后对这个文件开始编码。

如果使用 Conductor,可以用两种方式来实现这一点,这两种方案都能很好地完成,但有轻微的差异。

将其他流程作为子流程来启动

(点击放大图像)

假定,子流程是任务,他们的输出可以被质量控制流程之后的文件提取流程中的其他任务消费,换句话说,就是质量控制流程的输出。当业务流程间为紧依赖松耦合时,子流程是很有用的。

在事件上启动一个流程

(点击放大图像)

在以上方法中,文件提取流程产生一个“提取完成”事件。这个事件可以被一个或多个事件处理程序消费去执行行为,包括启动一个流程。

  • 文件提取流程没有任何直接的流程依赖
  • 流程基于事件触发,从而促成松耦合
  • 质量控制任务流程的输出不影响文件提取流程
  • 多个流程或行为可被每个事件执行

事件任务

我们引入一个新的任务类型,称为事件。在流程定义中可添加事件任务。执行时,它会按照规范产生一个“sink”事件。一个 sink 即为一个系统(比如 SQS、Conductor 或其他支持系统)事件。sink 遵循一个可插拔的架构,可以通过实现所需的接口以及在 Conductor server JVM 中的类路径中安装可用组件来添加 JMS、Kafka 之类的。

下面是 Conductor 的任务输入输出模型,对事件任务的输入是有计划的,作为载荷来发送。sink 可以是 Conductor,也可以是 SQS 之类的外部系统。这个支持多种类型 sink 的架构是基于插件的,像 JMS 或 Kafka 这样的新类型可以通过实现所需的接口以及在 Conductor server JVM 中的类路径中安装可用组件来予以添加。

下图是一个事件任务示例,它发布一个以名称标识的事件到 SQS 队列。

复制代码
{
"name": "example_event",
"taskReferenceName": "event0",
"input": {
"filename": "${workflow.input.filename}",
"location": "${anothertask.output.location}"
},
"type": "EVENT",
"sink": "sqs:sqs_queue_name"
}

事件处理程序

事件处理程序即监听,特定事件到达时予以执行。处理程序监听多种事件来源,包括 Conductor 和 SQS/SNS,使用户可以通过 API 插入其他来源。对于每个事件类型,Conductor 支持多种事件处理程序。事件处理程序由 Conductor 使用事件 API 终端进行管理。对于单个事件来源来说,可以具有多个事件处理程序。

(点击放大图像)

事件条件

条件即载荷之上的一段 JavaScript 表达式,对于事件处理程序来说,其值必须判定为“真”才会执行相应行为。这个条件行为就像过滤器一样,在匹配条件的事件子集上有选择地采取行为。条件过滤器是可选的,未指定时该来源的所有事件都会被处理。

事件行为

每个事件处理程序都有一个或多个与其相关的行为。当与该事件相关的条件判定为“真”时,这些行为就会被执行。支持的事件是:

  • 启动一个流程
  • 完成一个任务:成功完成或以失败告终

举个例子

下面是事件处理程序示例,它监听了一个 SQS 队列,根据条件去启动相应流程

复制代码
{
"name": "conductor_event_test",
"event": "sqs:example_sqs_queue_name",
"condition": "$.file_type == ‘image’",
"actions": [
{
"action": "start_workflow",
"start_workflow": {
"name": "workflow_name",
"input": {
"file_name": "${filename}",
"file_type": "${file_type}"
}
}
}
],
"active": true
}

Conductor 界面

所有已注册的事件处理程序都可以在界面中予以检查。可以通过 REST API 或 Swagger API 界面来进行更新。

(点击放大图像)

JSON 数据转换

Conductor 现在支持基于 JSONPath 的数据转换。在输入配置中使用 JSON Path 就能让任务进行复杂的数据转换了,这样就减少了编写另行进行数据转换的一性次任务。

https://netflix.github.io/conductor/metadata/#wiring-inputs-and-outputs

推进计划

虽然忙了一个季度,但我们仍然没有完成。展望第二个季度,我们的关注点是让开发人员更容易测试流程,以及支持把任务执行时的上下文记录到日志中,以帮助理解和检修跨多个工作者和应用的流程。

如果你乐于接受构建分布式系统的挑战,并有兴趣构建 Netflix 工作室生态系统和大规模的内容管道,可以了解一下我们的职位空缺

本文首发于 Netflix ,经网站授权由 InfoQ 翻译为中文版分享给中文读者。

2017-05-10 17:588840

评论

发布
暂无评论
发现更多内容

数据有了,如何构建数据资产?

百度开发者中心

大数据

项目管理实战

王丰

项目管理

还不会用 GitHub Actions ?看看这篇

冴羽

JavaScript GitHub 前端 Github Action Github Actions

住院理赔难?区块链技术实现“住院即报案 出院即赔付”

CECBC

商家要的是增收:用AI来做营销

石云升

28天写作 12月日更

最好用的 5 款 React 富文本编辑器

蒋川

React 富文本编辑器

技术教程 | 在线 KTV 实现过程(内附demo体验)

ZEGO即构

Java 音视频 在线KTV实现教程

KubeCube 用户管理与身份认证

网易数帆

GitHub Kubernetes JWT Oauth kube

百万人都在求的网络安全学习路线,渗透漏洞防御总结(附图)

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞扫描

工具 | 常用 MySQL 内核 Debug 技巧

RadonDB

MySQL 数据库 RadonDB

CSS之选择器(九):valid和:invalid

Augus

CSS 12月日更

FlyFish 2.0已发布,大屏开发应用更加灵活便捷

云智慧AIOps社区

JavaScript 前端 大前端 数据可视化

「Oracle」客户端 PL/SQL DEVELOPER 安装使用

恒生LIGHT云社区

oracle sql

架构实战营:模块二作业

Geek_93ffb0

「架构实战营」

制造业现场管理的核心问题和痛点有哪些?如何解决?

优秀

制造业 现场管理

DotNetCore开发工具箱之图片处理小能手——SixLabors.ImageSharp

为自己带盐

dotnet 28天写作 12月日更 sixlabors

【量化】实战恒有数获取指数定投的数据源

恒生LIGHT云社区

金融科技 量化投资 量化

只需一步,轻松用Python实现线性规划

Java全栈架构师

Python 数据库 程序员 面试 线性规划

Python之异步编程

Java全栈架构师

Python 数据库 程序员 面试 程序人生

从场景中来,到用户中去 vivo用技术打造开放生态

ToB行业头条

Prometheus Exporter (二十九)Redis Exporter

耳东@Erdong

redis Prometheus 28天写作 exporter 12月日更

React 任务调度

贝壳大前端技术团队

前端 React

做时间的朋友:荣耀X系列与英雄梦想

脑极体

数字人民币即将在“农村”推广和试点!

CECBC

【分布式技术专题】「OSS中间件系列」Minio的文件服务的存储模型及整合Java客户端访问的实战指南

洛神灬殇

OSS Minio 集群 minio client 12月日更 MINO

XTransfer技术部门福利一览:判断一家公司能不能待,就看这3点

XTransfer技术

福利 求职 招聘 跨境支付

30万人追更,年度重磅Go图书出版,百万流量博主带你学习Go底层原理

图灵教育

编程 Go 语言

MySQL 从入门到入魔 (02)

海拥(haiyong.site)

28天写作 12月日更

恒源云(GPUSHARE)_Y-Tuning: 通过对标签表征进行微调的深度学习新范式【ACL 2022】

恒源云

人工智能 深度学习 算法

Android C++系列:Linux常用函数和工具

轻口味

28天写作 12月日更

ExoPlayer 重写 OpusReader思路

Changing Lin

12月日更

Netflix Conductor:流程的反转控制_语言 & 开发_Viren Baraiya_InfoQ精选文章