
t0mmy
学習履歴詳細
APIデザインパターン 12章 シングルトンサブリソース 読了
やったこと
- APIデザインパターン 12章 シングルトンサブリソース 読了
学んだこと
ポイント
- データを分離する動機
- シングルトンサブリソースの階層構造
- シングルトンサブリソースに対する標準メソッドの実装
- トレードオフ
学び
- データを分離する動機はいくつか存在する
- シングルトンサブリソースは、常に親リソースを持つ
get
とupdate
は、シングルトンサブリソースに対して実施できるcreate
とdelete
は提供しない- これらは、親リソース
create
とdelete
に合わせて実施する
- これらは、親リソース
- トレードオフ
- データを、親リソースとシングルトンサブリソースに分割すると、両者を同時に操作することが出来なくなる
- 上記制約(≒デメリット)と、二つに分けるメリットが、トレードオフとなる
メモ
対象とする問題
あるデータAについて
設計上、リソースのプロパティに設定することが最善。
しかし、いざプロパティに設定すると様々な問題が生じる。
- データ量が多すぎて(または複雑すぎて)帯域幅と計算資源を浪費してしまう
- セキュリティ要件上、分離することが推奨される
- 他のプロパティと、明らかに異なるアクセスパターンを持つ場合
- 特に、頻繫な更新
- 書き込み競合が頻繫に発生し、下手をするとデータ消失につながる
そんなケース。
こういった場合は、問題が生じるデータを分離した方が良い。
シングルトンサブリソースの概要
あるリソースの構成要素を、単純なプロパティから、独立したエンティティへ分離すること。
その際、分離したエンティティは、親リソースのプロパティとして機能するのはもちろん、個別のリソースとしても機能できるようにする。
分離したエンティティを、リソースとして定義。
親リソースは、上記定義をプロパティに持つ。
type Car = { //親リソース id: string; location: Location; // シングルトンサブリソース }
委譲関係のイメージ。
実装
階層構造
- シングルトンサブリソースは、親リソースを必ず持つ
- リソース階層のトップに存在してはならない
- シングルトンサブリソースは、他のシングルトンサブリソースを持たない
- 持たせることもできるが、価値はない
標準メソッド
シングルトンサブリソースに対する標準メソッドは、次の通り。
get
... シングルトンサブリソースを取得update
... シングルトンサブリソースを更新create
とdelete
... シングルトンサブリソースには実装しない
シングルトンサブリソースは、親リソース生成時にのみ、自動生成する。
また、シングルトンサブリソースは、親リソース削除時に、併せて削除する。
そして、シングルトンサブリソースのみcreate
とdelete
することはない。
- 必ず、親リソースへの
create
とdelete
に合わせて、シングルトンサブリソースをcreate
またはdelete
する
以上より、シングルトンサブリソースを個別に create
またはdelete
するAPIはサポートしない。
シングルトンサブリソースの初期化に際して、値を渡すことは難しい。
そのため、適切な初期値を設定してやる必要がある。
あとは、 update
メソッド経由でシングルトンサブリソースを更新する。
reset
メソッド
要件によっては、シングルトンサブリソースが保持するデータを、初期値へ戻したい場合がある。
この場合、上記要件をサポートする reset
カスタムメソッドを実装する。
POST /drivers/1/location:reset
トレードオフ
データを、親リソースとシングルトンサブリソースの二つにわけたことで、この二つを同時に(≒アトミックに)操作する手段がなくなる。
同時操作できなくなるデメリットよりも、二つに分けるメリットが大きい場合、シングルトンサブリソースパターンは効果がある。
扱うこと
- シングルトンサブリソースとは
- データをシングルトンサブリソースに分割する理由と、そのタイミング
- 標準メソッドはサブリソースに、どのように作用するか
- シングルトンサブリソースはリソース階層のどこに配置するか
まとめ
- シングルトンサブリソース
- プロパティとリソースのハイブリッド
- リソース固有のデータを、分離された別の場所に保存する
- get,update標準メソッドはサポートする
- リソースを能動的に作成/削除できてはならない
- そのため、create,delete標準メソッドはサポートするべきではない
- リソースの属性を初期状態へ戻す
reset
メソッドもサポートする必要がある - 親リソースにアタッチされるべき
- そのリソースはそれ自体が別のシングルトンサブリソースであってはならない
- 以下の理由により、データを、リソースからシングルトンサブリソースへ分割する
- サイズ
- 複雑さ
- 個別のセキュリティ要件
- 異なるアクセスパターンとその結果生じるボラティリティ
2023年06月25日(日)
1.0時間