Frage

ich einen Produzenten haben, dass ich Arbeit konsequent auf die Verbraucher durch eine konsequente Hashing verteilen möchten. Zum Beispiel mit dem Verbraucherknoten X und Y, Aufgaben A, B, C immer Verbraucher X gehen sollte, und D, E, F an Verbrauchern Y. Aber das kann ein wenig verschieben, wenn Z den Pool der Verbraucher verbindet.

Ich wollte nicht mit dem Schreiben meiner eigenen Logik tun, um den Verbraucherknoten, und vor allem nicht mit der Verwaltung von Knoten verbinden und verlassen den Pool zu verbinden, so dass ich auf dem Weg der Verwendung RabbitMQ gegangen sind, und eine exklusive Warteschlange pro Verbraucherknoten.

Ein Problem, das ich laufen werde in ist diese Warteschlangen-Eintrag, da die Hersteller alle verfügbaren Warteschlangen wissen muss, bevor die Arbeit verteilt wird. AMQP ist auch nicht die Auflistung Warteschlangen unterstützen, was ich meinen ganzen Ansatzes unsicher macht. RabbitMQ und Alice ( brokenly im Moment ) add diese Funktionalität aber: gibt es eine API für die Auflistung Warteschlangen und den Austausch auf RabbitMQ?

Ist das eine sinnvolle Nutzung von Kaninchen? Soll ich überhaupt mit einer Nachrichten-Warteschlange sein? Gibt es ein besseres Design, so dass die Warteschlange kann konsequent meine Arbeit bei den Verbrauchern teilen, anstatt ich um es zu tun?

War es hilfreich?

Lösung

Was Sie beschreiben, ist machbar in RabbitMQ.

Ihre Setup wäre so etwas wie:

  • ein Hersteller veröffentlicht die Nachricht zu einem Thema Austausch; Lassen Sie uns Name es consistent_divider;
  • , wenn ein Verbraucher, den Pool verbindet, verbindet er sich mit dem Makler und schafft eine exklusive Warteschlange mit seinem Namen, aber nicht bindet es an irgendetwas
  • der Hersteller in regelmäßigen Abständen Umfragen der Broker (vielleicht mit rabbitmqctl list_consumers) zu überprüfen, ob die Verbraucher geändert haben; wenn sie, entfernt es alle vorhandenen Bindungen und erneut bindet die Warteschlangen je nach Bedarf;
  • , wenn der Hersteller veröffentlicht werden Nachrichten eine Routing-Schlüssel zugewiesen, die ihre Aufgabe Typ entspricht.

Wenn Sie also 6 Aufgabentypen haben: A, B, C, D, E, F, und nur zwei Verbraucher C1 und C2, Ihre Bindungen aussehen würde: C1 gebunden 3 mal consistent_divider mit Routing-Tasten A, B und C; C2 gebunden 3 mal C_D mit Routing-Tasten D, E und F.

Wenn C3 auf den Pool schließt sich der Produzent sieht dies und erneut bindet die Warteschlangen entsprechend.

Wenn der Produzent veröffentlicht, es sendet die Nachrichten mit routing_keys A, B, C, D, E und / oder F, und die Nachrichten an die richtigen Warteschlangen geroutet.

Es würde zwei mögliche Probleme mit diesem:

  1. Es gibt eine leichte Verzögerung zwischen wenn der Verbraucher den Pool verbindet und Nachrichten, um es zu bekommen geführt; wenn es auch, sind Nachrichten bereits in den Warteschlangen, ist es möglich, dass ein Verbraucher-Nachrichten für einen anderen Verbraucher soll bekommen (zB C3 verbindet, die Hersteller erneut bindet, aber C2 noch einige E und F-Nachrichten bekommt, weil sie bereits in der Warteschlange waren),
  2. Wenn ein Verbraucher stirbt aus irgendeinem Grunde, die Nachrichten in der Warteschlange (und auf dem Weg zu seiner Warteschlange) verloren gehen; dies kann durch die erneute Veröffentlichung und Dead-Schriftzug der Nachrichten gelöst werden, respectively.

Um Ihre letzte Frage beantworten, mögen Sie wahrscheinlich verwenden Warteschlangen und RabbitMQ ist eine gute Wahl, aber Ihre Anforderungen (genauer gesagt das `teilt die Arbeit konsequent Bit‘) nicht ganz fit AMQP perfekt.

Andere Tipps

könnten Sie verwenden das offizielle konsistente-Hashing Plugin für rabbitmq als beantwortet hier

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