2008-08-20 15 views
20

Jeder kennt einen guten und zuverlässigen Open Source Queuing Server/Plattform?Gute Open Source Queuing Platform?

Ich arbeite an einem Projekt, das wir verarbeiten müssen Millionen von Elementen aus einer Warteschlange pro Tag. Meine Herausforderung besteht darin, dass die Warteschlange kein FIFO ist, was bedeutet, dass neue Elemente priorisiert werden und irgendwo in der Mitte der Warteschlange eingefügt werden können. Um diese Elemente zu verarbeiten, verwenden wir eine parallele Serververteilungsplattform, sodass die Warteschlange von vielen Servern aus zugänglich sein muss.

Antwort

5

Nicht ganz Open Source, aber ziemlich offen: Amazon's Queue service. Sehr zuverlässig, sehr einfach zu bedienen.

Open-Source-Ruby: Beanstalkd.

JBoss hat Java-Messaging-Service Unterstützung. Siehe die message bean page.

Apache hat ein JMS Produkt; Alle Apache-Produkte sind Open Source.

+1

Beanstalkd ist ein in C geschriebener Daemon. Er verfügt über Client-Bibliotheken für eine Reihe von Sprachen. Es ist weit entfernt von einer reinen Ruby-Lösung. –

3

Ich mag Gaius Idee von Amazonen SQS jedoch hat es eine große Verzögerung Zeit zwischen Nachrichten. Einige benchmarks zeigen 15-30 Sekunden eine Nachricht andere sind so langsam wie eine min eine Nachricht. Wenn Geschwindigkeit ein Problem ist, dann sollten Sie vielleicht Ihre eigene MOM ausführen.

Ich würde ActiveMQ von Apache empfehlen. Wir haben Benchmarks gemacht und seine Geschwindigkeiten sind ziemlich nah an Socket-Verbindungen. Habe es noch nie in einer großen Produktions-App verwendet.

+0

Als ich die Benchmarks gelesen habe, mit denen Sie verlinkt sind (http://devver.wordpress.com/2008/06/18/speed-with-messaging-matters/)) sehe ich mal 0,4 Sekunden von außen AWS und 0,04 Sekunden von EC2. – chmac

7

ActiveMQ ist ein ziemlich gutes Produkt: einfach einzurichten, einfach zu implementieren, einfach zu arbeiten. Clusterizable, viele Protokolle unterstützt, etc. Wir versuchen es in der Produktion, scheint zuverlässig (mit eigenen Problemen, aber nicht so viele)

Ich habe JBoss Messaging versucht, aber ich fand es viel schwieriger zu bedienen, und weniger reif (es ist ein Refactoring von JBoss MQ und es ist nicht ganz stabil und komplett ...)

[Bearbeiten] Entschuldigung, ich habe Ihre Frage nicht mit genug Aufmerksamkeit gelesen ... Ich habe die JMS-Spezifikation überprüft: Sie tut es implementieren Sie eine Priorität Reihenfolge der Nachricht, aber es gibt nur 10 Ebenen der Priorität in JMS, und Implementierer sind nicht gezwungen, sie zu respektieren (ich habe nicht überprüft, was AMQ tut) Aber Prioritäts-Management kann auch durch die Verwendung unterschiedlicher Warteschlangen erreicht werden ... [/ Edit]

+0

ActiveMQ 5.4.2 unterstützt Nachrichtenprioritäten. –

5

Neben ActiveMQ, das für Ihre Anforderungen arbeiten sollte, können Sie auch RabbitMQ oder OpenAMQ betrachten.

-2

Schreiben Sie Ihre eigenen, indem Sie eine mysql-Tabelle verwenden, die nach Einfügezeit und Priorität indiziert ist. Obwohl das keinen atomaren Pop gibt. Ein wenig transaktionsorientierte Magie, um atomaren Pop zu bekommen - ein Flaggenfeld. Aktualisieren Sie das oberste Element mit einem Null-Flag-Feld, um den eindeutigen Bezeichner Ihres Clients zu erhalten, bestätigen Sie, wählen Sie das Element mit dem eindeutigen Bezeichner aus, und löschen Sie es dann, wenn Sie mit dem Objekt fertig sind. Jetzt haben Sie nicht nur ein Warteschlangensystem, sondern auch ein Verwaltungsdashboard, da Sie sehen können, wer an was arbeitet, indem Sie alle Warteschlangentabellenelemente mit Nicht-Null-Flags auswählen.

+0

Dafür gibt es einige Vorteile. Wenn Ihr Service bereits von einer zentralen Datenbank abhängig ist und die Leistungsanforderungen nicht sehr hoch sind. –

15

Wie @davidnicol erwähnt, können Sie eine Datenbank verwenden; obwohl der Nachteil mit einer Datenbank einen großen Lastausgleich über viele Threads/Prozesse hinweg macht, ist ein bisschen schwer; Sie erhalten oft einen Thread, der den Kopf der Warteschlange sperrt, wodurch der Versand ein wenig single threaded wird.

Eine der Hauptaufgaben einer Nachrichtenwarteschlange besteht in der Regel darin, einen zuverlässigen Load Balancer zu erhalten. Sie können dann so viele Competing Consumers ausführen, wie Sie möchten.

Wenn Sie die Route der Nachrichtenwarteschlange gehen; dann ist Apache ActiveMQ die populärste Open-Source-Implementierung und ich würde empfehlen, damit zu beginnen, da es die biggest and most active community (meine persönliche Lieblingsmetrik für die Wahl zwischen ähnlichen Open-Source-Projekten) hat.

Es gibt verschiedene Möglichkeiten, um implement priority queues with ActiveMQ - der wichtigste Kompromiss ist, können Sie mit der Latenz umgehen die Resequencer pattern introduces oder nur Selektoren und andere Prozess/Thread-Pools der Verbraucher für verschiedene Bereiche von Prioritäten verwenden, ist eine bessere, niedrige Latenz Lösung.

Während die Selektorimplementierung nicht die reinste Warteschlangenimplementierung ist, tendiert sie in der Praxis besser zu arbeiten, da sie vermeidet, auf Nachrichten mit höherer Priorität zu warten. Außerdem werden Nachrichten mit niedriger Priorität vermieden, die eine lange Verarbeitungszeit für die Prozessoren erfordern.

+0

Danke. Ich habe über das Resequencer-Muster aus Ihrer Antwort erfahren. –

2

BTW Ein anderer Aspekt zu Ihrer Frage ist, welche API verwendet wird, um mit der von Ihnen gewählten Technologie zu sprechen.

Meine Empfehlung mit jeder Middleware oder Infrastruktur ist zu versuchen hide the middleware from your business logic as this article describes. Indem Sie Ihre Geschäftslogik von der Middleware getrennt halten, können Sie die Middleware-Implementierung problemlos ändern - da es keine allgemeingültige Middleware-Technologie gibt - sie haben alle ihre eigenen Vor- und Nachteile. Darüber hinaus ändern sich die Anforderungen - insbesondere bei Last, Volume, Durchsatz, Synchronität und Latenz -, so dass Sie während der Laufzeit eines Projekts manchmal die Middleware-Technologie wechseln müssen.