Когда использовать Gen_Server в приложениях Erlang/OTP
Вопрос
Прочитав книгу Джо Армстронга и посмотрев экраны Кевина Смита, я построил простое приложение OTP, состоящее из одного Gen_Server и одиночного руководителя, объединенного в качестве приложения OTP.
Теперь я смотрю на MochiWeb и создал образец проекта [HelloWorld], используя скрипт new_mochiweb.erl. Просмотр исходного кода, который я вижу просто стандартные модули Erlang.
У меня сложилось впечатление, что использование Gen_Server было рекомендуемым способом при создании компонентов приложения OTP. Почему MochiWeb использует приложение OTP и поведение супервизора, но избегает Gen_Server?
Решение
Существует gen_server, называемый mochiweb_socket_server. Сгенерированные модули представляют собой только «модули обратного вызова», чтобы Gen_Server был вызван при получении входящего запроса.
Другие советы
Вы используете OTP/Gen_Servers для процессов, которые находятся в рамках стратегии перезапуска - это перезапуск их под вашим контролем.
Это не относится к процессам, представляющим соединения с веб -браузерами. Если этот процесс умирает, для сервера нет возможности перезапустить его - поэтому запуск его под OTP бессмысленен.
MochiWeb (и YAWS) оба используют Gen_Servers для привязки к порту прослушивания, а затем порождают неконтролируемый процесс для обработки нового соединения.