2016-02-17 6 views
5

Wir haben eine Wrapper-Bibliothek um RabbitMQ an meinem Arbeitsplatz, erstellt von jemandem, der hier nicht mehr arbeitet. Ich entwerfe ein neues System mit Rabbit und erarbeite den besten Ansatz, um Warteschlangen, Austausch und Bindungen zu deklarieren. Unsere Rabbit-Architektur hat ein paar globale Zonen, und jede Zone hat mehrere Rabbit-Knoten.Wann queues and exchanges mit RabbitMQ zu deklarieren/binden ist

Der Wrapper-Code zum Veröffentlichen von Nachrichten und Abonnieren von Warteschlangen deklariert die relevanten Austauschvorgänge, Warteschlangen und Bindungen jedes Mal neu. Meine Sorge ist, dass dies zu einer beträchtlichen Latenz bei jeder Nachrichtenveröffentlichung führen kann, insbesondere wenn es auf eine Bestätigung warten muss, dass die Warteschlange/der Austausch in den entfernten globalen Zonen existiert. Ich erwarte, dass der Benchmark von Millionen von Nachrichten pro Sekunde den Austausch für jede Veröffentlichung nicht erneut deklariert.

Kurz gesagt, dieser Ansatz scheint ein wenig verschwenderisch und paranoid zu mir, aber vielleicht fehlt mir etwas. So

Ich habe ein paar Fragen:

  • Ist erneut erklärt, die Warteschlangen und tauscht eine erhebliche Performance-Einbußen, da globale Föderation?
  • Re-Deklaration bei jeder Verwendung ein guter Ansatz, weil es Warteschlangen/Austauschvorgänge behandelt, die aufgrund von Broker-Neustarts oder expliziter Löschung verschwinden?
  • Sollten wir nur Warteschlangen und Austausch pro Prozess einmal erklären und erwarten, dass sie die gesamte Lebensdauer dauern?
  • Sollen dauerhafte Austauschvorgänge und Warteschlangen in Rabbit-Konfiguration deklariert und von den Anwendungen überhaupt nicht deklariert werden?
  • Wie sollten Konfigurationsänderungen für Warteschlangen/Austauschvorgänge gehandhabt werden, wenn Anwendungen sie weiterhin mit alter Konfiguration deklarieren können? Sollten Anwendungen den Deklarationsfehler nur behandeln und weiter veröffentlichen/konsumieren?

Antwort

7

erneut erklärt, die Warteschlangen und tauscht eine deutliche Leistungs

traf es für eine sehr große Anzahl von Nachrichten sein können

erneut erklärt, auf die jeweils eine verwenden Guter Ansatz, weil er verhindert, dass Warteschlangen/Austauschvorgänge aufgrund von Neustarts oder expliziter Löschung von Maklern verschwinden?

"guter Ansatz" - nein.

„wirksam“ zu verhindern verschwunden Börsen/Warteschlangen/Bindungen von Problemen verursachen, ja ... aber es ist nicht eine gute Sache zu tun, in den meisten Fällen

(vielleicht ok, wenn man nur sehr selten eine Nachricht senden , gibt es einen echten Grund zur Sorge über die sauber abgewischte Topologie)

Sollten wir Warteschlangen und Austausch nur einmal pro Prozess deklarieren und erwarten, dass sie die gesamte Lebensdauer halten?

Dies ist mein allgemeiner Ansatz.

es öffnet die Möglichkeit der Topologie zerstört werden und Sie nicht wissen. Es kommt darauf an, ob Sie denken, dass dies wirklich passieren wird.

Sollen dauerhafte Austauschvorgänge und Warteschlangen in Rabbit-Konfiguration deklariert und von den Anwendungen überhaupt nicht deklariert werden?

es ist nichts falsch mit vordefinierten Topologie, aber es fehlt viel von der Leistungsfähigkeit und Flexibilität von rabbitmq und dem AMQP-Protokoll.

Viele Messaging-Systeme erfordern vordefinierte Topologien und spezialisierte Tools zur Verwaltung der Topologie. Amqp unterscheidet sich dadurch, dass Sie die Topologie nach Bedarf definieren können.

, wenn Sie mit einer statischen Topologie beschäftigen, dann könnte dies eine gute Option für Sie

Wie Änderungen für Warteschlangen/Austausch behandelt wird Config sollte, wenn Anwendungen weiterhin sie mit altem Config erklären? Sollten Anwendungen den Deklarationsfehler nur behandeln und weiter veröffentlichen/konsumieren?

Ich würde die App zum Absturz bringen und über den Fehlermeldungsmechanismus berichten, den Sie verwenden.

mit einer Topologieänderung ist in der Regel etwas wichtig, und aus einem Grund getan. Wenn sich die Austausch- oder Warteschlangendeklaration ändern muss, gibt es wahrscheinlich einen guten Grund dafür, und der Code sollte nicht mit der alten Deklaration fortfahren.

+0

Danke für Ihre gründliche Antwort –