Nachrichtenwarteschlange. Datenbank vs Dedicated MQ


15

Ich bin nach Rat bezüglich Message Queuing. Wir haben Anforderungen, damit "Jobs" in eine Nachrichtenwarteschlange gestellt werden.

Der ursprüngliche Vorschlag war, nur eine SQL Server-Instanz zu verwenden und Nachrichten von dieser zu verarbeiten. Alles, was ich im Internet gelesen habe, deutet darauf hin, dass die Verwendung einer Datenbank für eine Nachrichtenwarteschlange keine skalierbare Lösung ist. Aus diesem Grund wurde die Idee vorgeschlagen, RabbitMQ oder ein anderes Drittanbieter-MQ zu verwenden.

Die andere zu berücksichtigende Sache ist, dass die Anforderung für die "Jobverarbeitung" nicht unter 30 Sekunden liegt, sodass der Prozess, der den Job ausführt, die Datenbank alle 30 Sekunden abruft. Für mich scheint das nicht so schlimm zu sein und würde wahrscheinlich funktionieren, ohne der Datenbank eine große Last hinzuzufügen.

Wir haben bereits eine Datenbank auf unseren Clients, die wir für diesen Zweck verwenden könnten, sodass unseren Clients nicht viel zusätzlicher Support zur Verfügung steht. Wenn wir jedoch einen Drittanbieter-MQ hinzufügen, wird die Netzwerkkonfiguration usw. zusätzlich unterstützt beträchtlich, da es viele Benutzer gibt.

Die andere Option, die ich in Betracht gezogen habe, bestand darin, den Benutzern die Wahl zwischen beiden Optionen zu ermöglichen. Wenn sie ein kleiner Benutzer sind, ist die SQL Server-Lösung in Ordnung. Wenn sie jedoch ein größerer Benutzer sind, können sie eine MQ-Lösung eines Drittanbieters konfigurieren.

Mir ist keine Lösung verkauft, ich frage mich, ob jemand etwas hat, das ich in Betracht ziehen oder Ratschläge geben sollte.


1
Handelt es sich bei diesen "Jobs" um ein "Feuer und Vergessen", oder muss der Prozess zu Hause anrufen, um den Server über den Status dieses Jobs zu informieren?
c_maker

Wie skalierbar muss es sein? Führen Sie ein paar hunderttausend Nachrichten pro Tag oder mehrere Milliarden durch?
Blrfl

Vielen Dank für die Kommentare: Es ist erforderlich, dass der Job als unvollständig markiert wird (die werden als vollständig betrachtet, sofern sie nicht als unvollständig / fehlgeschlagen markiert sind). Ich würde nicht mehr als 20 000 Nachrichten pro Tag denken. Höchstwahrscheinlich nur ein paar tausend.
user1653400

Verwenden Sie das für den Job am besten geeignete Werkzeug. Wenn Sie eine Nachrichtenwarteschlange benötigen, verwenden Sie eine Nachrichtenwarteschlange und keine Datenbank. Ich habe zuvor Leute gesehen, die Datenbanktabellen als Nachrichtenwarteschlangen verwendet haben, und betrachte dies als Anti-Pattern. Sie können einen Schraubendreher als Hammer verwenden, aber ein Hammer funktioniert besser, wenn Sie einen Nagel einschlagen müssen. Meistens tun die Leute dies, weil sie Datenbanken verstehen, aber keine Nachrichtenwarteschlangen.
Jesper

Hier gibt es einige gute Hinweise
Michael Green

Antworten:


18

Alles, was ich im Internet gelesen habe, deutet darauf hin, dass die Verwendung einer Datenbank für eine Nachrichtenwarteschlange keine skalierbare Lösung ist.

Die Realität, die häufig ignoriert wird, wenn " X nicht verwenden, weil es nicht skaliert " (der Link enthält eine Sprache, die von manchen als anstößig empfunden wird), ist, dass die Skalierung nicht immer wichtig ist. Ich würde sogar sagen, dass die Skalierung selten wichtig ist, wenn man alle Anwendungen auf dem Planeten in ihrer Gesamtheit betrachtet .

In Ihrem Kommentar wird eine Rate von 20.000 Nachrichten pro Tag angegeben, was bedeutet, dass Sie eine durchschnittliche Rate von 0,23 Nachrichten pro Sekunde (eine alle 4,3 Sekunden) unterstützen müssen. Wenn sich herausstellt, dass Ihr Projekt um zwei Größenordnungen erfolgreicher ist als erwartet, müssen Ihre Anforderungen 23 Nachrichten pro Sekunde verarbeiten. Dies ist eine Aufgabe, die ich meinem vier Jahre alten Mobiltelefon oder einer Himbeere gerne übertragen würde Pi. Dies ist immer noch keine groß angelegte Anwendung, selbst wenn Sie darüber hinaus noch ein paar Größenordnungen beachten.

Ich habe (zum Glück von der Seitenlinie aus) gesehen, wie Projekte schlecht endeten, weil sie entweder zu viel Zeit damit verbrachten, zu früh über das Ausmaß nachzudenken, was nicht passieren würde, oder gar keine Zeit darauf und schließlich von dem Ausmaß zermalmt wurden, das es schließlich tat. Wie alles andere gibt es ein fröhliches Medium. Wenn Sie der Meinung sind, dass eine große Skalierung für Ihre Anwendung eine realistische Möglichkeit ist, sollte es nicht schwierig sein, ein Geschäftsmodell zu erstellen, um den geringen zusätzlichen Aufwand zu bewältigen, der erforderlich ist, um nicht skalierbare Teile zu abstrahieren, die jetzt kostengünstig bereitgestellt werden können . Dies bedeutet, dass Sie später , wenn ein Bedarf an Skalierung besteht, die Möglichkeit (und möglicherweise die Einnahmen) haben, diese Teile im Großhandel zu ersetzen, ohne das gesamte System neu überdenken zu müssen.

Während das Nachrichtenvolumen Ihrer Anwendung nicht dazu führt, dass eine Datenbank oder ein Nachrichtenwarteschlangensystem selbst auf bescheidener Hardware ins Schwitzen gerät, müssen Sie wahrscheinlich andere Anforderungen für die Abwicklung Ihrer Nachrichtentransaktionen erfüllen, um die eine oder andere bessere Wahl zu treffen. Diese Anforderungen sollten Sie bewerten.


Ich habe eine Datenbank, in der täglich Millionen von Transaktionen durchgeführt werden. welches ich durch sms verarbeiten muss. Ich verwende derzeit SQL-Tabelle als Warteschlange, aber ich bleibe hängen, wenn ich große Datenmengen sammle. Ich kann MQ nicht verwenden, da ich meine SMS basierend auf der Echtzeitkonfiguration weiterleiten muss. Wenn ich MQ verwende, verwendet es nicht die aktuelle Konfiguration für den Client. Da wir den Anbieter im Backend wechseln, wenn einige Anbieter die Verarbeitung nicht durchführen. Also, was schlägst du mir in meinem Szenario vor?
Mayur Rathod

@mayurRathod Dieses Thema scheint wie Futter für eine separate Frage. Formulieren Sie es sorgfältig, da eine Anfrage nach bestimmten Tools oder Ressourcen als "Off-Topic" geschlossen wird.
Blrfl

9

Nachrichtenwarteschlangen kommen erst dann richtig zur Geltung, wenn Sie viele Nachrichten haben und Nachrichten zwischen ihnen weiterleiten, Fanout an mehr als einen Konsumenten usw.

Wenn Sie nur eine einzige Job-Warteschlange mit Dingen haben, die Sie offline verarbeiten möchten, reicht eine SQL-Tabelle aus.

Vergessen Sie nicht, sicherzustellen, dass Sie eine Möglichkeit haben, laufende Aufträge zu markieren, alte zu bereinigen und einen Alarm auszulösen, wenn das System stoppt. Für eine einzelne Warteschlange ist die manuelle Verwaltung dieser Dinge jedoch weniger aufwendig als die Verwaltung einer separaten Warteschlangenlösung.


5

Wie schon andere erwähnt haben, ist hier der Maßstab wohl nicht wichtig. Das Problem bei der Verwendung von zwei verschiedenen Speichermechanismen ist die Transaktionsintegrität.

Wenn Sie eine dedizierte Nachrichtenwarteschlange verwenden, müssen Sie im Fehlerfall eine der folgenden Optionen auswählen.

  1. Erlaube, dass die Daten auf mb sein können, aber nicht in db
  2. Erlaube, dass die Daten in db aber nicht in mb sein können
  3. Richten Sie zweiphasige Festschreibungs- oder verteilte Transaktionen zwischen db und mq ein, was kompliziert sein kann

All diese Probleme gehen verloren, wenn Sie mit einer normalen Transaktion nur Daten an einem Ort speichern. Aus diesem Grund ist die Verwendung von db als Taskwarteschlange eine perfekte Lösung.


4

Aus praktischen Gründen habe ich folgende Hauptgründe für die Verwendung einer Nachrichtenwarteschlange:

  • Ich musste das Rad nicht neu erfinden. Das Entwerfen selbst der einfachsten Nachrichtenwarteschlange mithilfe einer Datenbank erfordert mindestens ein paar Stunden Bedenkzeit, ein paar Stunden Codierung usw. Im Vergleich zur Implementierung einer Nachrichtenwarteschlange ist der Zeitaufwand für die Konfiguration und / oder Automatisierung der Konfiguration gering
  • Nachrichtenwarteschlangen haben eine schöne und übersichtliche Oberfläche für Produzenten und Konsumenten. Dies ist wahrscheinlich das Wichtigste bei der schriftlichen Bewerbung. Ohne die Schnittstelle sind Nachrichtenwarteschlangen im Grunde genommen nur eine Sammlung von Daten
  • Nachrichtenwarteschlangen bieten weitere Funktionen, die möglicherweise in Zukunft benötigt werden

In Bezug auf das Zulassen der Benutzer zur Auswahl ist dies ein Implementierungsdetail, das die Benutzer nicht interessieren sollten. Benutzer sollten dieselbe Benutzeroberfläche erhalten und es sollte keinen Unterschied zu Benutzern geben, wenn die Datenbank oder die Nachrichtenwarteschlange verwendet wird. Sobald ein einzelnes Design festgelegt ist, müssen Benutzer wahrscheinlich festlegen, wie viele Knoten bereitgestellt werden sollen, um ihren Anforderungen gerecht zu werden.


1

Ich habe eine Mssql-Message-Queue-Lösung erstellt, die laut Leistungstest 20.000 Operationen pro Sekunde verarbeiten kann, und die meiste Zeit benötigen wir 10 / Sek. Ich denke, dass die Tatsache, dass Sie tatsächlich Priorität haben können, eine Funktion ist, die der dedizierten Nachrichtenwarteschlange fehlt. Und dies war in meinem Fall eine wichtige Voraussetzung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.