Quand utiliser gen_server dans les applications Erlang/OTP
Question
Après avoir lu le livre de Joe Armstrong et regardé les screencasts de Kevin Smith, j'ai construit une application OTP simple composée d'un seul gen_server et d'un seul superviseur, regroupés sous forme d'application OTP.
Maintenant, je regarde mochiweb et j'ai créé un exemple de projet [helloworld] en utilisant le script new_mochiweb.erl.En parcourant le code source, je vois que ce n'est pas différent de mon exemple d'application OTP [l'application OTP est là, le superviseur est là] avec une différence clé ..les fichiers helloworld.erl et helloworld_web.erl générés n'implémentent pas le comportement gen_server, ce sont simplement des modules Erlang standard.
J'avais l'impression que l'utilisation de gen_server était la méthode recommandée lors de la création de composants d'application OTP.Pourquoi mochiweb pourrait-il utiliser les comportements d'application et de superviseur OTP mais éviter gen_server ?
La solution
Il existe un gen_server, appelé mochiweb_socket_server.Les modules générés ne sont que des "modules de rappel" pour que le gen_server soit appelé lors de la réception d'une requête entrante.
Autres conseils
Vous utilisez OTP / gen_servers pour les processus qui sont dans une stratégie de redémarrage -. qui est le redémarrage d'entre eux est dans votre contrôle
Ce n'est pas le cas avec les processus représentant les connexions aux navigateurs Web. Si ce processus meurt, il n'y a aucun moyen pour le serveur pour le redémarrer -. Fonctionner donc sous OTP est inutile
Mochiweb (et pian) utilisent tous deux gen_servers à se lier au port d'écoute, puis frayer un processus non supervisé pour traiter une nouvelle connexion.