2016-12-20 3 views

Répondre

4

Si vous voulez que les processus de rappel Websocket de Yaws connaissent d'autres processus de ce type, vous devrez créer vous-même une sorte de registre. Les processus de websocket du pian ne sont pas enregistrés parce que le pian n'a pas besoin de les trouver; chacun est associé à une socket, et l'activité sur leurs supports respectifs est la façon dont leurs messages leur parviennent. Une façon d'implémenter un tel registre serait d'avoir la fonction init du module callback websocket appeler erlang:register/2, mais cette approche souffre du problème d'avoir besoin d'un nouveau nom d'atome pour chaque processus de rappel, et si votre serveur fonctionne assez longtemps Je serai à court d'atomes et planterai la machine virtuelle d'Erlang.

Une meilleure approche est de créer un processus de registre gen_server qui gère une table ets, et ensuite la fonction module de rappel websocket init lui-même registre avec ce processus, qui serait alors stocker les détails dans la table ets. Un processus de rappel peut en trouver un autre soit en accédant directement à la table ets (en supposant qu'il autorise les lectures publiques), soit en appelant une fonction de requête sur le processus de registre, mais notez que dans ce dernier cas, les appels sont fréquents. processus websocket, le registre pourrait être un goulot d'étranglement. La deuxième approche vous permet d'utiliser des clés autres que des atomes, telles que des chaînes, des entiers ou des binaires, et ne souffre donc pas du problème d'épuisement des atomes. Un autre avantage est que le processus de registre peut surveiller chaque processus de rappel websocket enregistré et les retirer du registre lorsqu'ils meurent. Si vous n'utilisez pas Yaws en mode incorporé, vous pouvez utiliser le yapps feature of Yaws pour démarrer votre propre application, exécutée au même emplacement que Yaws, pour démarrer un superviseur qui démarre et gère le processus de registre. Dans ce cas, il n'est pas nécessaire d'enregistrer le yapp avec chaque serveur virtuel comme le suggère le document, puisque le yapp lui-même ne traiterait pas les requêtes de pian.

0

J'ai une approche similaire. Si vous avez plus d'un serveur Yaws pour gérer websocket, vous pouvez stocker le Pid Websocket à Mnesia, et utiliser Pid ! Message pour envoyer un message à Pid websocket spécifique, enfin le module de rappel websocket handle_info/2 sera appelé.