Frage

Ich habe zwei Methoden zum "Nachrichtenübergang" bemerkt. Eine, die ich gesehen habe, die Erlang benutzt habe und die andere stammt aus stackloser Python. Soweit ich verstehe, ist hier der Unterschied

Erlang -Stil - Nachrichten werden in die Mailbox des Empfangsprozesses gesendet und in die Warteschlange gestellt. Von dort werden sie fifo entfernt. Sobald der erste Vorgang die Nachricht gesendet hat, ist es kostenlos, fortzufahren.

Python Style - Verarbeitung a Warteschlangen, die an den Prozess B. B sendet. B führt derzeit eine andere Aktion aus, sodass A eingefroren ist, bis B bereit ist zu empfangen. Sobald B einen Lesekanal geöffnet hat, sendet A die Daten, dann werden beide fortgesetzt.

Jetzt sehe ich die Profis der Erlang -Methode, dass Sie keine blockierten Prozesse haben. Wenn B niemals in der Lage ist, zu empfangen, kann A weiterhin fortgesetzt werden. In einigen Programmen, die ich geschrieben habe, habe ich jedoch festgestellt, dass Erlang -Nachrichtenfelder mit Hunderten (oder Tausenden) Nachrichten voll werden, da der Zustrom von Nachrichten größer ist als der Abfluss.

Jetzt habe ich kein großes Programm in einem Framework/Sprache geschrieben, also frage ich mich, dass Ihre Erfahrungen damit sind, und wenn es etwas ist, das ich mir überhaupt Sorgen machen sollte.

Ja, ich weiß, dass dies abstrakt ist, aber ich suche auch nach eher abstrakten Antworten.

War es hilfreich?

Lösung

Meine Erfahrung in der Erlang -Programmierung ist, dass Sie, wenn Sie eine hohe Messaging -Rate (dh ein schnellerer Produzent als Verbraucher) erwarten, Ihre eigene Flussregelung hinzufügen. Ein einfaches Szenario

  • Der Verbraucher wird: Nachricht senden, auf ACK warten und dann wiederholen.
  • Der Produzent wird: Warten auf die Nachricht, senden Sie ACK, wenn die Nachricht empfangen und verarbeitet wird, und wiederholen Sie dann.

Man kann es auch umkehren, der Produzent wartet darauf, dass der Verbraucher kommt und den nächsten verfügbaren Nachrichten erfasst.

Diese Ansätze und andere Flusskontrolle können hinter Funktionen verborgen sein, die erste ist meist bereits verfügbar in gen_server:call/2,3 gegen a gen_server OTP -Verhaltensprozess.

Ich sehe asynchrone Nachrichten wie in Erlang als den besseren Ansatz, da Sie bei hoher Latenzen möglicherweise eine Synchronisation bei der Nachrichten zwischen Computern vermeiden möchten. Man kann dann clevere Möglichkeiten zum Implementieren der Flusssteuerung bestimmen. Sagen Sie, eine ACK des Verbrauchers für alle N -Nachrichten, die der Produzent ihn gesendet hat, oder senden Sie eine spezielle "Ping mich, wenn Sie diese eine" Nachricht erhalten haben, um die Ping -Zeit zu zählen.

Andere Tipps

Im Großen und Ganzen sind dies unbegrenzte Warteschlangen gegenüber begrenzten Warteschlangen. Ein stackloser Kanal kann als Sonderfall einer Warteschlange mit 0 Größe angesehen werden.

Begrenzte Warteschlangen neigen zu Deadlock. Zwei Themen/Prozesse, die versuchen, eine Nachricht aneinander zu senden, beide mit einer vollständigen Warteschlange.

Unbefragte Warteschlangen haben subtiler. Ein großer Briefkasten erfüllt nicht die Latenzanforderungen, wie Sie bereits erwähnt haben. Geh weit genug und es wird irgendwann überlaufen; Kein unendliches Gedächtnis, also ist es wirklich nur eine begrenzte Warteschlange mit einer großen Grenze, die den Prozess abbricht, wenn es voll ist.

Welches das Beste ist? Das ist schwer zu sagen. Hier gibt es keine einfachen Antworten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top