私は常にDALでキャッシングが行われたプロジェクトに取り組んできました。基本的には、データベースを呼び出すときに、データがキャッシュにすでに存在するかどうかを確認し、存在する場合は、呼び出しを行わず、代わりにそのデータを返します。
私は最近、ビジネスレイヤーでのキャッシュについて読んだので、基本的にビジネスオブジェクト全体をキャッシュします。私がすぐに確認できる利点の1つは、応答時間がはるかに優れていることです。
どちらを優先しますか?そして、ビジネスレイヤーでのキャッシュは一般的な方法ですか?
これはおそらく決定的な答えには広すぎます。個人的には、データアクセスレイヤーのほうがキャッシングに適していると思います。これは、非常に単純であると想定されているためです。つまり、レコードが出入りするだけです。
ビジネスレイヤーは、より複雑な多くの追加ルールを実装しているため、同じクラスでの複数オブジェクトの一貫性の懸念に加えて、オブジェクトごとの可用性の懸念を管理する必要がない場合は、より優れていますまたは同じ方法)-それはSRPの露骨な違反になります。
(もちろん、キャッシュと構成の両方を同時に実行しようとしたときにサービスクラスが管理不可能な複雑さまで成長した後で初めて、私はその洞察に達しました。経験以上の優れた先生はいませんが、価格は確かに高額です。)
データアクセスと永続性/ストレージレイヤーは、キャッシュするための非常に自然な場所です。 I/Oを実行しているため、キャッシュを挿入するのに便利で簡単な場所です。私は、ほとんどすべてのDALまたは永続化レイヤーが、成熟するにつれて、最初からそのように設計されていなければ、キャッシュ機能が与えられると思います。
問題はintentです。 DALと永続化レイヤーは、比較的低レベルの構造(レコード、テーブル、行、ブロックなど)を扱います。彼らは「ビジネス」やアプリケーション層のオブジェクトを見たり、より高いレベルでそれらがどのように使用されているかについて多くの洞察を得たりしません。少数の行または十数のブロックが読み書きされているのを見たとき、それらが表すことは明確ではありません。 「現在分析中のジョーンズアカウント」は、「アプリが1度だけ必要とし、再び参照しない一部の基本的な税率参照データ」とそれほど変わらないように見えます。このレイヤーでは、データはデータです。
DAL /永続性レイヤーでのキャッシュは、「コールド」の税参照データがそこに置かれ、12.2MBのキャッシュを無意味に占有し、実際にはたった1分間で集中的に使用されるアカウント情報を置き換えてしまうリスクがあります。最高のキャッシュマネージャーでさえ、より高いレベルのデータ構造と接続に関する知識が乏しく、すぐにどの操作が行われるかについての洞察がほとんどないため、 (推定アルゴリズム にフォールバックします。
対照的に、アプリケーション層またはビジネス層のキャッシングは、それほどきれいではありません。他のビジネスロジックの途中にキャッシュ管理操作やヒントを挿入する必要があるため、ビジネスコードがより複雑になります。しかし、トレードオフは次のとおりです。マクロレベルのデータがどのように構造化され、どのような操作が行われるかについての知識があると、最適な(「透視」または「ベラディミン」)キャッシング効率を概算する機会が大幅に増えます。
キャッシュ管理の責任をビジネス/アプリケーションコードに挿入することが理にかなっているかどうかは判断の要であり、アプリケーションによって異なります。多くの場合、DAL /永続性レイヤーは「完全に正しく」は機能しないことがわかっていますが、トレードオフは、かなり良い仕事ができること、アーキテクチャ的に「クリーン」ではるかに集中的にテスト可能な方法で実行できることです、そしてその低レベルのキャッチにより、ビジネス/アプリコードの複雑さの増大を回避します。
複雑さが低いほど、正確性と信頼性が高くなり、市場投入までの時間が短縮されます。これは、多くの場合、優れたトレードオフと見なされます-完全なキャッシングではありませんが、品質が高く、タイムリーなビジネスコードです。
DALでのキャッシュは簡単でシンプルです
DALは中央のデータアクセスレイヤーです。つまり、あらゆるクラスのデータアクセスをそこのクラスを通じて制御できます。読み取りと永続化の両方がこれらのレイヤーで発生するため、変更が発生したときにキャッシュエントリをクリアまたは更新することも同様に簡単です。
ビジネスのキャッシングは柔軟です
ビジネスのキャッシングにより、開発者はオブジェクトの具体的な使用がキャッシングから利益を得るかどうかを決定する柔軟性を与えられます。アプリケーションの構造に応じて、バックエンドサービスまたは自動化されたプロセスは、他の部分にキャッシュされているデータを変更する可能性があります。ビジネスでのキャッシングにより、開発者は、特定のビジネスオブジェクトが古くなった可能性のあるデータを持ち、パフォーマンスを得るか、またはパフォーマンスを犠牲にしてビジネスオブジェクトの最新の状態を保持するかを決定できます。