2016-12-01 7 views
1

Ich benutze NodeJS und amqplib, um eine einfache Jobwarteschlangenbibliothek zu erstellen (ähnlich wie Jackrabbit) in einem Dienst verwendet werden das sollte ziemlich große Feeds analysieren, die Informationen über viele verschiedene Ereignisse enthaltenRabbitMQ & NodeJS: Nach "1 Verbindung pro App, 1 Kanal pro Thread, 1 Consumer pro Kanal" Richtlinie

Nachdem die Informationen analysiert wurden, wird sie an Tausende von Warteschlangen verteilt (die Warteschlange ist die kleinste Einheit, in der die Nachrichtenreihenfolge eingehalten werden muss) und dann verbraucht von meiner Warteschlange-Bibliothek

Die Frage ist: Wie befolge ich die Richtlinie "1 Verbindung pro App, 1 Kanal pro Thread, 1 Consumer pro Kanal" in diesem Fall? Es würde Tausende von Prozessen hervorbringen, die riesige Mengen an Speicher und Ressourcen verschwenden würden.

Hinweis: Die Anzahl der Nachrichten in jeder der Warteschlangen ist nicht sehr hoch: ca. 1-2 msg/s höchstens

+0

Die Richtlinien, über die ich spreche, werden in diesem Beitrag erwähnt: http://StackOverflow.com/Questions/10407760/is-there-a-performance-difference-between-pooling-connections-or-channel-in- rab – Towerman

Antwort

4

Ich nehme an, Sie wissen, dass NodeJS single-threaded ist, wenn der Code ausgeführt wird, Woher kommt Ihre Frage?

In threadbasierten Sprachen ist die Regel "1 Kanal pro Thread" wichtig, da die Sprache den Thread blockiert, auf dem der Kanal/Consumer sitzt. Sie werden zu einer Art von consume Anruf, und der Thread wird blockieren, warten auf eine Nachricht angezeigt werden.

Dies ist, warum Sie 1 Thread pro Kanal benötigen, in Sprachen, die Threads unterstützen.

In NodeJS ist der Aufruf für einen Abonnenten zum Nachrichtenkonsum jedoch nicht blockierend.

Dies bedeutet, dass Sie das 1 channel per thread Konzept sicher auswerfen können.

Mein eigener NodeJS- und RabbitMQ-Code hat oft Hunderte von geöffneten Kanälen in einer einzigen Instanz meiner Anwendung.

Kanäle sind billig und leicht zu öffnen. Das Einrichten eines Nachrichtenproduzenten oder -konsumenten ist ebenfalls billig. Die tatsächlichen Kosten sind 1) in der Verbindung und 2) die eigentliche Arbeit zu tun, sobald Sie eine Nachricht erhalten.

Worauf es ankommt, ist die Skalierung Ihrer Kunden. Wenn Sie NodeJS und RabbitMQ betrachten, müssen Sie den Nachrichtendurchsatz überwachen, um zu bestimmen, wann neue Instanzen Ihrer Anwendung erstellt werden sollen. Wenn Sie eine ständig wachsende Warteschlange haben und diese nie abläuft (alle Nachrichten werden verarbeitet), müssen Sie eine neue Instanz Ihrer Kunden erstellen.


Ein paar zusätzliche Hinweise:

Ich empfehle mit https://github.com/arobson/rabbot für Ihre NodeJS/RabbitMQ Bedürfnisse. Ich habe mit vielen der "einfachen" NodeJS-Bibliotheken für RabbitMQ gearbeitet und alle haben Einschränkungen, die ich für inakzeptabel halte. Rabbot hat eine bessere Abstraktionsschicht, um das Arbeiten mit RabbitMQ zu vereinfachen und Ihnen gleichzeitig die Flexibilität zu geben, die Sie benötigen.

Sie können auch meinen RabbitMQ und NodeJS Kurs hier anschauen: https://sub.watchmecode.net/guides/microservices-with-rabbitmq/ - Screencasts, Ebooks und Interviews mit Branchenexperten, um Sie schnell mit RabbitMQ und NodeJS vertraut zu machen. Beachten Sie jedoch: Die Geröllbesetzungen verwenden Wascally als Hauptbibliothek - das ist der Vorgänger von Rabbot (es wurde in Rabbot umbenannt, als sie einige Änderungen an den Interna vorgenommen haben).

Verwandte Themen