Quando usar o Gen_Server em aplicativos Erlang/OTP
Pergunta
Depois de ler o livro de Joe Armstrong e assistir Kevin Smith Screencasts, criei um aplicativo OTP simples composto por um único Gen_Server e supervisor único, reunidos como um aplicativo OTP.
Agora estou olhando para Mochiweb e criei um projeto de amostra [Helloworld] usando o script new_mochiweb.erl. Navegando pelo código -fonte que vejo que não é diferente do meu aplicativo OTP de amostra [o aplicativo OTP está lá, o supervisor está lá] com uma diferença importante. Os arquivos gerados helloworld.erl e helloworld_web.erl não implementam o comportamento gen_server, eles, eles são apenas módulos Erlang padrão.
Eu estava com a impressão de que o uso do Gen_Server era o caminho recomendado ao criar componentes de aplicativos OTP. Por que o Mochiweb pode usar comportamentos de aplicativos e supervisores OTP, mas evitar o Gen_Server?
Solução
Existe um gen_server, chamado mochiweb_socket_server. Os módulos gerados são apenas "módulos de retorno de chamada" para que o Gen_Server seja chamado ao receber uma solicitação recebida.
Outras dicas
Você usa OTP/Gen_Servers para processos que estão sob uma estratégia de reinicialização - Isso é o reinício deles está sob seu controle.
Esse não é o caso dos processos que representam conexões com os navegadores da Web. Se esse processo morrer, não há como o servidor reiniciá -lo - portanto, executá -lo no OTP é inútil.
O Mochiweb (e as guinadas) usam Gen_Servers para se ligar à porta de escuta e, em seguida, gerar um processo não supervisionado para lidar com uma nova conexão.