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時間