2017-02-15 1 views
0

nur wundernd über die Garantie der Ereignisbenachrichtigung Lieferung von der persistenten Ereignis bezogenen Akteur auf den Lese-Prozessor in Lagom, gibt es keine oder keine Nachricht Haltbarkeit für Ereignisbenachrichtigung an die gelesen Prozessor, der die Abfrageseite aktualisiert?Lagom Nachricht Haltbarkeit zwischen Persistent Actor und lesen Prozessor

Ich verstehe, dass es eine eventuelle Konsistenz gibt, die in Ordnung ist, aber ich spreche über die Event-Handler-Benachrichtigung an den Cassandra-Leseprozessor.

Antwort

1

Die Ereignisverarbeitung wird durch die Verwendung von Ereignisquellen in der persistenten Entitäts- und Versatzverfolgung in der Lese-Seiten-Verarbeitung gewährleistet.

Wenn Ihr persistenter Entity-Befehlshandler Ereignisse fortsetzt, wird jedes der Ereignisse mit einem geordneten "offset" gespeichert.

Lese-Side-Prozessoren arbeiten, indem sie die Datenbank nach Ereignissen mit Offsets abfragen, die größer als der letzte Offset sind, der bereits verarbeitet wurde. Da alle Ereignisse und der letzte Versatz des read-side-Prozessors alle in der Datenbank beibehalten werden, wird sichergestellt, dass Ereignisse nicht verpasst werden, selbst wenn ein reads-seitiger Prozessor abstürzt und neu startet.

Lagom der Cassandra lesen seitigen Prozessoren zurückkehren ein CompletionStage oder Future, die eine Liste von Cassandra BoundStatement Instanzen erzeugen, und diese werden in einem Atom Batch-Update zusammen mit dem Offset-Update durchgeführt. Solange alle Effekte Ihres lesenseitigen Event-Handlers in der Liste der von ihm erzeugten Updates erfasst werden, wird sichergestellt, dass das Ereignis einmal effektiv behandelt wird: Wenn ein Teil des Updates fehlschlägt, wird es automatisch erneut versucht.

Wenn Sie in Ihrem Event-Handler noch etwas anderes tun, müssen Sie sicherstellen, dass das Offset-Update nur dann erfolgt, wenn Ihr Event-Handler erfolgreich ist. Die CompletionStage oder Future Rückkehr der Ereignishandler muss erst abgeschlossen werden, nachdem Ihre Nebenwirkung tut, und der Erfolg oder Misserfolg Ihrer Operation sollte propagiert werden. Beachten Sie, dass Ihr Ereignishandler erneut versucht wird, wenn der Offset nicht aktualisiert wird. Wenn Ihr Ereignishandler beispielsweise mit einem externen Dienst interagiert, müssen Sie sicherstellen, dass er idempotent ist.

Sie sollten sich auch darüber im Klaren sein, wie eine mögliche Konsistenz die Dinge beeinflussen kann. Die akka-persistence-cassandraconfiguration reference hat einige Details:

Der zurückEreignisStrom durch den Offset (Zeitstempel) bestellt wird, die die Ereignisse gespeichert zu der gleichen Reihenfolge wie das Schreibblatt entspricht, mit Ungenauigkeit aufgrund Takt zwischen verschiedenen Skew Knoten. Die gleichen Stream-Elemente (in der gleichen Reihenfolge) werden für mehrere Ausführungen der Abfrage auf einer Best-Effort-Basis zurückgegeben. Die Abfrage verwendet eine Cassandra Materialized Ansicht für die Abfrage und das ist schließlich konsistent, so dass unterschiedliche Abfragen unterschiedliche Ereignisse für die letzten Ereignisse sehen können, aber das Ergebnis wird schließlich nach Zeitmarke (Cassandra timeuuid column) sortiert. Um die eventuelle Konsistenz zu kompensieren, wird die Abfrage verzögert, um die letzten Ereignisse nicht zu lesen. Die Dauer dieser Verzögerung wird durch diese Konfigurationseigenschaft definiert.

Dies ist jedoch nur Best-Effort und im Fall von Netzwerk-Partitionen oder anderen Dingen, die die Aktualisierungen der materialisierten Ansicht verzögern können die Ereignisse können in unterschiedlicher Reihenfolge geliefert (durch ihre Zeitstempel nicht streng).

Die wichtige Folge davon ist, dass, wenn die Latenz von eventueller Konsistenz ist länger als die konfigurierte Eventual Consistency Verzögerung (möglicherweise aufgrund einer Netzwerkpartition zwischen Cassandra Knoten), gibt es eine Möglichkeit, Ereignisse „verloren“ ist. Ein Lese-Side-Handler hat möglicherweise bereits ein neueres Ereignis verarbeitet und seinen Offset gespeichert, bevor ein älteres Ereignis an den Knoten gesendet wurde, von dem es gelesen wird. Möglicherweise müssen Sie Ihre Konfiguration entsprechend anpassen.

Verwandte Themen