t0mmy

2020年12月30日に参加

学習履歴詳細

API デザインパターン 18章 バッチ操作 読了

やったこと

  • API デザインパターン 18章 バッチ操作 読了

学んだこと

ポイント

  • バッチ処理実装に関する、二つの戦略
  • バッチ操作にアトミック処理を採用するべき理由
  • バッチ操作の処理結果は、入力リソース順と同じであるべき理由

学び

  • バッチ処理実装の戦略には、以下の二つの戦略がある
    • 「リクエストのリストを処理するメソッド」として実装
      • つまり、既存の標準メソッドを繰り返し実行するような実装方法
    • リクエスト群から、処理に必要な最小限の情報(IDなど)だけ抜き出して、標準メソッドに頼らない独自処理を実装する方法
  • バッチ操作は、アトミックである方が利点が多い
    • つまり、全操作に成功する/失敗する、のいずれかのみ
  • 同じ型で、複数のリソースを操作するバッチメソッドは、コレクションをターゲットとする
    • 〇 : POST /chatRooms/1234/messages:batchUpdate
    • × : POST /chatRooms/1234:batchUpdateMessage
  • バッチ操作の処理結果は、入力されたリソース(またはリクエスト送信)順と同じであるべき
    • 順序が分かっていれば、探索処理が不要になり、処理速度向上が見込める ## メモ

複数のリソースを、一括して操作するための方法(いわゆるバッチ処理)を学ぶ。
トランザクション処理も、スコープに入る。

バッチ処理を行うカスタムメソッドを提供することで、バッチを処理を実現する。
バッチ処理は、常にアトミック性を持たせる。

実装

推奨すべきカスタムメソッド名を示す。

BatchGet<Resources>()
BatchCreate<Resources>()
BatchUpdate<Resources>()
BatchDelete<Resources>()

アトミック性

例えGet処理であっても、「完全に成功する」 or 「完全に失敗する」のどちらかに収束させる。

  • 言い換えると、「一部成功(または失敗)」という状態は、あってはならない
コレクションに対する操作

URLの例

/chatRooms/*:batchUpdateMessages
/chatRooms/*/messages:BatchUpdate <= 推奨

結果の順序付け

新しいリソースを一括作成し、結果を受け取る状況を考える。
順序が分かっていると、配列のインデックスアクセスが使用できる。
わからない場合、バッチ処理に渡したリソースと、バッチ処理結果を照合する必要がある。

後の処理を考えると、以下のことが言える。

  • バッチ処理に渡すリソースは、順序を決めておく
  • バッチ処理側は、作成したリソース群を上記順序で構成して返却する
共通フィールド

バッチ処理の実装には、以下の二パターンが考えられる。

  • コレクションを扱うように、「リクエストのリストを処理するメソッド」として実装する
  • リクエスト群から、処理に必要な最小限の情報(ID情報など)だけ抜き出して、既存のメソッドを実行する
バッチ型 GET

IDリストを受け取り、対応するリソースリストを返却する。

  • 返却の際、IDリストと同じ順番で、リソースリストを構成する

HTTP GETメソッドを使用するため、IDリストはクエリパラメータでサーバサイドに渡す。

GET処理にて、厳密なアトミック性が不要であれば、 list 標準メソッドの使用を検討すること。

バッチ型 Create と Update

標準メソッド用リクエストのリストを、入力として受け取る。

これにより、リクエストのオプション(フィルターマスクなど)を扱うことが出来る。

バッチ型 updateは、 他のバッチ処理と同じように HTTP POST を使用する。

トレードオフ

アトミック性を優先した結果、一部のユースケースで問題を引き起こす可能性が生じる代わりに、一貫した動作(全部成功 / 全部失敗のみ)を提供できる。

バッチ処理メソッドの入力形式に、様々な種類をサポートした結果、一貫性が失われる代わりに、メソッド毎に最適な処理を実現できる。

  • バッチ処理は、標準的なリクエストを繰り返すだけでも実現可能
  • しかし、一部のバッチ処理(特に、get と delete )は、不要な処理を含んでしまう
    • これを回避するため、IDだけ抜き出して処理をする ... という I/Fを持ち込んだ

扱うこと

  • バッチ操作と、複数の標準メソッドの実行との違い
  • バッチ操作が、アトミックでなければならない理由
  • バッチリクエストメソッドが共通のフィールドを持ち、繰り返しを避ることが出来る方法
  • バッチ型標準メソッド

まとめ

  • バッチメソッドあれこれ
    • バッチメソッド名は、Batch<メソッド><リソース>とする
    • バッチメソッドはアトミック性を持つ
    • バッチ内のすべての操作を実行する/全く実行しない のいずれかである必要がある
      • 言い換えると、一部だけ実行 ... などは厳禁
  • 同じ型の、複数のリソースを操作するバッチメソッドは、一般的に親リソースではなく、コレクションをターゲットにするべき
    • 〇 : POST /chatRooms/1234/messages:batchUpdate
    • × : POST /chatRooms/1234:batchUpdateMessage
  • バッチ操作の結果は、リソース(またはリクエスト送信)順と同じ順序であるべき
  • 個々のリクエストで定義されるリソースの複数の親を示すために、ワイルドカードに - を使用する
WebAPI

2023年08月11日(金)

2.0時間