Я бы посоветовал упростить ваш дизайн, например:
supervisor
| |
dispatcher |
+scheduler |
|
supervisor
| | |
task1 ... taskN
Нет особой выгоды от того, что отдельный планировщик отправляет события диспетчеру, который запускает задачи и т. Д. Даже в светеdistribution.
Диспетчер-планировщик, вероятно, может быть довольно просто выполнен с помощью модуля таймера и может быть gen_server.Таймер может отправлять сообщения, которые вы можете обработать в обратном вызове handle_info, или вызывать функции API вашего gen_server.
Вы также можете использовать функцию тайм-аута, чтобы разбудить gen_server после следующего интервала, который будет еще прощене нужно беспокоиться об отмене таймеров при добавлении новой «задачи».
Диспетчер / планировщик затем вызывает supervisor:start_child
для добавления рабочих задач.
Распределение можно легко добавить:Диспетчер / планировщик может находиться на отдельном узле, чем диспетчер второго уровня.Функция запуска задач может распространяться дальше и, возможно, с помощью модуля pool для балансировки нагрузки.
Чтобы ответить на ваши пять вопросов:
Я подозреваю васиспользуют gen_event там, где он не нужен, но поскольку сами модули не нужны, его легко исправить, удалив их.gen_event - если вы хотите иметь возможность зарегистрировать много обработчиков на одном источнике событий, вы используете его 1: 1.Деревья наблюдения обычно строятся так, что супервизоры являются прямыми дочерними элементами других супервизоров.
Да, это слишком сложно, выглядит так, как если бы вы делали это на ОО-языках с меньшей выразительной силой.И просто для подготовки к возможному распространению его не нужно.Рефакторинг на функциональном языке, таком как Erlang, намного проще, чем вы думаете.Так что начните с простой и разделенной функциональности, если увидите необходимость.
3 + 4.Смотрите мое совершенно другое предложение.
- Это не так, как OO.Поведения в OTP - это только модули обратного вызова, скрывающие механику процесса в универсальном модуле.
Даже с простой структурой, которую я предложил, есть большая гибкость (предоставленная вам Эрлангом), потому что если вы хотите иметьнесколько планировщиков, вы можете просто использовать rpc для вызова супервизора.Вы можете использовать pool для автоматического распределения нагрузки по распределению задач.А диспетчерская часть может быть легко отделена от планировщика (тогда и под супервизором верхнего уровня), и вы можете иметь более общее состояние, отделенное от планировщика.