想象一下,我有一個訊息佇列,我在其中放置訊息說我想向用戶發送電子郵件。
如果我使用提供“至少一次”傳遞保證的訊息代理,那么從我讀過的所有資源中,他們會說“你必須確保你的處理是冪等的”。
但是,在發送電子郵件等副作用的情況下,我不明白這是怎么可能的。
我有兩種可能的選擇:
- 將訊息 ID 存盤在我的資料庫中,然后發送電子郵件。
- 發送電子郵件,然后將訊息 ID 存盤在資料庫中。
收到訊息后,我會檢查資料庫以查看訊息 ID 是否存在。如果是這樣,我會跳過該訊息作為重復。
但是,第一種情況在發送電子郵件時給我留下了“最多一次”語意(如果發送電子郵件失敗,下次看到訊息時將跳過它),第二種情況給我“至少一次”語意(如果在資料庫中存盤 ID 失敗,我最終會發送多封電子郵件)。
我讀過的一些東西說“你需要一個支持冪等性的電子郵件 API”,但據我所知,這只是將問題推到了他們的服務器上——他們仍然面臨同樣的困境。
我在這里錯過了什么嗎?或者當處理具有外部副作用時,是否不可能進行冪等訊息處理?
uj5u.com熱心網友回復:
我將聲稱電子郵件本質上不支持一次性語意。當使用 SMTP 協議時,你的一方總是會在遠端確認和你堅持確認之間崩潰。你最好的選擇是使用至少一次語意。
但是您可能會獲得一次性的 UX 體驗。如果每次發送/重新發送訊息時都使用相同的訊息 ID,則客戶端(郵件客戶端)可能會重復這些訊息。有關詳細資訊,請參閱https://en.wikipedia.org/wiki/Message-ID。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/474786.html
上一篇:通過c#發送帶附件的電子郵件
