我有一個這樣的系統只發送一次電子郵件:如何在分佈式系統中
- 節點讀取掀起了隊列中的事件。
- 使用AWS SES根據事件發送通知電子郵件。
這裏的問題可能出現的情況是:
其他一些節點也可以並行讀取事件的副本,因此現在2個電子郵件發送。
節點1讀取的情況下,使得「發送電子郵件」呼叫,然後不承認在發送的電子郵件死亡。節點1不知道電子郵件是否被髮送,所以在回來後重新發送。
如何確保電子郵件只發送一次?
我有一個這樣的系統只發送一次電子郵件:如何在分佈式系統中
這裏的問題可能出現的情況是:
其他一些節點也可以並行讀取事件的副本,因此現在2個電子郵件發送。
節點1讀取的情況下,使得「發送電子郵件」呼叫,然後不承認在發送的電子郵件死亡。節點1不知道電子郵件是否被髮送,所以在回來後重新發送。
如何確保電子郵件只發送一次?
我相信方案1通常是由最先進的排隊系統來處理。我認爲還有其他問題可以更好地解決像這樣的鎖定問題,所以我暫時忽略它。
關於方案2,最現代化的排隊系統處理同樣的問題 - 它基本上可以歸結爲一個關於要如何失敗的問題。
舉例來說,如果你有提供電子郵件兩次或不提供它之間做出選擇,你會選擇哪個?按照隊列的說法,這至少被描述爲一次交付。
對於這些問題的答案,我假設一個排隊系統類似的RabbitMQ使ACK和超時。
選項1 - 發送電子郵件兩次 嘗試發送電子郵件,如果成功,則將郵件發送到隊列。設置隊列,以便在超時後重新添加未查詢的消息。在這種情況下,如果在發送過程中發生故障,則不會發生確認,並且該消息將被重新發送到隊列中,然後再次提取。現在,如果一致的失敗(但不是你的電子郵件),你可能會在你繼續發送電子郵件的情況下結束。但大多數時候,這不應該是一個問題。
選項2 - 未發送電子郵件 設置無確認隊列。這通常更高性能,所以這是一個優點。隊列工作人員將從隊列中接收消息並嘗試發送電子郵件。如果電子郵件發送失敗,則不會重試。
對於很多,我的工作服務的(這並不適用於電子郵件,但適用於寫入到DB),我儘量讓他們冪等,然後就一起去的第一個選項。在最糟糕的情況下,你會寫道,但希望你有日誌記錄來檢測這個。
你正在使用什麼類型的隊列?大多數現代排隊系統都應該有助於情景1,至少您可以設置最多一次的送貨。此外,您可能必須在至多一次或至少一次之間進行選擇。你會選擇哪種方案? – patwhite
這個問題是關於SQS的嗎?因爲答案會有所不同,具體取決於您使用哪個隊列系統以及該系統支持的內容。 –
你可以假設SQS爲這個問題 – pdeva