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.
quelle
Antworten:
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.
quelle
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.
quelle
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.
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.
quelle
Aus praktischen Gründen habe ich folgende Hauptgründe für die Verwendung einer Nachrichtenwarteschlange:
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.
quelle
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.
quelle