Cuándo usar gen_server en aplicaciones Erlang/OTP
Pregunta
Después de leer el libro de Joe Armstrong y ver los screencasts de Kevin Smith, creé una aplicación OTP simple compuesta por un único gen_server y un único supervisor, agrupados como una aplicación OTP.
Ahora estoy mirando mochiweb y he creado un proyecto de muestra [helloworld] usando el script new_mochiweb.erl.Al examinar el código fuente, veo que no es diferente de mi aplicación OTP de muestra [la aplicación OTP está allí, el supervisor está allí] con una diferencia clave...Los archivos helloworld.erl y helloworld_web.erl generados no implementan el comportamiento gen_server, son solo módulos estándar de Erlang.
Tenía la impresión de que usar gen_server era el camino recomendado a seguir al crear componentes de aplicaciones OTP.¿Por qué mochiweb podría utilizar la aplicación OTP y comportamientos de supervisor pero evitar gen_server?
Solución
Hay un gen_server, llamado mochiweb_socket_server.Los módulos generados son sólo "módulos de devolución de llamada" para que se llame al gen_server al recibir una solicitud entrante.
Otros consejos
Se utiliza OTP / gen_servers para los procesos que se encuentran bajo una estrategia de reinicio -. es la reanudación de ellos está en su control
Ese no es el caso con los procesos que representan las conexiones a los navegadores web. Si ese proceso muere no hay manera para que el servidor se reinicie ella -. Por lo tanto, se ejecuta bajo OTP es inútil
Mochiweb (y frambesia) ambos gen_servers uso de unirse al puerto de escucha y luego desovar un proceso sin supervisión para manejar una nueva conexión.