主要出于教育目的,我正在尝试编写任务(任务是 open_port({spawn_executable, Command}))调度程序。
我最终得到了像这样的树
supervisor
| |
scheduler receiver
gen_event gen_event
|
supervisor
|
dispatcher
gen_server
|
supervisor
| | |
task1 ... taskN
换句话说:
- 最高主管启动调度程序和接收器并确保它们处于活动状态
- 接收器启动中间主管
- 中级主管启动调度程序并确保它处于活动状态
- 调度员启动底层主管
底层主管根据请求启动任务,并确保在出现错误时重新启动它们
在任何时候调度程序都准备好接受一个带有时间戳的任务,它应该在
- 当时间戳满足时,它会通知一些 event_manager
- 然后接收者由同一个事件管理器通知,并通过中间主管将消息传递给调度程序
- dispatcher 有一些业务逻辑,这就是为什么它不是无状态的,例如某些任务不能同时执行
- 当满足所有条件时,调度程序将任务传递给底层主管,确保任务执行,直到获得正常退出或绕过某些阈值
- 底部主管返回一条消息,然后向上向上传递给某个事件管理器
- 调度程序最终收到此消息,从其队列中删除任务或重新入队或其他
问题是:
- 我的行为正确吗?
- 结构是不是太复杂了?(但是,将来该系统将变得分布式。)
- 有没有办法将receiver+middle supervisor和dispatcher+bottom supervisor组合成两个模块,而不是四个同时实现4个行为?
- 或者有没有办法将receiver+dispatcher+bottom supervisor组合在一个模块中,省去中间supervisor,同时实现gen_event+gen_server+supervisor行为?
- 我是否错误地将行为视为 OO 语言中的接口或多重继承?(这让我提出问题 3 和 4。)
提前致谢。
PS IMO,一方面结构过于复杂;另一方面,这样的结构让我可以将它的任何块分发(例如,多个调度器到一个接收器,一个调度器到多个接收器,许多调度器到多个接收器,每个接收器有多个调度器,甚至每个调度器有多个底层监督器- 每一层都有自己的监督策略)。复杂性和可扩展性之间的平衡点在哪里?