Google Cloud Next Tokyo:7/30、31 東京ビッグサイトにて開催!

べき等性とは

コンピュータ サイエンスにおけるべき等性とは、オペレーションを複数回行っても、1 回だけ行った場合と同じ最終的な効果が得られるという特性です。同じリクエストをサーバーに 5 回送信した場合、べき等システムでは、最初の試行が問題なく完了した後、サーバー側のシステム状態が変わらないことを保証します。

べき等オペレーションの重要な特徴は、同じ結果が保証されることだけでなく、追加の呼び出しによって副作用が発生しないことです。これは、断続的なネットワーク障害やタイムアウトによってクライアントが同じメッセージを複数回送信する可能性がある、復元性のある分散システムを構築する際の必須要件です。

例: エレベーターの「上」ボタンを思い浮かべてみてください。1 回押すと、エレベーターが自分の階に呼び出されます。待っている間にさらに 10 回押しても、結果は同じで、エレベーターは 1 台しか来ません。ボタンを複数回押しても、エレベーターが 10 台来るわけではありません。一方、デジタル ショッピング カートにアイテムを追加する操作は、通常はべき等ではありません。[カートに追加] ボタンを 5 回クリックすると、その商品が 5 個カートに追加されることになります。

べき等システムの主なメリット

タイムアウトや接続の切断後にリクエストを安全に再試行し、アクションの重複(クレジット カードの二重請求など)を回避できます。

ユーザーは、以前のリクエストが成功したかどうかを知るために、複雑な状態トラッキングを行う必要はありません。単に「成功するまで再試行」すればよいのです。

分散システムは、ログを確認したり、見逃したメッセージを再送信したりすることで、データを破損させることなく障害から復旧できます。

べき等 HTTP メソッドと非べき等 HTTP メソッド

REST 標準では、さまざまな種類のウェブ リクエストの動作が定義されています。HTTP メソッドの中には、設計上「安全」またはべき等であるものがあります。つまり、仕様上、繰り返されても予測可能な動作をすることが期待されています。一方、新しいデータを作成するように設計されているものもあり、その場合、再試行を安全に行うために、特別な注意が必要です。

べき等メソッド(GET、PUT、DELETE)

RFC 9110 によると、いくつかの標準メソッドは本質的にべき等です。これらのアクションを繰り返しても、最初のリクエスト以降、サーバーの状態は変わりません。

  • GET: このメソッドはデータを取得します。サーバーでは何の変更も生じないため、100 万回呼び出してもリソースは同じままです。
  • PUT: このメソッドはリソースを完全に置き換えます。ユーザーのメールアドレスを「user@example.com」に 3 回更新しても、最終的な状態は「user@example.com」のままです。
  • DELETE: リソースを削除します。「注文番号 123」を削除してからもう一度削除しようとしても、注文は削除されたままです。結果(注文が消える)は同じです。

非べき等メソッド(POST、PATCH)

一部のメソッドは、新しいデータを作成したり、既存のレコードの一部を変更したりする方法でデータを変更することが主な役割であるため、べき等ではありません。

  • POST: 開発者は POST を使用して新しいリソースを作成します。べき等性のロジックがない場合、同じ POST リクエスト(「支払いを送信」など)を 2 回送信すると、通常は 2 つの別々のレコードが作成され、お客様に 2 回請求されます。
  • PATCH: このメソッドは部分的な更新を適用します。べき等にすることは可能ですが、デフォルトではそうでないことがよくあります。相対的な変更(「残高に 5 を追加する」など)を繰り返すと、呼び出されるたびに異なる最終値になるためです。

べき等 API の実装方法

  1. 一意のキーを生成する: クライアントは一意の文字列(UUID など)を作成し、カスタム HTTP ヘッダーに含めます。
  2. インターセプトと検証: サーバーは、Memorystore などの高速データストアをチェックして、そのキーが最近処理されたかどうかを確認します。
  3. 状態の処理: キーが新しい場合は、リクエストを処理して結果を保存します。重複している場合は、ビジネス ロジックを再実行せずに、保存された結果をすぐに返します。

べき等性の一般的なユースケース

構築するシステムでは、べき等性が求められることがよくあります。場合によっては、べき等性を自ら確保しなくてもよいことがありますが、そうでない場合は、デベロッパーが自ら対応し、べき等性を確保する必要があります。

最も有名な例は「二重請求」の問題です。ユーザーが航空券の支払いをしようとしているときにブラウザがフリーズした場合、ユーザーは [支払う] をもう一度クリックする可能性があります。べき等キーを使用する決済 API では、2 回目のクリックが再試行として認識されます。これにより、お客様の銀行口座が保護され、重複した取引の払い戻し処理にかかる運用コストが削減されます。

  • デベロッパー側で必要な対応: 2 回目のクリックが再試行として認識されるように、API リクエストにべき等キー(多くの場合 UUID)を実装して、お客様の銀行口座を保護する必要があります。

Terraform や Ansible などのツールはべき等性に依存しています。「10 GB のストレージ バケットを作成する」スクリプトを実行すると、ツールはクラウドの現在の状態を確認します。

  • 自動処理: べき等性は IaC ツール自体によって管理されます。開発者は、リソースの重複を防ぐための追加のロジックを記述する必要はありません。

最新のウェブ API では、デベロッパーがより堅牢な統合を構築できるように、Idempotency-Key ヘッダー(現在は IETF の標準化されたドラフト)が実装されていることがよくあります。

  • デベロッパー側で必要な対応: バックエンドを構築する際は、これらのキーをインターセプトし、以前の試行をチェックして、キャッシュに保存されたレスポンスを返すロジックを実装する必要があります。

「upsert」(更新または挿入)は、従来のべき等データベース オペレーションです。単純な「挿入」ではなく、upsert は「このレコードが存在する場合は更新し、存在しない場合はレコードを作成する」というものです。

  • 自動処理: このロジックはデータベース エンジンによってネイティブに処理されるため、スクリプトの実行回数に関係なく、レコードは正しい状態に収束します。

Google Cloud でビジネスの課題を解決する

新規のお客様には、Google Cloud で使用できる無料クレジット $300 分を差し上げます。
お客様独自の課題については、Google Cloud のセールス スペシャリストまで詳しくご相談ください。

Google Cloud で信頼性の高いマイクロサービスを構築する

Google Cloud には、デベロッパーがこれらのパターンを簡単に実装できるツールがいくつか用意されています。マネージド プラットフォーム上に構築することで、データの安全性を確保するために記述する必要がある「ボイラープレート」コードの量を減らすことができます。

  • Cloud Run: Cloud Run を使用して Pub/Sub からのイベントを処理する場合、Pub/Sub はデフォルトでメッセージを複数回配信する可能性があることに注意してください。AI エージェントやデータ パイプラインが同じイベントを 2 回処理しないようにするには、Cloud Run サービスでべき等コードを記述する必要があります。
  • Pub/Sub に関する留意点: デフォルトは push ベースの配信ですが、pull ベースのサブスクリプションでは正確に 1 回の配信を利用できます。サービスに適した複雑さのレベルを選択するには、この 2 種類の複雑さを把握しておくと便利です。

さっそく構築を始める

今すぐ Cloud Run に復元力のあるべき等サービスをデプロイする方法を学びましょう。

  • Google Cloud プロダクト
  • 100 種類を超えるプロダクトをご用意しています。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。また、すべてのお客様に 25 以上のプロダクトを無料でご利用いただけます(毎月の使用量上限があります)。
Google Cloud