2016-07-26 132 views
1

在我的應用程序中,我有一個服務可以響應各種用戶事件發送電子郵件。一直存在的問題是,由於某種原因,電子郵件發送將失敗,因此我們放棄該消息並且不要嘗試重試。此故障模型中包含JVM關閉。規則是重複的電子郵件不應該發生,並且不發送電子郵件是非常不希望的,但是可接受的。基本上我們應該能夠重試而不用擔心重複。Akka未處理消息的持久性

Akko-Persistence會出現在表面以解決上述問題,但它似乎適用於存儲所有消息,然後重播他們的子集來恢復。

期望的行爲是,當演員恢復時,重播任何未處理的消息(包括髮生故障時處理的消息)。另外,如果系統被退回,則發送任何未決的電子郵件。

是否有一些我錯過的Akka文檔或簡單的方法來完成上述?

對於我們正在評估阿卡2.4.8本記錄:http://doc.akka.io/docs/akka/2.4.8/

回答

2

正好一次傳遞可能無法保證,但你可能可以爲這種使用情況下足夠接近。

如果你得到一個異常或某種回調時發送失敗和東西,你可以爲某個確認看到成功的話,你可以這樣做:

給每個郵件的唯一ID,並保持持久演員的狀態,其中包括在飛行中的郵件,只發送郵件後,堅持事實,你要發送它,當郵件已確認要發送,將其從飛行中刪除。

這將在事件日誌中產生兩個域事件,類似MailSentMailSendConfirmed。演員重播完成後,重新啓動後,您可以重新發送在飛行中但未確認的郵件。

當然,如果你想採取一切可能發送失敗的電子郵件,那麼它會更困難(發送完成,但郵件彈跳,因爲電子郵件地址拼寫錯誤)。