跳到主要内容

自定义执行器

概述

Rill Flow大部分执行操作被封装在执行器中,在实践中,我们会根据待执行的实际执行功能使用python、java或go语言实现执行器http接口协议,接收并处理任务(也可以通过派发器扩展点扩展其他派发协议)。

invoke executor

执行器与ResourceName

在定义任务时,任务可以通过ResourceName字段绑定到不同的派发和执行器,一个典型的ResourceName类似:

http://sample-service/do_something

ResourceName的设计借鉴了URI的设计规范,在上面的例子里,http约定了派发器的名称,sample-service对应着部署的单元,do_somethin对应具体功能,调用相关的参数使用body传递。

如果你实现了自己的派发器,比如基于motan框架派发RPC请求,那么ResourceName可能会变成这样:

motan://group_name/service_name

在实践中,也可以完全将ResourceName等同于HTTP协议,将Executor作为一个HTTP服务器进行开发和部署。

微服务执行器

在Rill Flow的设计中,执行器被尽可能设计成与Rill Flow的编排组件解耦的通用组件,两者之间仅通过派发和回调协议进行交互。我们没有直接引入“万能执行器”,而是仅约定了派发器-执行器间的协议。

在实践中,不同的任务可能会涉及到不同的语言、框架和执行环境,我们希望通过引入通用的执行器协议(而不是执行器实现),业务方可以更专注于使用合适的技术栈实现业务逻辑,将不同类型的任务拆分到不同的执行器实现,并通过K8S、Service Mesh或Serverless技术进行服务服务的部署和发现,从而降低“单体执行器”带来的复杂度增长和灵活性方面的约束。

“万能执行器”

如果业务场景较为单一(或者偏好单体服务),也可以将所有逻辑全部封装到一个执行器中,此时Rill Flow的整体架构类似于master-worker模式,编排任务时可以通过改变ResourceNameparameters中的参数使得同一个执行器可以执行不同的逻辑。