【アットレーストワンスはいしん】
At-least-once配信 とは?
最終更新:
💡 届いた確認が取れなければ、同じメッセージを再配信
保存と再試行などの前提の下で、メッセージを少なくとも1回配信する保証。同じメッセージが複数回届く可能性があるため、処理結果を重複させない設計が重要。
📌 このページのポイント
- 少なくとも1回の配信を保証する方式。保存や再試行などの前提条件を確認する
- 処理後の確認が届かないと、同じメッセージが再配信されることがある
- 受信回数が増えても結果を重複させない、冪等な処理を設計する
- Amazon SQSの標準キューなどで使われる。Kafkaでは処理と位置の記録の順序も関係する
At Least Once配信ってどういう意味?
少なくとも1回の配信を保証する方式だよ。同じメッセージが2回以上届く可能性はある。保存や再試行、障害からの復旧などの条件の下での保証で、どんな障害でも永久に届くという意味ではないんだ。
なぜ同じメッセージが2回届くの?
受信側が処理を終えても、その確認が配信側に届かないことがあるからだよ。配信側は完了を確認できず、もう一度同じメッセージを配信する。SQSの標準キューでは、冗長なコピーの一部を削除できず再び受信する場合もあるんだ。
受け取る側はどう対処するの?
同じメッセージを何度処理しても、一度処理したのと同じ結果になる冪等性を持たせるよ。例えば処理済みIDを記録して重複を除く。ただし、IDの記録と実際の更新が食い違わないようにし、同時実行も考える必要があるんだ。
どんなシステムでも、届くまで残るの?
仕様と設定によるよ。例えばSQSには保存期間があり、期限を超えたメッセージを永久には保持しない。Kafkaでも、処理してから消費位置を記録する構成では、記録前の障害で同じものを再処理し得る。製品名だけで保証範囲を決めないようにしよう。
Exactly Onceとの違いは?
Exactly Onceは、対象範囲で処理結果が一度分になるようにする保証として使われるよ。受信処理が物理的に一度しか呼ばれないとは限らない。Kafka内の処理の保証を、外部のデータベースへの更新などに広げるには、相手側との協調も必要なんだ。
もっと詳しく知りたい人へ
処理済みIDを保存するだけで二重更新を防げる?
保存と更新を別々に行うだけでは不十分だよ。同じDBで扱えるなら、処理済みIDを一意なキーで挿入し、実際の更新と同じトランザクションで確定する方法がある。失敗したら両方を取り消し、重複IDなら更新しない。外部APIの呼び出しなど、同じトランザクションに入らない処理には別の重複対策が必要だよ。
まとめ:ざっくりこれだけ覚えればOK!
「At Least Once」って出てきたら「重複を許して再配信する方式」と思えばだいたいOK!保証の条件と、重複への対処も確認しよう。
📖 おまけ:英語の意味
「At Least Once Delivery」 = 少なくとも1回の配信
💬 at leastは「少なくとも」、onceは「1回」という意味だよ。配信は重複し得るので、処理結果を一度分にする設計とは区別するんだ。