2010-01-22 7 views
4

En ce moment je fais le processus! Message, mais comme je l'ai googlé un peu, une taille de file d'attente de message est seulement limitée à la mémoire. J'ai un arbre de processus où les feuilles génèrent des messages et alimentent jusqu'à la racine et j'ai besoin de limiter la file d'attente ou passer à une autre méthode de faire la même chose.erlang - comment limiter la file d'attente des messages ou l'émuler?

plus, parfois Le processus reçoit des messages d'une feuille et parfois de deux feuilles. Dans le second cas, j'ai besoin de différentes files d'attente finies pour la feuille d'avant-toit.

Répondre

8

Il n'existe aucun mécanisme intégré pour limiter la taille de la file d'attente de messages pour un processus.

La solution habituelle à ce problème en erlang est d'introduire un protocole de contrôle de flux entre le producteur et le consommateur. Cela peut être aussi simple que l'expéditeur attend une réponse continue avant d'envoyer le message suivant. Vous pouvez inventer des protocoles de contrôle de flux plus complexes (fenêtrage, ...), mais souvent envoyer/wait-reply fera l'affaire. Le protocole gen_server:call/2 est un bon protocole de demande-réponse et peut être réutilisé en regardant le code pour gen_server et gen:call - il prend en charge un grand nombre de cas limites qui sont possibles.

Une autre approche consiste à envoyer des messages à travers le système au lieu de les pousser - dans ce cas, le récepteur demande à l'expéditeur un message lorsqu'il est prêt. Cependant, si vous avez des producteurs externes que vous ne pouvez pas limiter ou mettre suffisamment en mémoire tampon, vous n'avez peut-être pas cette option.

1

La façon classique de gérer votre deuxième cas est d'inclure le Pid du processus d'envoi dans le message. Ceci est très commun pour les messages erlang qui ont généralement la structure similaire à {SendingPid,Data}. Cela permet à la réception de traiter à la fois pour voir qui a envoyé le message et à l'aide de la correspondance de modèle au sein du receive pour sélectionner à partir de quel processus il souhaite recevoir des messages.

C'est ainsi que erlang peut multiplexer des messages provenant de nombreux expéditeurs différents dans une file d'attente de messages et ne pas être forcé de traiter tous les messages possibles partout. RabbitMQ implémente ceci sous la forme de flux de crédit.

Questions connexes