首页 > 其他分享 >一个Netflix开发的微服务编排引擎,支持可视化工作流定义

一个Netflix开发的微服务编排引擎,支持可视化工作流定义

时间:2023-01-21 10:31:08浏览次数:47  
标签:name Conductor Netflix 流程 worker 任务 工作 编排 可视化

Netflix内容平台工程团队支撑了许多业务,这些业务流程由微服务任务异步驱动的。其中一些任务是持续数天的长期进程。这些进程在为全球观众提供字幕方面发挥着至关重要的作用。

比如:

  • Studio合作伙伴内容集成
  • 来自合作伙伴的基于IMF的内容集成
  • 在Netflix中设置新标题
  • 接收内容,编码和部署到CDN

传统做法中,这些进程是临时编排的,使用pub/sub 组合起来,直接进行REST调用,并使用数据库来管理状态。然而,随着微服务数量和流程复杂性的增加,如果没有中央协调器,就无法了解这些分布式工作流(workflow)。

我们将Conductor“作为编排引擎”构建,以满足以下需求,在应用程序中消除了模板,并提供反应流:

  • 使用基于JSON DSL 的蓝图定义执行流程。
  • 跟踪和管理工作流。
  • 能够暂停,恢复和重新启动进程。
  • 用户界面可视化处理流程。
  • 能够在需要时同步处理所有任务。
  • 能够扩展到数百万个并发运行的流程。
  • 由客户端提取出来的的队列服务支持。
  • 能够通过HTTP或其他方式操作,例如GRPC。

Conductor旨在满足上述需求,现在已在Netflix使用了将近一年。迄今为止,它调度超过260万个工作流,从简单的线性工作流到运行多天的非常复杂的动态工作流。

如今Conductor已经开源,我们希望Conductor可以服务于有类似需求的场景,并提升其能力。你可以在此处找到Conductor的开发人员文档。

为什么不进行点对点编排?

随着业务需求和复杂性的增长,使用点对点任务编排会难以扩展。发布/订阅模型适用于最简单的流程,也有一些问题:

  • 流程分散在多个应用程序的代码中
  • 通常围绕输入/输出,SLA等存在紧密耦合和假设,PUB/SUB难以适应不断变化的需求
  • 几乎没有办法系统地回答“设置电影还有什么没完成”?

为什么是微服务?

在微服务领域,许多业务流程自动化都是通过协调服务来实现的。Conductor支持跨服务的协调,同时提供交互式控制和可视性。能够跨进行微服务协调,有助于我们利用现有服务构建新流程或更新现有流程,从而非常快速地普及Conductor。

架构总览

一个Netflix开发的微服务编排引擎,支持可视化工作流定义_UI

引擎的核心是状态机服务,即Decider服务。当工作流事件发生时(例如任务完成,失败等),Decider将工作流蓝图与工作流的当前状态相匹配,识别下一个状态,并安排适当的任务,或更新工作流的状态。

Decider与分布式队列一起使用来管理计划任务。我们使用dyno-queues作为分布式延迟队列,dyno-queues使用dynomite作为K-V存储。该队列已于今年早些时候开源,欲知详情请看这里。

Task Worker实现

task由worker应用程序实现,其通过API层进行通信。woker实现了可由流程引擎调用的REST接口,或者通过定期检查挂起任务的状态来达到此目的。Worker实际上是幂等的无状态函数。轮询模型允许处理worker的压力,并在可能的情况下根据队列深度支持自动伸缩。Conductor提供API以检查worker的工作负载大小。

一个Netflix开发的微服务编排引擎,支持可视化工作流定义_UI_02

API层

API通过HTTP公开 - 使用HTTP可以轻松地与不同客户端集成。添加其他协议(例如gRPC)也是很简单的。

存储

我们使用Dynomite作为存储引擎,并使用Elasticsearch来索引执行流程。存储API是可插拔的,可以适用于各种存储系统,包括传统的RDBMS或Apache Cassandra。

关键概念

工作流定义

使用基于JSON的DSL定义工作流。工作流蓝图定义了一系列需要执行的任务。每个任务是控制任务(例如,fork,join,决策,子工作流等)或worker任务(译者注:提供具体的数据处理功能)。工作流定义支持版本,可以灵活地管理升级和迁移。

工作流定义概述:

{"name": "workflow_name","deion": "Deion of workflow","version": 1,"tasks": [{"name": "name_of_task","taskReferenceName": "ref_name_unique_within_blueprint","inputParameters": {"movieId": "${workflow.input.movieId}","url": "${workflow.input.fileLocation}"},"type": "SIMPLE",... (any other task specific parameters)},{}...],"outputParameters": {"encoded_url": "${encode.output.location}"}}

任务定义

每个任务的行为都由其模板控制。任务定义为每个任务提供控制参数,例如超时,重试策略等。任务既可以是由应用程序实现的worker任务,也可以是由编排服务执行的系统任务。Conductor提供一些开箱即用的系统任务,例如Decision,Fork,Join,Sub Workflows,并且允许加入自定义系统任务的SPI。我们已经添加了对HTTP任务的支持,这有助于调用REST服务。

任务定义:

{"name": "encode_task","retryCount": 3,"timeoutSeconds": 1200,"inputKeys": ["sourceRequestId","qcElementType"],"outputKeys": ["state","skipped","result"],"timeoutPolicy": "TIME_OUT_WF","retryLogic": "FIXED","retryDelaySeconds": 600,"responseTimeoutSeconds": 3600}

输入输出

任务的输入是一种映射,其作为工作流实例化的一部分或某些其他任务的输出。允许将来自工作流或其他任务的输入/输出作为随后执行的任务的输入。例如,可以将编码任务的输出作为输入提供给发布任务以部署到CDN。

任务输入定义:

{"name": "name_of_task","taskReferenceName": "ref_name_unique_within_blueprint","inputParameters": {"movieId": "${workflow.input.movieId}","url": "${workflow.input.fileLocation}"},"type": "SIMPLE"}

具体例子

一个Netflix开发的微服务编排引擎,支持可视化工作流定义_API_03

这里总共有3个worker任务和一个控制任务:

  • 内容检查:检查输入文件是否正确/完整
  • 编码:生成视频编码
  • 发布:发布到CDN

这三个任务由不同的worker实现,这些worker使用任务API轮询待处理的任务。这些任务是幂等任务,worker根据给予任务的输入进行操作,执行处理流程并更新状态。

在完成每个任务时,Decider会根据蓝图(对应于工作流实例的版本)评估工作流实例的状态,并标识要调度的下一组任务,或者在完成所有任务后标记工作流为完成。

UI

UI是监视和排除工作流程执行故障的主要手段。通过基于各种参数(包括输入/输出参数)的搜索,UI实现了处理流程的可视化,并提供蓝图和其采取的执行路径的可视化表示,以更好地理解流程执行的过程。对于每个工作流实例,UI提供每个任务执行的详细信息,并提供以下详细信息:

  • 任务调度的时间戳,worker接收并完成任务的时间戳。
  • 如果任务失败,失败的原因是什么。
  • 重试次数
  • 执行任务的主机。
  • 任务的输入和输出。

以下是UI展示:

一个Netflix开发的微服务编排引擎,支持可视化工作流定义_UI_04

其他方案AMAZON SWF

早期我们使用过AWS SWF。然而考虑到SWF的一些限制,我们选择构建Conductor:

  • 需要基于蓝图的编排,而不是SWF要求的编程决策。
  • 用于工作流的可视化UI。
  • 更需要同步API(而不是纯粹基于消息的方式)
  • 需要为工作流和任务索引输入和输出,以及基于此索引的搜索工作流的能力。
  • 需要维护一个单独的数据存储来保存工作流事件以从故障,搜索等中恢复。

Amazon Step Function

最近宣布的AWS Step Functions添加了一些我们在编排引擎中需要的功能。Conductor有可能采用states语言(译者注:这也是一种基于Json的用于描述状态机的语言)来定义工作流程。

统计数据

以下是我们一年多来在生产环境运行Conductor的统计数据。内容平台工程中使用这些工作流来支持内容获取和编码等工作。

未来功能

  • 支持AWS Lambda(或类似)功能,作为serverless 任务。
  • 与容器编排框架更紧密的集成,允许worker实例自动扩展。
  • 记录每个任务的执行数据,有助于故障排除。
  • 能够从UI创建和管理工作流蓝图。
  • 支持states语言。

标签:name,Conductor,Netflix,流程,worker,任务,工作,编排,可视化
From: https://blog.51cto.com/u_15867943/6021086

相关文章

  • Redis 官方可视化工具
    转载:blog.csdn.net/weixin_46902396/article/details/120807629RedisInsight是一个直观高效的RedisGUI管理工具,它可以对Redis的内存、连接数、命中率以及正常运行时......
  • Cesium + mapv 可视化
    最近将mapv一些官方示例移植到了Cesium上,记录一下问题mapv示例:mapv(baidu.com)mapv本身没有提供类型定义文件,直接通过npm下载的mapv库也只有build好的文件,故......
  • 可视化VIT中的注意力
    2022年,VisionTransformer(ViT)成为卷积神经网络(cnn)的有力竞争对手,卷积神经网络目前是计算机视觉领域的最先进技术,广泛应用于许多图像识别应用。在计算效率和精度方面,V......
  • 开源数据可视化工具对比:PowerBI VS. DataEase
    最近项目实施过程中,用户提到领导希望可以有什么可视化的大屏把一些数据展示出来,以便于进行分析。因此,利用业余时间研究了一下两款可视化工具:PowerBI与DataEase。两款工具可......
  • 图扑智慧充电桩可视化运营平台|新能源数字化
    前言电动汽车产业在新能源背景下蓄势勃发,已经成为当下广泛流行、节能环保的绿色出行交通工具。随着特斯拉、宝马、蔚来等众多新能源汽车企业的纷纷布局,市场主体多元化对充......
  • c++生成csv文件并在python界面可视化
    前景概要为什么生成的是csv文件而不是txt文件因为txt在python那边处理起来比较麻烦需要两组数而数与数之间存在对应关系这样两组数同样需要两组就是两组xy数值然后......
  • 数字孪生三维可视化场景搭建如何搭建?
    数字孪生不仅是物理世界的镜像,还需接受物理世界的实时信息,反过来实时驱动物理世界,进化为物理世界的先知、先觉甚至超体。这个演变过程被称为成熟进化,即数字孪生体的生长发......
  • Prometheus笔记-Grafana可视化
    Grafana官网下载Grafana[root@VM-24-9-centosPrometheus_server]#wgethttps://dl.grafana.com/oss/release/grafana-9.3.2.linux-amd64.tar.gz安装Grafana[root@VM......
  • BI 可视化工具不只有视图,还有报表
    前言:对于市面上常见的BI可视化工具而言,如FineBI、观远BI、SmartBI、DataEase等,它们所提供的功能并不仅仅是局限于柱状图、折线图、地图、饼图、散点图、热力图等视图。......
  • FaaS任务编排
    在Serverless的领域中,通过某种方式来协调各个服务和函数的执行,使得我们在享受高弹性、低成本的同时,也降低业务处理上的复杂度呢?这种能力的确存在,业界普遍称之为“工作流(S......