Armazenamento em cache na camada de negócios vs Armazenamento em cache na camada de dados

36

Eu sempre trabalhei em projetos nos quais o cache foi feito no DAL, basicamente quando você está prestes a fazer a chamada para o banco de dados, ele verifica se os dados já estão lá no cache e, se estiver, simplesmente não faz a chamada e em vez disso, retorna esses dados.

Recentemente, eu li sobre o cache na camada de negócios, então basicamente o cache de todos os objetos de negócios. Uma vantagem que posso ver imediatamente é um tempo de resposta muito melhor.

Quando você prefere um sobre o outro? e O armazenamento em cache na camada de negócios é uma prática comum?

Emma
fonte
O desempenho de seus aplicativos é tão crítico que o armazenamento em cache na camada de negócios é preferível a evitar a clareza de uma chamada adicional para um repositório ou camada DAL?
JDT 05/02
11
Não, não é, e depois de ler as respostas, acho que me ateria apenas ao cache no DAL. Felicidades.
560 Emma Emma
Você deve considerar o cache acima da camada de negócios e também pensar em dimensionamento.
AK_ 06/02/2015

Respostas:

30

Provavelmente, isso é amplo demais para uma resposta definitiva. Pessoalmente, acho que uma camada de acesso a dados é o melhor lugar para armazenar em cache, simplesmente porque é suposto ser muito simples - os registros entram e saem e é isso.

Uma camada de negócios implementa muitas regras adicionais de maior complexidade; portanto, é melhor se ela também não precisar gerenciar as preocupações de disponibilidade por objeto, além das questões de consistência de vários objetos na mesma classe (ou mesmo no mesmo método) - isso ser uma violação flagrante do SRP.

(Obviamente, só cheguei a esse insight depois que minhas classes de serviço cresceram para uma complexidade incontrolável quando tentaram fazer cache e configuração simultaneamente. Não há professor melhor do que experiência, mas o preço certamente é alto.)

Kilian Foth
fonte
por que o cache precisa ser complexo? isso pode ser feito com AOP e algumas anotações. Ainda é uma violação do SRP? por que não é quando feito no DAL? IMHE também nunca vi classes de serviço "muito complexas" para serem armazenadas em cache; independentemente da sua complexidade, um serviço pode ser visto como uma caixa preta e seu resultado pode ser armazenado em cache
user1075613
25

O acesso a dados e as camadas de persistência / armazenamento são lugares irresistivelmente naturais para armazenamento em cache. Eles estão fazendo as E / Ss, tornando-as um local prático e fácil para inserir o cache. Ouso dizer que quase todas as camadas de DAL ou persistência receberão uma função de armazenamento em cache - se ela não for projetada dessa maneira desde o início.

O problema é intencional . As camadas DAL e persistência lidam com construções de nível relativamente baixo - por exemplo, registros, tabelas, linhas e blocos. Eles não veem os objetos "comercial" ou da camada de aplicativo ou têm muito conhecimento de como estão sendo usados ​​em níveis mais altos. Quando eles veem um punhado de linhas ou uma dúzia de blocos sendo lidos ou gravados, não está claro o que eles representam. "A conta Jones que estamos analisando atualmente" não parece muito diferente de "alguns dados básicos de referência da taxa de tributação de que o aplicativo precisa apenas uma vez e aos quais não fará referência novamente". Nesta camada, dados são dados são dados.

O armazenamento em cache na camada DAL / persistência corre o risco de manter os dados de referência fiscal "frios", ocupando inútil 12,2 MB de cache e deslocando algumas informações da conta que, de fato, serão intensivamente usadas em apenas um minuto. Até os melhores gerenciadores de cache estão lidando com pouco conhecimento das estruturas e conexões de dados de nível mais alto, e com poucas informações sobre quais operações serão lançadas em breve, para que voltem aos algoritmos de estimativa de estimativa .

Por outro lado, o cache da aplicação ou da camada de negócios não é tão elegante. Requer a inserção de operações ou dicas de gerenciamento de cache no meio de outra lógica comercial, o que torna o código comercial mais complexo. Mas a desvantagem é: Tendo mais conhecimento de como os dados no nível macro são estruturados e de quais operações estão surgindo, ela tem uma oportunidade muito melhor de aproximar a eficiência ideal do cache ("clarividente" ou "Bélády Min").

Se a inserção da responsabilidade de gerenciamento de cache no código comercial / do aplicativo faz sentido é uma decisão de julgamento e variará conforme o aplicativo. Em muitos casos, embora seja sabido que as camadas DAL / persistência não serão "perfeitamente corretas", a desvantagem é que elas podem fazer um bom trabalho, mas de uma maneira arquitetonicamente "limpa" e muito mais intensivamente testável , e que a captura de baixo nível evita aumentar a complexidade do código comercial / de aplicativo.

Menor complexidade incentiva maior correção e confiabilidade e menor tempo de colocação no mercado. Isso costuma ser considerado uma grande desvantagem - armazenamento em cache menos perfeito, mas código comercial mais oportuno e de melhor qualidade.

Jonathan Eunice
fonte
Obrigado pela resposta. Depois de ler as respostas suas e de outras pessoas, acho que definitivamente não preciso armazenar em cache na camada de negócios. Isso apenas aumentará a complexidade geral do produto.
560 Emma Emma
11
Um problema com o modelo "camadas" é que mecanismos de cache eficientes geralmente precisam usar informações que não estão disponíveis em uma única camada. O que você acha, porém, de ter uma camada de negócios transmitindo "dicas" para a camada de dados sobre seu "plano" geral? A camada de dados poderia inicialmente ignorar a maioria dessas dicas, mas se um gargalo fosse encontrado, alguma lógica poderia ser adicionada que, quando recebidas certas dicas, alteraria as estratégias de armazenamento em cache de uma maneira específica de negócios.
Supercat
11
Excelente ponto, @supercat. Eu mencionaria uma estratégia de sugestão / pragma, mas a resposta já era longa. Mas você está exatamente certo. A camada de negócios sugere às camadas inferiores sobre como priorizar caches, ou "o que fixar", são uma maneira bastante comum / útil de obter um cache de nível superior sem fazer com que o código comercial faça tudo isso ou ficar muito envolvido no gerenciamento de seu próprio armazenamento hierarquia.
Jonathan Eunice
@ JonathanEunice: Uma coisa boa sobre as dicas é que o código não precisa fazer muita coisa com elas inicialmente. Muitos sistemas têm alguns gargalos óbvios que dominam seu desempenho, mas pode ser difícil prever se quais serão ruins o suficiente para importar. Adicionar uma pequena quantidade de lógica de cache feia em alguns pontos críticos pode ser melhor do que espalhar muita lógica de cache em locais que realmente não importam.
Supercat
11
Exatamente. Especialmente se você já possui um cache de nível baixo "muito bom" na camada de persistência / acesso. Você pode precisar apenas de algumas informações adicionais de priorização para passar de "muito bom" a "muito bom".
Jonathan Eunice
16

O armazenamento em cache no DAL é direto e simples

Seu DAL é a camada central de acesso a dados, o que significa que todo e qualquer acesso a dados pode ser controlado pelas classes existentes. Como a leitura e a persistência ocorrem nessas camadas, é igualmente fácil limpar ou atualizar as entradas de cache à medida que as alterações acontecem.

O armazenamento em cache nos negócios é flexível

O armazenamento em cache nos negócios oferece aos desenvolvedores a flexibilidade de determinar se o uso concreto de um objeto se beneficiará do armazenamento em cache. Dependendo da estrutura dos serviços de back-end do aplicativo ou dos processos automatizados, poderá alterar os dados armazenados em cache em outras partes. Com o armazenamento em cache nos negócios, um desenvolvedor pode determinar se um determinado objeto de negócios terá possíveis dados obsoletos e obterá desempenho, ou terá o estado mais atualizado de um objeto de negócios à custa do desempenho.

JDT
fonte