2016-06-21 19 views
0

Ich versuche, einen Kopf, um ein Problem, das ich vor kurzem angetroffen habe, und ich hoffe, jemand wird in der Lage sein, mir in die vernünftige Richtung der Lösung zu zeigen.Der beste Weg, um Timings auf Rabbitmq Nachricht Verarbeitung zu behandeln

Ich benutze Riak KV-Speicher und arbeite an CRDT-Daten, wo ich eine Art von Zähler in jedem CRDT-Element in der Datenbank gespeichert habe.

Ich habe eine Rabbitmq-Warteschlange, in der jede Nachricht eine Anforderung ist, eine bestimmte Anzahl der oben genannten Zähler zu erhöhen oder zu verringern.

Schließlich habe ich eine Gruppe von Service-Mitarbeitern, die in der Warteschlange wartet und für jede Anfrage versuchen, die Anzahl der Zähler entsprechend zu ändern.

Das Problem, das ich habe, ist wie folgt: Während ein einzelner Worker eine Anfrage verarbeitet, kann es für eine Weile bei einem Schreibvorgang in der Datenbank stecken bleiben - sagen wir bei einer zweiten Änderung der Zähler von drei. Es ist Verbindung mit Rabbitmq verloren (Timeout), so dass die Nachricht-Anfrage wieder in die Warteschlange (ich kann es mir nicht leisten, einen zu verpassen). Dann wird es vom zweiten Arbeiter aufgenommen, der die gesamte Bearbeitung neu beginnt. Der erste Arbeiter beendet jedoch seine Arbeit, und als Ergebnis habe ich eine einzige Nachricht zweimal verarbeitet.

Ich kann diese Inkremente in einzelne Aktionen aufteilen, aber dies lässt mich immer noch mit Dilemma - kann den Wert des Zählers immer noch zweimal ändern, wenn ein Arbeiter für lange Zeit in einer Schreiboperation stecken bleibt.

Ich habe keine Möglichkeit, Riak KV CRDT schreiben funktioniert schneller, noch kann ich akzeptieren, eine Nachricht-Anfrage zu verpassen. Ich muss einige Mittel implementieren, um zu überprüfen, ob eine Anfrage bereits zuvor bearbeitet wurde. Meine anfänglichen Gedanken waren, einen alternativen, schnellen KV-Speicher zu verwenden, um die rabbitMQ-Nachrichten-ID zu speichern, wenn sie verarbeitet werden. Auf diese Weise konnten andere Mitarbeiter feststellen, ob sie nicht damit beginnen, eine Nachricht zu verarbeiten, die bereits an anderer Stelle analysiert wurde. Ich könnte jede Hilfe und Hinweise auf Materialien verwenden, die ich lesen kann.

Antwort

1

Sie können nicht "genau eine Lieferung" Semantik haben. Sie können doppelt gesendete Nachrichten oder verpasste Lieferungen reduzieren, so dass Sie entscheiden müssen, welches Fehlverhalten am wenigsten unbequem ist.

Zuerst sind Sie sicher, dass es die CRDTs sind, die zu langsam sind? Verwenden Sie einfache Zähler oder Zähler in Karten? Meiner Erfahrung nach sind sie ziemlich schnell, obwohl langsamer als kv. Sie könnten versuchen: - mit einfachen CRDTs (keine Karten) und mehr CRDTs Objekte, um ihre Belastung zu senken (können Sie die Zähler in zwei teilen?) - nicht mit CRDTs aber mit guten alten Geschwister-Auflösung auf der Client-Seite auf einfachen Schlüssel /Werte. - akkumulieren Sie die Anzahl der Aktualisierungsbestellungen und wenden Sie sie im Stapel an, aber dann akzeptieren Sie eine Erhöhung der Latenz, was einer Erhöhung des Zeitlimits gleichkommt.

Können Sie einige Messwerte bereitstellen? Wie lange die Updates dauern, welche Zahlen Sie erwarten würden, wenn es so langsam ist, wenn Sie nur wenige Updates oder viele Updates haben, usw.