ShiningRush / fastflow

A lightweight, high-performance distributed workflow framework
MIT License
348 stars 80 forks source link

多机执行时,报action not found: #44

Closed chenxushao closed 11 months ago

chenxushao commented 12 months ago

你好,多机时,会报action not found:。 翻看了源代码,ActionMap 是定义的一个全局变量。 var ( ActionMap = map[string]run.Action{}

defExc       Executor
defStore     Store
defKeeper    Keeper
defParser    Parser
defCommander Commander

)

Action 的注册,是将 Action 放到这个 Map 中,相当于数据是存储在本机内存中。 在程序中,我是这么注册Action 的。

// 注册 action fastflow.RegisterAction(actions)

那么,如果是多机执行,这个 Dag 被调度到另外一台机器时,另外一台机器的内在中(邓全局的ActionMap)显然就没有相关的 Dag 数据。 目前,在多机情况下,能够稳定复现action not found:。不知道是不是我自己还有别的点没有考虑到。

诚盼解惑。

chenxushao commented 12 months ago

单机则没有问题

ShiningRush commented 12 months ago

多机部署为什么会出现另外的机器没有Action的情况呢,部署的代码应该都是同一套吧

chenxushao commented 12 months ago

注册 Action 是注册在内在中的 ActionMap中。 有没有可能调度在另一台机器去跑呢?

chenxushao commented 12 months ago

多机部署为什么会出现另外的机器没有Action的情况呢,部署的代码应该都是同一套吧

你好。是同一套代码。

func (e DefExecutor) runAction(taskIns entity.TaskInstance) error { act := ActionMap[taskIns.ActionName] if act == nil { return fmt.Errorf("action not found: %s", taskIns.ActionName) }

主要是这块报错了。

我看文档上写,leader 会分发任务给 worker。假如这个 reginsterAction 是在另外机器执行的,但是执行却到另一个 worker,是不是会出现这种情况,因为 action 的存储不是集中存储的。

不知道是不是我没理解?

chenxushao commented 12 months ago

多机部署为什么会出现另外的机器没有Action的情况呢,部署的代码应该都是同一套吧

你好。是同一套代码。

func (e DefExecutor) runAction(taskIns entity.TaskInstance) error { act := ActionMap[taskIns.ActionName] if act == nil { return fmt.Errorf("action not found: %s", taskIns.ActionName) }

主要是这块报错了。

我看文档上写,leader 会分发任务给 worker。假如这个 reginsterAction 是在另外机器执行的,但是执行却到另一个 worker,是不是会出现这种情况,因为 action 的存储不是集中存储的。

不知道是不是我没理解?

我看框架的实现里,注册 action,只是将 action 放在内存中的 Map 里。 // RegisterAction you need register all used action to it func RegisterAction(acts []run.Action) { for i := range acts { mod.ActionMap[acts[i].Name()] = acts[i] } }

chenxushao commented 12 months ago

另外还有一个问题,workKey,在多机场景下,必须每台机器不一样是吗?

ShiningRush commented 11 months ago

另外还有一个问题,workKey,在多机场景下,必须每台机器不一样是吗?

对的,一般建议使用k8s的StatefulSet来部署workflow,每个pod的序号都是不同的,可以参考#31

ShiningRush commented 11 months ago

多机部署为什么会出现另外的机器没有Action的情况呢,部署的代码应该都是同一套吧

你好。是同一套代码。

func (e DefExecutor) runAction(taskIns entity.TaskInstance) error { act := ActionMap[taskIns.ActionName] if act == nil { return fmt.Errorf("action not found: %s", taskIns.ActionName) }

主要是这块报错了。

我看文档上写,leader 会分发任务给 worker。假如这个 reginsterAction 是在另外机器执行的,但是执行却到另一个 worker,是不是会出现这种情况,因为 action 的存储不是集中存储的。

不知道是不是我没理解?

你理解的没错,Action是在内存里面的,但是一般情况下master和worker都是使用同一套代码编译出来的二进制,如果它们使用了不同的代码编译而来就会出现你描述的问题。

Fastflow的Action是具体的代码块,因此它只能存在代码中(我们也可以使用 go plugin 来实现插件化,但是现在尚未支持)