wake-up-neo.com

MongoDB als Warteschlangendienst?

Ich würde gerne mehr über echte Anwendungserfahrungen mit MongoDB als Warteschlangendienst erfahren. Wenn Sie MongoDB für diesen Zweck verwenden, könnten Sie Ihre Gedanken und die Umgebung, in der es verwendet wurde, mitteilen.

33
Avi Kapuya

Ich verwende Mongodb als Warteschlangendienst für das Senden von E-Mails. Bald wird es auf folgende Weise funktionieren:

  1. Wenn eine neue Nachricht eingeht, speichere ich sie in der Mongodb.
  2. Ein Hintergrundjob lädt dann die Nachricht von mongodb über die atomare Operation findAndModify und setzt das Flag Processing auf true, sodass dieselbe Nachricht nicht zweimal verarbeitet wird (da mein Hintergrundjob mehrere Threads parallel ausführt).
  3. Sobald die E-Mail gesendet wurde, entferne ich das Dokument von Mongodb.
  4. Sie können auch die Fehler für jede Nachricht zählen und nach drei fehlgeschlagenen Versuchen entfernen.

Im Allgemeinen verwende ich mongodb als Warteschlangendienst nur aus einem Grund: weil ich E-Mails nach einem bestimmten Zeitplan senden muss (jede Nachricht enthält Informationen zu der Uhrzeit, zu der sie gesendet werden soll).

Wenn Sie keinen Zeitplan haben und die Nachricht sofort verarbeiten müssen, schlage ich vor, die vorhandenen queue-Dienste zu prüfen, da sie wahrscheinlich alle Fälle behandeln, die Sie möglicherweise nicht ohne tieferes Verständnis der Nachrichtenwarteschlangen sehen. 

Aktualisieren

Wenn der Hintergrundjob während der Nachrichtenverarbeitung abstürzt, können Sie Folgendes tun:

  1. Verschieben Sie diese Nachricht in eine andere Meldungswarteschlangenauflistung oder .. 

  2. Erhöhen Sie den Verarbeitungsversuchszähler in einer Nachricht und weisen Sie erneut den Status "Neu" zu, um die Verarbeitung erneut zu versuchen. Stellen Sie einfach sicher, dass der Hintergrundjob idempotent ist (kann dieselbe Nachricht mehrmals verarbeiten und keine Daten beschädigen) und transaktional sein (wenn der Job fehlschlägt, müssen Sie eventuell vorgenommene Änderungen rückgängig machen.) Wenn der Job nach 5 Versuchen (Konfigurationswert) fehlschlägt, führen Sie # 1 aus.

  3. Nachdem der Fehler bei der Nachrichtenverarbeitung behoben wurde, können Sie ihn erneut bearbeiten, indem Sie den Status "Neu" zuweisen und in die Nachrichtenwarteschlange wechseln oder diese Nachricht einfach löschen. Das hängt tatsächlich von den Geschäftsprozessen ab. 

39
Andrew Orsich

Ich weiß, dass diese Frage aus dem Jahr 2012 stammt, aber während meiner eigenen Recherche habe ich diesen Artikel gefunden und möchte nur jeden anderen Benutzer darüber informieren, dass die Entwickler von serverdensity rabbitmq durch ein einfaches Warteschlangensystem mit mongodb ersetzt haben. 

Ein ausführlicher Artikel wird hier gegeben:

https://blog.serverdensity.com/replacing-rabbitmq-with-mongodb/

5
Fer To

Hier ist ein großer Artikel , in dem erklärt wird, wie jemand das Replikationsprotokoll von mongoDB als Warteschlange verwendet.

Sie können dasselbe mit einer anderen Sammlung tun. Der wichtigste Ratschlag scheint die Verwendung einer Capped-Collection zu sein - Mongo-Treiber verfügen über effiziente Möglichkeiten, auf eine Capped-Collection zu warten, sodass der Client nicht ständig abfragt.

2
Sean Reilly

Hier ist meine Python-Implementierung von PubSub/queue Sie funktioniert entweder mit einem abschließenden Cursor auf einer begrenzten Sammlung oder dem Abfragen einer normalen Sammlung ..__ Ergebnisse. Natürlich, wie jemand schon erwähnt hat, bis Sie an die Grenzen des atomaren findAndModify kamen, aber das kann durch verschiedene Techniken erledigt werden

0
nickmilon

Ich habe viel gesucht und die JavaScript-Version https://github.com/chilts/mongodb-queue gefunden. Aber ich möchte eine Go-Version, also Eine einfache Implementierung in Go, einschließlich eines Managers zum Abfragen von Nachrichten, wurde gemacht: https://github.com/justmao945/mongomq

0
justmao945

Hier ist eine einfache Nachrichtenwarteschlange Implementierung .

Es ist ein Teil von article , das die Leistung verschiedener Message-Queue-Systeme bewertet.

Mit einem Single-Thread-Setup mit einem Knoten werden 7 900 msgs/s gesendet und 1 900 msgs/s empfangen.

0
Neil