Erlang:我应该以编写任务调度器来结束什么监督树?
主要出于教育目的,我正在尝试编写一个任务(任务是一个开放的_端口({spawn_executable,Command}))调度器 我的结局就像那棵树一样Erlang:我应该以编写任务调度器来结束什么监督树?,erlang,task,behavior,scheduler,erlang-supervisor,Erlang,Task,Behavior,Scheduler,Erlang Supervisor,主要出于教育目的,我正在尝试编写一个任务(任务是一个开放的_端口({spawn_executable,Command}))调度器 我的结局就像那棵树一样 supervisor | | scheduler receiver gen_event gen_event | supervisor |
supervisor
| |
scheduler receiver
gen_event gen_event
|
supervisor
|
dispatcher
gen_server
|
supervisor
| | |
task1 ... taskN
换言之:
一方面,结构过于复杂;另一方面,这种结构允许我将其任何块分布(例如,多个调度器分配给一个接收器,一个调度器分配给多个接收器,多个调度器分配给多个接收器,每个接收器分配给多个调度器,甚至每个调度器分配给多个底层管理器-每一层都有自己的管理策略)。复杂性和可扩展性之间的平衡点在哪里 我的建议是简化您的设计,更像:
supervisor
| |
dispatcher |
+scheduler |
|
supervisor
| | |
task1 ... taskN
如果有一个单独的调度器将事件发送给一个启动任务的调度器,那么即使是根据分布情况,也不会有太大的好处
调度器调度器可以非常简单地在计时器模块的帮助下完成,并且可以是gen_服务器。计时器可以发送您可以在handle_info回调中处理的消息,也可以调用gen_服务器的api函数
您还可以使用超时功能在下一个间隔后唤醒gen_服务器,这将更加简单,因为您不必担心在添加新“任务”时取消计时器
然后,调度器/调度器调用supervisor:start\u child
添加工作任务
可以轻松添加分发:调度器/调度器可以位于与二级主管不同的单独节点上。任务启动功能可以进一步分配,也可以使用模块进行负载平衡
要回答您的五个问题:
即使使用我建议的简单结构,也有很大的灵活性(Erlang为您带来的),因为如果您想要有多个调度器,您可以使用rpc调用管理器。您可以使用自动平衡任务的负载分布。调度器部分可以很容易地从调度器中分离出来(都在顶级主管的领导下),您可以从调度器中分离出更多的公共状态。我的建议是简化您的设计,更像:
supervisor
| |
dispatcher |
+scheduler |
|
supervisor
| | |
task1 ... taskN
如果有一个单独的调度器将事件发送给一个启动任务的调度器,那么即使是根据分布情况,也不会有太大的好处
调度器调度器可以非常简单地在计时器模块的帮助下完成,并且可以是gen_服务器。计时器可以发送您可以在handle_info回调中处理的消息,也可以调用gen_服务器的api函数
您还可以使用超时功能在下一个间隔后唤醒gen_服务器,这将更加简单,因为您不必担心在添加新“任务”时取消计时器
然后,调度器/调度器调用supervisor:start\u child
添加工作任务
可以轻松添加分发:调度器/调度器可以位于与二级主管不同的单独节点上。任务启动功能可以进一步分配,并可能使用模块进行负载平衡