Message Queuing-Lösung für Millionen von Themen

8

Ich denke an ein System, das mehrere Konsumenten über Ereignisse informieren wird, die mit einer Population von Objekten geschehen. Jeder Abonnent sollte in der Lage sein, Ereignisse zu abonnieren, die bei keinem oder mehreren der Objekte vorkommen. Mehrere Abonnenten sollten Informationen über Ereignisse erhalten können, die bei einem einzelnen Objekt auftreten.

Ich denke, dass ein Meldungswarteschlangensystem in diesem Fall geeignet sein wird, aber ich bin mir nicht sicher, wie ich mit der Tatsache umgehen soll, dass ich Millionen von Objekten habe - das Verwenden eines separaten Themas für jedes der Objekte klingt nicht gut. oder ist es gut?].

Könnten Sie bitte einen Ansatz vorschlagen, den ich verwenden sollte, und vielleicht sogar ein Open-Source-Meldungswarteschlangensystem, das vernünftig wäre?

Wenige weitere Details:

  • Es wird Tausende von Abonnenten geben [gemeint ist nicht viele von ihnen],
  • Abonnenten abonnieren jeweils zehn oder hunderte von Objekten,
  • wird es ~ 5-20 Millionen der Objekte geben,
  • Ereignisse selbst müssen keine Nachricht tragen. Es genügt die Information, dass das Objekt geändert wurde,
  • Die überwiegende Mehrheit der Objekte wird niemals abonniert,
  • -Ereignisse treten mit der maximalen Rate von einigen Hundert pro Sekunde auf,
  • idealerweise sollte der Server unter Linux laufen, in der Lage sein, sich mit dem Rest des Ökosystems über http long-poll zu integrieren [using node js? Fortsetzungen unter dem Anlegesteg?].

Vielen Dank im Voraus für Ihr Feedback und Entschuldigung für eine etwas vage Frage!

    
pQd 27.08.2012, 18:39
quelle

5 Antworten

3

Teilen Sie die Themen auf, um bestimmte Ereignisse für z. "Object updated topic" "Objekt gelöscht" ... Clients müssen also nur die "endliche Anzahl" von ereignisbasierten Themen abonnieren, an denen sie interessiert sind.

Geben Sie Header in Ihre Nachrichten ein, wenn Sie sie veröffentlichen, und fügen Sie Informationen in die Clients ein, um diese Header als Nachrichtenselektoren zu verwenden. Beispielsweise kennt der Client die Liste der Objekte, an denen er interessiert ist - und sagt, dass Sie das Objekt mit einer "ID" identifizieren - die ID kann der Header sein, und der Client verwendet den "ID-Header", um festzustellen, ob er daran interessiert ist die Nachricht.

Je nachdem, ob Sie möchten, sollten Sie auch eine garantierte Zustellung in Betracht ziehen, um sicherzustellen, dass der Client die Nachricht erhält, selbst wenn er offline geht und später wiederkommt.

Die Optionen, die ich an der Spitze empfehlen würde, sind ActiveMQ, RabbitMQ und Redis PUB SUB (Havent hat wirklich an redis pub-sub gearbeitet, bitte verwenden Sie Ihre Due Diligence)

Hier sind einige Leistungs-Benchmarks für RabbitMQ und Redis

Ich habe nur gesehen, dass Sie nur ein paar 100 Nachrichten rausgeschoben haben, das ist keine große Sache für activemq. Ich habe Amq auf einem System benutzt, das 240 Nachrichten pro Sekunde verarbeitet, und es funktioniert einfach. Ich verwende einen Thread-Pool von Arbeitern, um die Nachrichten jedoch asynchron zu verarbeiten. Betrachten Sie ein Framework wie akka, wenn Sie im Java-Land sind, wenn Sie nicht bei nodejs und dem coolen Eco-System bleiben.

    
JVXR 05.09.2012, 23:30
quelle
5

Ich kann RabbitMQ wärmstens empfehlen. Ich habe es in ein paar Projekten vorher benutzt und aus meiner Erfahrung heraus denke ich, dass es sehr zuverlässig ist und eine große Auswahl an Konfigurationen bietet. RabbitMQ ist im Grunde ein quelloffener (Mozilla Public License (MPL)) Message Broker, der die Advanced Message Queuing Protocol (AMQP) Standard.

Wie auf der RabbitMQ-Website dokumentiert:

  

RabbitMQ kann potenziell auf jeder von Erlang unterstützten Plattform ausgeführt werden, von eingebetteten Systemen bis zu Multicore-Clustern und Cloud-basierten Servern.

... bedeutet, dass ein Betriebssystem wie Linux unterstützt wird.

Hier gibt es eine Bibliothek für node.js: Ссылка

Es kommt mit einer HTTP-basierten API zur Verwaltung und Überwachung des RabbitMQ-Servers - einschließlich eines Befehlszeilentools und einer browserbasierten Benutzerschnittstelle - siehe: Ссылка .

In den Projekten, mit denen ich gearbeitet habe, habe ich mit RabbitMQ über C # und zwei verschiedene Wrapper kommuniziert, EasyNetQ und Burrow.NET . Beide sind ausgezeichnete Wrapper für RabbitMQ, aber ich wurde am meisten Fan von Burrow.NET, da es einfacher und offensichtlicher ist, damit zu arbeiten (macht nicht viel Magie unter der Haube) und bietet gute Flexibilität, Logger, Serialisierer, usw.

Ich habe nie mit der Menge der Objekte gearbeitet, mit denen Sie arbeiten werden - ich habe mit Tausenden (nicht Millionen) gearbeitet. Egal wie viele Objekte ich gespielt habe, RabbitMQ hat immer wirklich stabil gearbeitet und war nie die Ursache für Fehler im System.

Um es zusammenzufassen - RabbitMQ ist einfach zu bedienen und einzurichten, unterstützt AMQP, kann über HTTP verwaltet werden und was mir am besten gefällt - es ist felsenfest.

    
Lasse Christiansen 06.09.2012 00:15
quelle
2

Wenn es Open Source sein muss, gehe ich zu ActiveMQ und einem Anwendungsserver, um die JMS-Funktionalität für Themen und It bereitzustellen hat den Ajax-Support , damit Sie von Ihrem Client darauf zugreifen können

Sie würden also die JMS-Infrastruktur verwenden, um die Themen für die Objekte zu veröffentlichen, und Sie kann topis so erstellen, wie Sie es benötigen

Außerdem können Sie durch die Verwendung eines Java-Anwendungsservers Vorteile aus Clustering, Load-Balancing und anderen Hochverfügbarkeitsfunktionen ziehen (natürlich basierend auf dem ausgewählten Produkt)

Hoffe das hilft !!!

    
Carlos Grappa 04.09.2012 15:29
quelle
2

Da Ihre Nachrichten sehr klein sind, sollten Sie vielleicht MQTT in Betracht ziehen, das für kleine Geräte entwickelt wurde, obwohl es auch für leistungsstarke Geräte geeignet ist. Hauptüberlegung ist der niedrige Overhead - im Grunde ein 2-Byte-Header für eine kleine Nachricht. Wahrscheinlich können Sie aufgrund Ihres Volumens keinen einfachen oder Open-Source-MQTT-Server verwenden. Sie benötigen wahrscheinlich eine hochleistungsfähige dedizierte Appliance wie MessageSight, um mit Ihrem Volume umgehen zu können.

Einige weitere Details zu Ihrer Anwendung würden sicherlich helfen. Auch Sie erwähnen Sicherheit überhaupt nicht. Ich nehme an, Sie müssen in diesem Bereich einige Bedürfnisse haben.

    
Jim MacNair 15.05.2014 17:41
quelle
1

Obwohl Sie sich über Ihre Arbeitsumgebung nicht sicher sind, aber hier sind meine Teile. Können Sie jedes Objekt mit einer eindeutigen ID in Ihrem System identifizieren? Wenn dies der Fall ist, können Sie für jeden Ereignistyp ein Thema erstellen. für z.B. Sie möchten Objektlöschungsereignisse, Objektaktualisierungsereignisse usw. verfolgen. So können Sie für jeden Ereignistyp ein Thema haben. Diese Themen würden mit IDs des Objekts veröffentlicht, wenn dem Objekt ein entsprechendes Ereignis passierte. Dadurch wird die Anzahl der benötigten Themen begrenzt. Der zweite Teil Ihres Problems ist, dass verschiedene Abonnenten verschiedene Objekte abonnieren möchten. Daher sind nicht alle Abonnenten daran interessiert, Ereignisse aller Objekte zu kennen. Diese Problembeschreibung wurde auf den Mechanismus zur Nachrichtenauswahl (Filterung) beschränkt, der vom Messaging-Framework bereitgestellt wird. Sie müssen also im Grunde suchen, auf welcher Basis ein Teilnehmer an einem bestimmten Objekt interessiert ist. Haben Sie diese Basis als Nachrichtenfilterungsmechanismus. Es könnte alles sein: Objekttyp, Objektstatus usw. Ihr System würde also letztendlich aus einem Thema für jeden Ereignistyp bestehen, bei dem jemand Ereignisnachrichten veröffentlicht: {object-type: object-id} information. Abonnenten können zu jedem Thema und mit Filterkriterien abonnieren.

Wenn obige Lösung ausreicht, können Sie eine beliebige Messaging-Lösung verwenden: activeMQ, WMQ, RabbitMQ.

    
ag112 06.09.2012 07:25
quelle

Tags und Links