主に教育目的で、タスクを作成しようとしています (タスクは open_port({spawn_executable, Command})) スケジューラです。
私は次のような木になってしまいます
supervisor
| |
scheduler receiver
gen_event gen_event
|
supervisor
|
dispatcher
gen_server
|
supervisor
| | |
task1 ... taskN
言い換えると:
- トップスーパーバイザーはスケジューラーとレシーバーを開始し、それらが有効であることを確認します
- レシーバーは中間スーパーバイザーを開始します
- 中間スーパーバイザーがディスパッチャーを開始し、それが有効であることを確認します
- ディスパッチャが下部スーパーバイザを開始
最下層のスーパーバイザーは、要求に応じてタスクを開始し、エラーが発生した場合にタスクが再開されるようにします
スケジューラーはいつでも、実行されるべきタイムスタンプを持つタスクを受け入れる準備ができています
- タイムスタンプが満たされると、いくつかの event_manager に通知します
- レシーバーは同じイベント マネージャーから通知を受け、中間スーパーバイザーを介してメッセージをディスパッチャーに渡します。
- ディスパッチャーには、ステートレスではないビジネス ロジックがあります。たとえば、ある種のタスクを同時に実行することはできません。
- すべての条件が満たされると、ディスパッチャーはタスクを下部のスーパーバイザーに渡します。これにより、通常の終了が得られるか、いくつかのしきい値がバイパスされるまで、タスクが確実に実行されます
- 一番下のスーパーバイザーがメッセージを返し、それがイベント マネージャーに上から下に渡されます
- スケジューラは最終的にこのメッセージを受け取り、タスクをキューから削除するか、キューに再登録します。
質問は次のとおりです。
- ビヘイビアーを正しく使用していますか?
- 構造が複雑すぎませんか?(ただし、将来的にはシステムは分散化される予定です。)
- 同時に4つの動作を実装する4つの代わりに、レシーバー+ミドルスーパーバイザーとディスパッチャー+ボトムスーパーバイザーを2つのモジュールに組み合わせる方法はありますか?
- または、レシーバー + ディスパッチャー + ボトム スーパーバイザーを 1 つのモジュールに組み合わせて、中間スーパーバイザーの必要性をなくし、gen_event + gen_server + スーパーバイザーの動作を同時に実装する方法はありますか?
- OO 言語のインターフェイスまたは多重継承としての振る舞いを間違って考えているのでしょうか? (それで私は質問 3 と 4 を尋ねます。)
前もって感謝します。
PS IMO、一方で、構造が複雑すぎます。一方、このような構造では、そのブロックを分散させることができます (たとえば、多くのスケジューラーを 1 つのレシーバーに、1 つのスケジューラーを多くのレシーバーに、多くのスケジューラーを多くのレシーバーに、多くのディスパッチャーを各レシーバーに、さらに多くのボトム スーパーバイザーを各ディスパッチャーに)。 - 独自の監督ポリシーを持つすべてのレイヤー)。複雑さと拡張性のバランス ポイントはどこにありますか?