Mise en cache de la couche métier vs Mise en cache de la couche de données

36

J'ai toujours travaillé sur des projets où la mise en cache était effectuée sur DAL. En principe, au moment de passer l'appel à la base de données, elle vérifie si des données sont déjà présentes dans le cache et si elles le sont, elles ne passent pas l'appel et renvoie plutôt ces données.

Je viens tout juste de lire un article sur la mise en cache au niveau de la couche métier, donc la mise en cache de tous les objets métier. Un avantage que je peux constater immédiatement est un temps de réponse bien meilleur.

Quand préféreriez-vous l'un par rapport à l'autre? La mise en cache dans la couche de gestion est-elle une pratique courante?

Emma
la source
Les performances de vos applications sont-elles tellement critiques que la mise en cache dans la couche de gestion est préférable d'éviter la clarté d'un appel supplémentaire vers un référentiel ou une couche DAL?
JDT
1
Non ce n'est pas et après avoir lu les réponses, je pense que je me contenterais de simplement mettre en cache dans DAL. À votre santé.
Emma
Vous devez envisager la mise en cache au-dessus de votre couche de gestion et envisager la mise à l'échelle.
AK_

Réponses:

30

C'est probablement trop large pour une réponse définitive. Personnellement, j'estime qu'une couche d'accès aux données est le meilleur endroit pour la mise en cache, tout simplement parce qu'elle est supposée être très simple: les enregistrements entrent et sortent, et c'est tout.

Une couche de gestion implémente de nombreuses règles supplémentaires de complexité plus élevée, il est donc préférable de ne pas la modifier. aussi avoir à gérer des problèmes de disponibilité par objet en plus de problèmes de cohérence de plusieurs objets dans la même classe (ou même la même méthode) - qui serait être une violation flagrante du PÉR.

(Bien entendu, je n'y suis parvenu que lorsque mes cours de service sont devenus d'une complexité ingérable lorsqu'ils ont essayé de faire la mise en cache et la configuration simultanément. Il n'y a pas de meilleur enseignant que l'expérience, mais le prix est vraiment élevé.)

Kilian Foth
la source
pourquoi la mise en cache doit être complexe? cela peut être fait avec AOP et quelques annotations. Est-ce toujours une violation du PÉR? pourquoi ce n'est pas quand fait dans DAL? aussi IMHE je n'ai jamais vu les classes de service "trop ​​complexes" pour être mises en cache; indépendamment de sa complexité, un service peut être vu comme une boîte noire et son résultat peut être mis en cache
user1075613
25

Les couches d'accès aux données et de persistance / stockage sont des lieux irrésistiblement naturels pour la mise en cache. Ils font les E / S, ce qui les rend pratiques et faciles pour insérer un cache. J’ose dire que presque chaque couche DAL ou couche de persistance aura, à mesure de sa maturité, une fonction de mise en cache - si elle n’est pas conçue de cette manière dès le début.

Le problème est l' intention . Les couches DAL et de persistance traitent de constructions de bas niveau, telles que des enregistrements, des tables, des lignes et des blocs. Ils ne voient pas les objets "métier" ou de la couche application, ou n'ont aucune idée de la façon dont ils sont utilisés à des niveaux plus élevés. Lorsqu'ils voient une poignée de lignes ou une douzaine de blocs en cours de lecture ou d'écriture, il n'est pas clair qu'ils représentent. "Le compte Jones que nous analysons actuellement" n'est pas très différent de "certaines données de référence du taux de taxation de base dont l'application a besoin une seule fois et auxquelles elle ne se référera plus". À cette couche, les données sont données.

La mise en cache au niveau de la couche DAL / persistance risque de laisser les données de référence fiscales «froides», occuper inutilement 12,2 Mo de cache et déplacer des informations de compte qui seront, en fait, utilisées de manière intensive en une minute à peine. Même les meilleurs gestionnaires de cache ont peu de connaissances sur les structures de données et les connexions de haut niveau, et ne savent pas quelles opérations vont avoir lieu prochainement. Ils ont donc recours aux algorithmes de guesstimation .

En revanche, la mise en cache de la couche d’application ou de la couche métier n’est pas aussi ordonnée. Cela nécessite l'insertion d'opérations de gestion de cache ou d'indications au milieu d'une autre logique métier, ce qui rend le code métier plus complexe. Mais le compromis est le suivant: mieux connaître la structure des données au niveau macro et les opérations à venir, cela leur donne une bien meilleure occasion d’approcher de l’efficacité optimale de la mise en cache ("clairvoyant" ou "Bélády Min").

Le fait de savoir si l'insertion de la responsabilité de la gestion du cache dans le code métier / d'application est un choix judicieux et varie selon les applications. Dans de nombreux cas, bien qu'il soit connu que les couches DAL / persistance ne l'obtiennent pas "parfaitement bien", le compromis est qu'elles peuvent faire un très bon travail, qu'elles le font de manière "propre" sur le plan architectural et de manière beaucoup plus testable , et que la capture de bas niveau évite d’augmenter la complexité du code métier / des applications.

Une complexité moindre favorise une exactitude et une fiabilité supérieures et un délai de mise sur le marché plus rapide. Cela est souvent considéré comme un excellent compromis: une mise en cache moins parfaite, mais un code commercial de meilleure qualité et plus rapide.

Jonathan Eunice
la source
Merci pour la réponse. Après avoir lu vos réponses et celles des autres, je pense que je n'ai absolument pas besoin de me cacher dans la couche de gestion. Cela ne fera qu'ajouter à la complexité globale du produit.
Emma
1
Un problème avec le modèle "couches" est que des mécanismes de mise en cache efficaces doivent souvent utiliser des informations qui ne sont pas disponibles sur une seule couche. Que penseriez-vous, cependant, si une couche métier transmettait des "indications" à la couche de données concernant son "plan" global? La couche de données pouvait initialement ignorer la plupart des indications de ce type, mais si un goulot d'étranglement était détecté, une logique pourrait être ajoutée, laquelle modifierait les stratégies de mise en cache d'une manière spécifique à l'entreprise.
Supercat
1
Excellent point, @ supercat. J'allais parler d'une stratégie allusion / pragma, mais la réponse était déjà longue. Mais tu as tout à fait raison. Les conseils de la couche de gestion aux couches inférieures sur la manière de hiérarchiser les caches, ou "ce qu'il faut épingler", constituent un moyen assez courant / utile d'obtenir une mise en cache de niveau supérieur sans que le code métier ne fasse tout le travail ou ne soit trop entraîné dans la gestion de son propre stockage. hiérarchie.
Jonathan Eunice
@ JonathanEunice: Une bonne chose à propos des astuces est que le code n'a pas besoin de faire grand-chose avec eux au départ. De nombreux systèmes ont quelques goulots d'étranglement évidents qui dominent leurs performances, mais il peut être difficile de prédire si ceux qui seront suffisamment graves pour avoir de l'importance. Il peut être préférable d’ajouter une petite quantité de logique de mise en cache laide dans quelques zones critiques plutôt que d’y ajouter beaucoup de logique de cache.
Supercat
1
Exactement. Surtout si vous avez déjà une "très bonne" mise en cache de bas niveau au niveau de la couche persistance / accès. Vous n’avez peut-être besoin que d’un peu d’informations supplémentaires pour passer de «très bien» à «vraiment bien».
Jonathan Eunice
16

La mise en cache sur le DAL est simple et directe

Votre DAL est la couche d'accès aux données centrale, ce qui signifie que tout accès aux données peut être contrôlé via les classes présentes. Comme la lecture et la persistance se produisent sur ces couches, il est également facile d'effacer ou de mettre à jour les entrées de cache lorsque des modifications se produisent.

La mise en cache dans l'entreprise est flexible

La mise en cache sur les activités donne aux développeurs la possibilité de déterminer si l'utilisation concrète d'un objet bénéficiera de la mise en cache. En fonction de la structure des services principaux de l'application ou des processus automatisés, les données mises en cache dans d'autres parties peuvent être modifiées. Avec la mise en cache dans l'entreprise, un développeur peut déterminer si un objet métier donné aura éventuellement des données obsolètes et des performances améliorées, ou s'il aura l'état le plus récent d'un objet métier au détriment des performances.

JDT
la source