2017-07-06 2 views
0

Ich baue ein System, wo zwei verschiedene Entitäten Nachrichten von der gleichen Quelle verarbeiten müssen (auf unterschiedliche Weise - zum Beispiel protokolliert man alle Nachrichten, während eine andere Entität Daten aggregieren möchte).Kann ein NATS-Herausgeber eine einzelne Nachricht in mehrere Warteschlangen senden?

Im Idealfall ist jede Entität für Leistung und Ausfallsicherheit vollständig skalierbar. Daher verfügen wir über mehrere Publisher, mehrere Protokollteilnehmer und mehrere Aggregationsteilnehmer. Dennoch werden alle von jedem veröffentlichten Nachrichten von genau einem Protokollteilnehmer und einem Aggregationsteilnehmer verarbeitet.

Mit AMQP können wir dies erreichen, indem wir einen Fan-out-Austausch veröffentlichen, der Nachrichten an zwei Warteschlangen verteilt, wobei jede Warteschlange viele Abonnenten hat. Ich verstehe, dass das gleiche Verhalten in NATS erreicht werden kann, indem man einfach alle Teilnehmer auf das gleiche "Thema" hört, indem man zwei unterschiedliche "Warteschlangengruppennamen" basierend auf ihren Rollen verwendet. In einem solchen Fall werden Nachrichten an das Subjekt an einen Teilnehmer von jeder Warteschlangengruppe geliefert, d. H. Jede Nachricht wird genau n-mal zugestellt, wobei n die Anzahl von unterschiedlichen Warteschlangengruppen und nicht die Anzahl von Teilnehmern ist. Ist das richtig?

Antwort

3

der Tat können Sie Warteschlange Abonnenten verwenden (zum Beispiel in Go, wäre es solche API sein. func (nc *Conn) QueueSubscribe(subj, queue string, cb MsgHandler) (*Subscription, error)

Die queue ist der Gruppenname Zum Beispiel ist es in Ihrem Beispiel log und aggregation könnten Sie.. Sie können so viele Warteschlangenabonnenten für jede dieser Gruppen erstellen und nur 1 Mitglied in jeder Gruppe erhält eine bestimmte Nachricht

Angenommen, Sie veröffentlichen eine Nachricht zu Betreff foo und Sie haben 10 Warteschlangenabonnenten auf foo mit Warteschlange Name log und 10 Warteschlangenabonnenten auf foo mit dem Namen der Warteschlange aggregation. Die Nachricht wird an 2 Teilnehmer, 1 für Gruppe log und 1 für Gruppe aggregation zugestellt.

Hoffe, das hilft.

0

Ihr Ansatz ist richtig, das Konzept der Warteschlange in nats.io ist die sequenzielle Verteilung der Nachricht zwischen den Teilnehmern, die die Warteschlange überwachen. Diese Verteilung geschieht linienartig. Angenommen, Sie haben 10 Teilnehmer (S1-S10), die ein Thema hören und in derselben Warteschlange registriert sind, dann wird die erste Nachricht zyklisch an S1 gesendet, dann an S2 und so weiter.

Sie müssen nur sicherstellen, dass alle Teilnehmer mit dem Server verbunden sind, als ob ein Subscriber offline geht, wird der Nats Server dieses Ereignisses nach bestimmten ausstehenden PING-PONG Anfragen bewusst werden und während dieses Intervalls wird die Spedition die Nachrichten an den Offline-Knoten. So müssen Sie sorgfältig auf

  1. PING-PONG Intervall
  2. Max herausragende Pinganforderungen

https://nats.io/documentation/server/gnatsd-config/

+0

Sie sagen, dass, wenn ein Teilnehmer abstürzt, werden wir Daten verlieren? – Guss

+0

Wenn ein Teilnehmer offline geht, wird der nats-Server nach einer bestimmten Zeitüberschreitung über dieses Ereignis informiert, und während dieser Zeitüberschreitung kann es in unserem Fall zu einem Datenverlust kommen. – ritesh4302

Verwandte Themen