簡體   English   中英

Akka 持久性 - 當收到消息傳遞的確認時,從日志中刪除消息(或標記為已確認)

[英]Akka persistence - remove messages from journal (or mark as confirmed), when recieve confirmation of message delivery

例如:我有演員 X 和 Y。

Actor X 將消息持久化到日志,然后將消息發送給 Y。Y 接收消息,並將確認發送回 X 以使其知道已收到消息。 當 X 收到此確認時,我希望它 a) 從日志中刪除該消息,以便在恢復時不會重播該消息。 (這部分似乎不可能)。 b) 將消息“標記”為已完成(已發送)。 我認為這部分將通過日志(使用日志恢復)或通過向日志添加“標簽”(通過事件適配器,但我不確定這是否可能會更新是否可行)來完成。

這讓我意識到,akka 持久性實際上是如何工作的。 如果一個actor正在持久化所有消息,然后actor失敗並需要恢復,那么無論是否交付,它都不會恢復所有這些消息嗎? 我知道這是為了維護狀態(所以對於 fsm 我明白了),但是如果我有一個主管角色將消息持久化然后傳遞給工人,我當然希望能夠更改此日志條目,以便我無法恢復(然后重新發送)已經處理過的消息? (所以這就是我問的原因,我顯然錯過了一些東西)

Akka 持久性實現了事件溯源,這通常不適合隊列(這並不意味着不可能做到)。

對於事件源工作管理器,您將記錄一個事件,其中將工作負載發送給工作人員,然后將其應用於參與者的狀態,例如正在進行的工作列表,然后發送實際工作。 當工作負載完成時,您記錄該事實,從狀態中刪除正在進行的項目,以便如果工作經理重新啟動它可以與工作人員聯系以查看工作是否仍在進行中或與其他工作人員重新觸發它等等。

分布式工人樣本不包括重新交付部分 AFAIR,但可能是一個很好的靈感來源。

使用新類型的EventSourcedBehavior您可以以聲明方式啟用快照和事件刪除https://doc.akka.io/docs/akka/current/typed/persistence-snapshot.html#event-deletion而使用經典的PersistentActor則需要更多deleteMessages https://doc.akka.io/docs/akka/current/persistence.html#message-deletion

對於經典角色,有建立在持久性之上的At-Least-Once-Delivery ,而對於新的 API,我們正在進行稱為Reliable Delivery 的工作,這將允許更大程度地選擇您所追求的可靠性級別。

請注意,這取決於您使用的日志是事件被實際刪除還是標記為已刪除以及以多快的速度被刪除,因此您還必須查看其中的詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM