Safe Retry with Idempotency-Key Header

商品を注文する、顧客にお金を請求する、他人の口座に送金する…。このような、不可逆で二重に行われてほしくない処理をネットワーク越しにリクエストすることがしばしばあります。もしこれらの処理のリクエストにて通信が失敗するとどうなるでしょうか?

通信エラーに直面したクライアントはリトライするかもしれません。しかし1回目のリクエストでサーバ側の処理が完了していた場合、リトライにより処理が複数回行われてしまう可能性があります。

この問題を解決する鍵は冪等性です。サービス呼び出しが冪等、つまり「同一リクエストを何度受け取っても結果が変わらない」仕組みをサーバが備えていれば、クライアントは通信が成功するまでリトライできるようになります。

その仕組みの1つがIETF draftとして提出されているIdempotency-Key Headerです。これはRFC7231にて冪等ではないとされるPOST/PATCHリクエストを冪等にするためのソリューションで、PayPalやStripeなど一部ベンダーは既に類似実装を各社のAPIに適用しています。

このセッションではIdempotency-Key Headerが解決する課題とコンセプトを解説し、Rubyアプリケーションにおける実装例を紹介します。例の一つは私が携わる金融サービスで設計・実装したものであり、運用を通じて得られた知見も交えてお話します。

アバター画像
ohbarye

Programmer at SmartBank