
t0mmy
2020年12月30日に参加
学習履歴詳細
API デザインパターン 19章 条件に基づく削除 読了
やったこと
- API デザインパターン 19章 条件に基づく削除 読了
学んだこと
ポイント
purge
メソッドの特徴purge
メソッドの危険性purge
メソッドを実装する際のガイドライン
学び
purge
メソッドの特徴- 標準の
list
+ バッチのdelete
- 標準の
purge
メソッドの危険性- ちょっとしたフィルターの設定ミスで、意図しないデータを削除してしまいかねない
purge
メソッドを実装する際のガイドラインpurge
メソッドは、必要な場合を除き、基本は実装しないことpurge
メソッドの危険性を緩和するためforce
フラグを実装する- デフォルトでは、削除処理の検証結果を返し、削除処理は実行しない
force
フラグが立っている場合のみ、削除処理を実施する
purge
検証処理の戻り値は、以下を含めると良い- 削除処理を実行した場合の、削除対象数
- 削除されるリソースのサンプルセット
purge
メソッドの一貫性を保証する方法はない
気づき
メモ
バッチ処理による一括削除ではなく、「特定の条件にマッチしたリソース群をまとめて削除する」というユースケースに対処する。
「特定の条件にマッチしたリソース群をまとめて削除する」というユースケースは、以下の問題を抱える。
- 削除する対象のIDが不明な場合は、検索処理が必要
- 検索処理と削除処理のアトミック性をどう維持するか
概要
以下の特徴を持つ、purge
というカスタムメソッドを導入する。
- 「特定の条件にマッチする」かを検索できる、フィルターを入力できる
- =>
list
と バッチdelete
を組み合わせたイメージ
- =>
purge
メソッドを呼び出すだけで、目的を達成できる
purge
メソッドは、フィルターの入力ミスなどで、利用者が意図しないデータまで削除してしまう危険性がある。
そのため、以下の防御策を講じる。
force
フラグを導入する- このフラグが立っている場合のみ、物理削除を行う
- このフラグが立っていない場合、削除処理のプレビュー結果を返却し、削除は実施しない
- プレビュー結果には、「削除される項目数」と「フィルターにマッチした項目のプレビュー」を含める
実装
filter フィールド
削除対象を検索(フィルタリング)するためのフィールド。
標準 list
メソッドの filterと全く同じように動作する。
「filter未設定時、全リソースが返却される」ような実装は要注意。
filterの設定忘れなどで、全リソースが削除されかねない。
- これを防御してくれるのが
force
フラグ
防御策として、デフォルトでは削除しない
purge
メソッドは、ちょっとしたミスで、意図しない大量のデータを削除してしまう危険性を持つ。
そのため、 デフォルトの動作は利用者にとって安全であるべき。
安全な動作として、「削除を実行した場合の検証結果」を返却する動作を、デフォルトにする。
本当にデータを削除したい場合は、 force
フラグを立てて purge
メソッドを実行する。
purge
メソッド(検証)の戻り値
purge
メソッドの検証処理では、以下の二つを返す。
- 削除を実行した場合の、削除される項目数
- 削除を実行した場合の、結果のサンプルセット
- サンプルセット : 「削除対象となるリソースのID」のリスト
- フィルターで得られるデータセットが多い場合は、100項目程度を返却する
- フィルターで得られるデータセットが小さい場合は、全部返却する
一貫性
検証処理で帰ってきたデータが、その後の削除処理で削除されるデータと一致することを保証したい。
- 検証処理と削除処理を実行した時差により、意図しないリソースが削除(または削除失敗)する
結論として、保障することはできない。
そのため、頻繫に変更されるリソースに対して、 purge
の検証と削除はあまり役に立たない。
扱うこと
- カスタムの
purge
メソッドを使用して、条件にマッチするリソースを削除する方法 -
purge
メソッドが危険である理由 - 意図した以上のデータを誤って削除しないための様々な安全対策
- 条件にマッチした結果の一貫性に関する問題にどのように対処するか
まとめ
purge
は、絶対に必要な場合のみ実装する- 言い換えると、「あってもなくてもかまわない」ような場合は実装しない
- 必要性が判明してから実装する
- デフォルトでは、
purge
リクエストは実際にリソースを削除するのではなく、検証にのみ使用されるべき - すべての purgeレスポンスは、影響を受けるリソースの個数を含むべき
purge
メソッドは、標準のlist
メソッドと同じ一貫性のガイドラインを守る必要がある
WebAPI
2023年08月11日(金)
1.5時間