イベント駆動型アーキテクチャと冪等性の紹介
イベント駆動型アーキテクチャの台頭
現代のeコマースシステムはしばしばスケーラビリティと応答性を確保するためにイベント駆動型アーキテクチャに依存しています。たとえば、ユーザーが注文をすると、”注文完了”、”支払い処理完了”、”在庫更新”などのイベントが非同期でトリガーされます。
分散システムにおける冪等性の重要性
分散システムでは、ネットワークの障害によってイベントが重複したり再試行されたりすることがあり、重複した注文や正確でない在庫調整などの問題が発生します。冪等性は、イベントを複数回処理しても1回処理した場合と同じ結果が得られることを保証します。
冪等性の理解
冪等性とは何ですか?
冪等性は、操作が何度実行されても同じ効果が得られることを保証します。たとえば、ネットワークの問題により”注文する”APIが2回呼び出された場合、1つの注文のみが作成されるべきです。
冪等性と他の障害耐性メカニズム
冪等性は再試行時の正確性に焦点を当てていますが、再試行やサーキットブレーカーなどの障害耐性メカニズムは障害に対処しますが、重複を防ぐことができないかもしれません。
冪等性の達成における課題
重複イベントの一般的な原因
- ネットワーク障害: AWS API GatewayのようなAPIゲートウェイは、応答が迅速に受信されない場合にリクエストを再試行する可能性があります。
- リトライと確認の遅延: 支払いゲートウェイは、確認が遅れた場合に「支払い確認」イベントを再送信する場合があります。
- 不良プロデューサーまたはコンシューマー: 電子商取引チェックアウトマイクロサービスは、システム内のバグにより重複した「注文作成」イベントを生成する可能性があります。
アイデンポテンシーなしの潜在的な落とし穴
- データの不整合: 重複する「在庫更新」イベントの処理は、正しい在庫レベルにつながる可能性があります。
- ビジネスロジックの障害: 同じ注文に対して顧客に2回課金することは、信頼を傷つけ、払い戻しの問題を引き起こす可能性があります。
電子商取引プロセスフローダイアグラム
次の図は、eコマースプラットフォームのさまざまなコンポーネント間の操作と相互作用のシーケンスを示しています。これは、製品を閲覧することから購入を完了し、注文を追跡するまでの顧客の旅を強調しています。この図は通常、ユーザーインタラクション、バックエンドシステムのワークフロー、支払い処理、在庫更新、配送メカニズムなどのコアプロセスを含みます。このフローは、さまざまなコンポーネントがどのように相互作用してシームレスなショッピング体験を提供するかの全体的なビューを提供します。また、支払い処理や在庫更新などの重要なワークフローにおいて冪等性を実装することで、ネットワークの不具合や再試行にもかかわらず、システムが信頼性と一貫性を保つことを確保します。一部のAWSサービス、例えばAWS SQS FIFOキュー、DynamoDB、およびSNSを採用することで、イベント駆動型アーキテクチャにおける冪等性の実装が大幅に簡素化される可能性があります。
図の主要プロセス
1. ユーザーの閲覧と検索
- ユーザーは製品カタログを閲覧するか、特定のアイテムを検索します。
- バックエンドは、製品カタログサービスからデータを取得します。これは、より迅速な結果を得るために、しばしばAWS ElastiCacheを使用してキャッシュされます。
2. ウィッシュリスト管理
- ユーザーはアイテムをウィッシュリストに追加できます。
- 操作は冪等性があり、同じ製品が複数回追加されないようにします。
3. カートに追加とチェックアウト
- 製品はショッピングカートに追加され、冪等性のある数量調整が行われ、重複を防ぎます。
- チェックアウト時には、システムがカートの内容を確認し、合計金額を計算します。
4. 支払い処理
- 決済ゲートウェイが取引を開始します。
- 冪等性により、ゲートウェイのタイムアウトにより再試行が発生しても、単一の支払いが処理されます。
5. 注文の確定
- 支払いが成功すると、「注文確定」イベントがトリガーされます。
- システムは注文記録を作成し、冪等性により重複注文の作成を防ぎます。
6. 在庫更新
- 在庫は確定した注文に基づいて調整されます。
- 冪等性のある更新により、重複または再試行イベントがあっても在庫レベルが正確になります。
7. 注文の履行と配達
- 注文の状態は「処理中」、「発送済み」、「配達済み」といった段階を進行します。
- 更新は冪等性があり、重複イベントからの不正確な状態変更を避けます。
8. 注文追跡と通知
- ユーザーは自分の注文状況を確認できます。
- 通知(例:メール/SMS)は冪等的に送信され、ユーザーに重複したスパムを送信することを避けます。
冪等性の要件
1. カート更新
同じ製品を2回追加すると、数量が更新され、重複したカートエントリが作成されるべきではありません。
- 実装: ユニークなカートアイテム識別子と条件付き更新を使用します。DynamoDB。
2. 支払いゲートウェイ
支払いの再試行は重複請求につながってはなりません。
- 実装: 完了したトランザクションを追跡するために
IdempotencyKey
をDynamoDBに保存します。
3. 注文の配置
リトライからの重複した「注文作成」イベントは複数の注文を作成してはいけません。
- 実装: ユニークな
orderID
と条件付きのPutItem
操作をAWS DynamoDBで使用します。
4. 在庫の更新
在庫レベルの調整はオーバーリダクションを避けるためにリトライを考慮する必要があります。
- 実装: 同時更新を処理するために分散ロック(例: AWS DynamoDB TTL)を使用します。
5. 通知
イベントによってトリガーされたメールやSMS通知は一度だけ送信されるべきです。
- 実装: サービス(例: Amazon Simple Notification Service (SNS))と組み合わせて重複排除キーを使用します。
結論
イベント駆動型システム、特にeコマースプラットフォームやAWSのようなクラウドアーキテクチャにおいて、冪等性は信頼性、障害耐性、データ整合性を保証するために不可欠です。堅牢な冪等パターンを実装し、DynamoDB、SQS、SNSなどのツールを活用することで、開発者はリトライや重複イベントによって引き起こされるリスクを軽減できます。このガイドでは、これらの実践を採用することでシステムの信頼性が向上するだけでなく、シームレスでエラーのないエクスペリエンスを提供することでユーザーとの信頼を築く方法を示しています。レジリエントでスケーラブルなシステムの需要が高まる中、冪等性をマスターすることは現代のソフトウェア設計の基礎となります。
Source:
https://dzone.com/articles/idempotency-and-reliability-in-event-driven-systems