Когда использовать gen_server в приложениях Erlang/OTP

Прочитав книгу Джо Армстронга и просмотрев скриншоты Кевина Смита, я создал простое OTP-приложение, состоящее из одного gen_server и одного супервизора, связанных вместе как OTP-приложение.

Сейчас я смотрю на mochiweb и создал пример проекта [helloworld], используя скрипт new_mochiweb.erl. Просматривая исходный код, я вижу, что он не отличается от моего примера приложения OTP [приложение OTP есть, там есть супервизор] с одним ключевым отличием: сгенерированные файлы helloworld.erl и helloworld_web.erl не реализуют поведение gen_server, они это просто стандартные модули Erlang.

У меня сложилось впечатление, что использование gen_server было рекомендованным способом при создании компонентов приложения OTP. Почему mochiweb может использовать OTP-приложения и поведение супервизора, а не gen_server?

2 ответа

Решение

Существует gen_server, называемый mochiweb_socket_server. Сгенерированные модули являются только "модулями обратного вызова" для gen_server, который вызывается при получении входящего запроса.

Вы используете OTP/gen_servers для процессов, которые находятся под стратегией перезапуска - то есть перезапуск из них находится под вашим контролем.

Это не относится к процессам, представляющим подключения к веб-браузерам. Если этот процесс умирает, сервер не может его перезапустить - поэтому запускать его под OTP бессмысленно.

Mochiweb (и Yaws) оба используют gen_servers для привязки к порту прослушивания, а затем запускают неконтролируемый процесс для обработки нового соединения.

Другие вопросы по тегам