2重リクエストにおける「銀の弾丸」は存在しない
2重リクエストという難題において、あらゆる状況を解決できる「銀の弾丸」は存在しない。フロントエンドでのボタン制御で発生確率を下げ、データベースのユニーク制約やロック機構で最終的なデータの整合性を死守し、さらにその中間層であるAPIエンドポイントにおいて、Idempotency-KeyやRate Limitを用いてドメイン特有のビジネスロジックを制御する。このように、異なるレイヤーで複数の防御網を張り巡らせるアプローチが、現代の複雑なWebシステムには不可欠である。
本講演で紹介した防御策
また、技術選定において常に「実装コスト」と「障害発生時の運用コスト」の天秤を意識している点も大きな示唆を与えている。すべての機能に対してIdempotency-KeyやOne-Time Tokenといった高度で実装難易度の高い仕組みを導入することは、開発の遅延やパフォーマンスの劣化を招く。
自社のサービスにおいて、どのデータがどの程度の一貫性を要求されるのか(例えば、SNSの「いいね」の重複と、銀行口座からの引き落としの重複では、求められる厳密さが全く異なる)を見極めることが肝要だ。
スマートバンクにおける、バーチャルカードの異常発行に対して、複雑なロック制御を見送り、シンプルなRate Limitで解決を図った事例は、ビジネス上のリスクを評価し、最小の労力で最大の効果を得る「エンジニアリングの最適解」を体現していた。
本セッションで紹介した防御策を、2重リクエスト対策の拠り所に
三谷氏は講演の最後に「今後あまり悩まなくてよい世界を目指したい」と語り、今回紹介した9つの手法を日々の業務の拠り所にしてほしいと呼びかけた。
SaaSの普及やマイクロサービスアーキテクチャの浸透により、システムが単独で完結することは少なくなり、外部APIとの連携を前提とした開発が今後のスタンダードとなっていく。それに伴い、通信の不安定さや外部システムの挙動に起因する2重リクエストのリスクは、金融業界に限らずあらゆるビジネスドメインで増大していくことが予想される。
今回のセッションで紹介された設計思想は、多くのサーバーサイドエンジニアにとって有用なものになるだろう。
