
t0mmy
学習履歴詳細
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
- 〇 :
- バッチ操作の結果は、リソース(またはリクエスト送信)順と同じ順序であるべき
- 個々のリクエストで定義されるリソースの複数の親を示すために、ワイルドカードに
-
を使用する
2023年08月11日(金)
2.0時間