2017-02-15 64 views

回答

1

通過在持久化實體中使用事件源以及在讀取側處理中使用偏移量跟蹤來保證事件處理。

當您的持久實體命令處理程序持續發生事件時,每個事件都將與有序的"offset"一起存儲。

讀取端處理器通過輪詢數據庫來查找偏移量大於已處理的最後偏移量的事件。由於所有事件和每個讀取端處理器的最新偏移量都保留在數據庫中,因此即使讀取端處理器崩潰並重新啓動,也可確保事件不會丟失。

Lagom的卡桑德拉讀出側處理器返回CompletionStageFuture產生卡桑德拉BoundStatement實例的列表,並且這些在原子批更新與偏移更新一起執行。只要您的讀取端事件處理程序的所有效果都在其生成的更新列表中捕獲,就可以確保該事件將被有效處理一次:如果部分更新失敗,它將自動重試。

如果您在事件處理程序中執行其他任何操作,則需要確保只有在事件處理程序成功時纔會發生偏移量更新。事件處理程序返回的CompletionStageFuture必須只在副作用完成後完成,並且應該傳播操作的成功或失敗。請注意,如果偏移量未更新,您的事件處理程序將被重試,因此,如果您的事件處理程序與外部服務交互,則需要確保它是冪等的。

您還應該意識到最終一致性會如何影響事物。該akka-persistence-cassandraconfiguration reference有一些細節:

返回的事件流由偏移(時間戳),其對應 於相同的順序寫入日誌存儲的事件,與不準確性由於時鐘有序不同間偏差 節點。以盡力而爲的方式返回相同的流元素(以相同的順序)以執行查詢的多個 。該查詢使用Cassandra Materialized 視圖進行查詢並且最終一致,因此不同的查詢可能會針對最新事件看到不同的 事件,但最終結果將按時間戳 (Cassandra timeuuid列)排序。爲了彌補最終一致性,查詢 延遲不讀取最新事件,此延遲的持續時間由此 配置屬性定義。

然而,這只是盡力而爲和網絡分區 或其他的東西,可能會延遲事件可以按照不同的順序 交付的物化視圖的更新的情況下(不完全由他們的時間戳)。

重要的結論是,如果最終一致性的等待時間大於配置最終一致性延遲(可能由於卡桑德拉節點之間的網絡分區)更長的時間,存在正在「丟失」事件的可能性。讀出側處理器可能已經處理的新事件,並在存儲前的舊事件已交付,它是從閱讀節點的偏移。您可能需要相應地調整您的配置。