Compartilhar via


Padrão de exibição materializada

Armazenamento do Azure

Gere visões pré-preenchidas nos dados em um ou mais armazenamentos de dados quando os dados não estiverem idealmente formatados para as operações de consultas exigidas. Isso pode ajudar a dar suporte a consultas e extração de dados eficientes, além de melhorar o desempenho do aplicativo.

Contexto e problema

Ao armazenar dados, a prioridade para desenvolvedores e administradores de dados geralmente recai sobre como os dados são armazenados, em vez de como eles são lidos. O formato de armazenamento escolhido geralmente está bastante relacionado ao formato dos dados, aos requisitos para gerenciar o tamanho e a integridade dos dados e ao tipo de armazenamento em uso. Por exemplo, quando você usa o repositório de documentos NoSQL, os dados geralmente são representados como uma série de agregações, cada uma contendo todas as informações dessa entidade.

No entanto, isso pode ter um efeito negativo sobre consultas. Quando uma consulta precisa de apenas um subconjunto dos dados de algumas entidades, como um resumo de pedidos para vários clientes sem todos os detalhes do pedido, ela deve extrair todos os dados das entidades relevantes para obter as informações necessárias.

Solução

Para dar suporte a consultas eficientes, uma solução comum é gerar, com antecedência, uma exibição que materialize os dados em um formato adequado para o conjunto de resultados necessários. O padrão de Exibição Materializada descreve como gerar exibições de dados pré-preenchidos em ambientes em que os dados de origem não estão em um formato adequado para a consulta, em que é difícil gerar uma consulta adequada ou em que o desempenho da consulta é ruim devido à natureza dos dados ou do armazenamento de dados.

Essas exibições materializadas, as quais contêm apenas os dados necessários para uma consulta, permitem que os aplicativos obtenham rapidamente as informações de que precisam. Além da junção de tabelas ou da combinação de entidades de dados, as exibições materializadas podem incluir os valores atuais das colunas calculadas ou dos itens de dados, os resultados da combinação de valores ou da execução de transformações nos itens de dados, além de valores especificados como parte da consulta. Uma exibição materializada ainda pode ser otimizada para apenas uma única consulta.

Um ponto-chave é que uma exibição materializada e os dados contidos nela são completamente descartáveis, porque podem ser inteiramente recriados a partir dos armazenamentos de dados de origem. Uma exibição materializada nunca é atualizada diretamente por um aplicativo e, por isso, é um cache especializado.

Quando os dados de origem da exibição forem alterados, a exibição deve ser atualizada para incluir as novas informações. Você pode agendar para que ela seja feita automaticamente ou quando o sistema detectar uma alteração nos dados originais. Em alguns casos, pode ser necessário regenerar a exibição manualmente. A figura mostra um exemplo de como o padrão de Exibição Materializada pode ser utilizado.

A Figura 1 mostra um exemplo de como o padrão de Exibição Materializada pode ser usado

Problemas e considerações

Considere os seguintes pontos ao decidir como implementar esse padrão:

Como e quando a exibição será atualizada. Idealmente, ela será regenerada em resposta a um evento indicando uma alteração nos dados de origem, embora isso possa levar a uma sobrecarga excessiva se os dados de origem forem alterados rapidamente. Como alternativa, considere o uso de uma tarefa agendada, um gatilho externo ou uma ação manual para regenerar a exibição.

Em alguns sistemas, como quando você usa o padrão de Fornecimento de Eventos para manter um repositório somente dos eventos que modificaram os dados, as exibições materializadas são necessárias. Pré-preencher exibições por meio da examinação de todos os eventos para determinar o estado atual pode ser a única maneira de obter informações do armazenamento de eventos. Se você não estiver usando Event Sourcing, precisa considerar se uma visão materializada é útil ou não. As visões materializadas tendem a ser especificamente adaptadas para uma ou um pequeno número de consultas. Se forem usadas várias consultas, as exibições materializadas podem resultar em requisitos inaceitáveis de capacidade e custo de armazenamento.

Considerar o impacto na consistência de dados ao gerar a visão e ao atualizá-la se isso ocorrer conforme um cronograma. Se a fonte de dados estiver sendo alterada quando a exibição for gerada, a cópia dos dados na exibição não estará totalmente consistente com os dados originais.

Leve em consideração o local no qual você vai armazenar a exibição. A exibição não precisa estar localizada no mesmo armazenamento ou na mesma partição como os dados originais. Ela pode ser um subconjunto de algumas partições diferentes combinadas.

Uma visualização pode ser recriada caso seja perdida. Por causa disso, se a exibição for transitória e só seja usada para melhorar o desempenho de consulta ao refletir o estado atual dos dados ou para melhorar a escalabilidade, ela pode ser armazenada em um cache ou em um local menos confiável.

Ao definir uma exibição materializada, maximize seu valor adicionando itens de dados ou colunas a ela com base na computação ou transformação de itens de dados existentes, em valores passados na consulta ou em combinações desses valores, quando apropriado.

Considere indexar a exibição materializada, nos locais em que o mecanismo de armazenamento oferecer suporte para isso, para aumentar ainda mais o desempenho. A maioria dos bancos de dados relacionais dão suporte à indexação de exibições, assim como soluções de big data baseadas em Apache Hadoop.

Quando usar esse padrão

Esse padrão é útil:

  • Ao criar exibições materializadas sobre dados que são difíceis de serem consultados diretamente, ou em casos em que as consultas devem ser muito complexas para extrair dados armazenados de forma normalizada, semi-estruturada ou não estruturada.
  • Ao criar visões temporárias que podem melhorar drasticamente o desempenho das consultas ou que podem atuar diretamente como visões de origem ou objetos de transferência de dados para a interface do usuário, para a geração de relatórios ou para exibição.
  • Ao dar suporte a cenários ocasionalmente conectados ou desconectados nos quais a conexão ao armazenamento de dados não está sempre disponível. A exibição pode ser armazenada em cache local nesse caso.
  • Ao simplificar consultas e expor dados para experimentação de uma forma que não requeira conhecimento do formato dos dados de origem. Por exemplo, unindo tabelas diferentes em um ou mais bancos de dados ou em um ou mais domínios em armazenamentos do NoSQL e depois formatando os dados para se ajustarem ao seu uso eventual.
  • Ao fornecer acesso a subconjuntos específicos dos dados de origem que, por motivos de segurança ou privacidade, não devem ser amplamente acessíveis, abertos para modificação ou totalmente expostos a usuários.
  • Criar uma ponte entre diferentes fontes de dados a fim de aproveitar suas capacidades individuais. Por exemplo, usando um armazenamento de nuvem eficiente na gravação como armazenamento de dados de referência e um banco de dados relacional que ofereça bom desempenho de leitura e consulta para manter as visões materializadas.
  • Ao usar microsserviços, é recomendável mantê-los flexívelmente acoplados, incluindo o armazenamento de dados. Portanto, visões materializadas podem ajudar você a consolidar dados de seus serviços. Se as exibições materializadas não forem apropriadas em sua arquitetura de microsserviços ou em um cenário específico, considere ter limites bem definidos que se alinhem ao DDD (design controlado pelo domínio) e agreguem seus dados quando solicitados.

Esse padrão não é útil nas seguintes situações:

  • Os dados de origem são simples e fáceis de serem consultados.
  • Os dados de origem mudam muito rapidamente, ou podem ser acessados sem usar uma visualização. Nesses casos, você deve evitar a sobrecarga de processamento ao criar visões.
  • A consistência é uma alta prioridade. As visualizações podem nem sempre ser totalmente consistentes com os dados originais.

Design de carga de trabalho

Um arquiteto deve avaliar como o padrão Visão Materializada pode ser usado no design de suas cargas de trabalho para atender aos objetivos e princípios discutidos nos pilares do Azure Well-Architected Framework. Por exemplo:

Pilar Como esse padrão apoia os objetivos do pilar
A eficiência de desempenho ajuda sua carga de trabalho a atender com eficiência às demandas por meio de otimizações em dimensionamento, dados e código. As exibições materializadas armazenam os resultados das consultas ou cálculos complexos sem exigir que o mecanismo do banco de dados ou o cliente recalcule todas as solicitações. Esse design reduz o consumo geral de recursos.

- PE:08 Performance de Dados

Tal como acontece com qualquer decisão de design, considere quaisquer compensações em relação aos objetivos dos outros pilares que possam ser introduzidos com este padrão.

Exemplo

A figura a seguir mostra um exemplo de como usar o padrão de visão materializada para gerar um resumo de vendas. Dados nas tabelas Order, OrderItem e Customer em partições separadas em uma conta de armazenamento do Azure são combinadas para gerar uma exibição contendo o valor total de vendas para cada produto na categoria Eletrônicos, juntamente com uma contagem do número de clientes que fizeram compras de cada item.

Figura 2: Usando o padrão de Exibição Materializada para gerar um resumo de vendas

Criar essa exibição materializada requer consultas complexas. No entanto, ao expor o resultado da consulta como uma exibição materializada, os usuários podem facilmente obter os resultados e usá-los diretamente ou incorporá-los em outra consulta. É provável que a exibição seja usada em um sistema ou painel de geração de relatórios e pode ser atualizada de forma programada, por exemplo, semanalmente.

Embora esse exemplo use o armazenamento de tabelas do Azure, muitos sistemas de gerenciamento de banco de dados relacionais também dão suporte nativo para exibições materializadas.

Próximas etapas

  • Guia de Consistência de Dados. As informações de resumo em uma exibição materializada têm de ser mantidas para que reflitam os valores de dados subjacentes. Como os valores de dados são alterados, pode não ser prático atualizar os dados de resumo em tempo real e, em vez disso, você terá de adotar uma abordagem consistente em algum momento. Resume os problemas em torno da manutenção de consistência de dados distribuídos e descreve os benefícios e as vantagens e desvantagens de modelos diferentes de consistência.

Os seguintes padrões também serão relevantes durante a implementação desse padrão:

  • Padrão de Segregação de Responsabilidade de Comando e Consulta (CQRS). Use para atualizar as informações em uma exibição materializada respondendo a eventos que ocorrem quando os valores de dados subjacentes são alterados.
  • Padrão de Fornecimento do Evento. Use em conjunto com o padrão de CQRS para manter as informações em uma exibição materializada. Quando os valores de dados sobre os quais uma exibição materializada se baseia são alterados, o sistema pode gerar eventos que descrevam essas alterações e salvem-nas em um armazenamento de eventos.
  • Padrão de Tabela de Índice. Os dados em uma exibição materializada normalmente são organizados por uma chave primária, mas talvez consultas precisem recuperar informações dessa exibição por meio da examinação de dados em outros campos. Use para criar índices secundários em conjuntos de dados de armazenamentos de dados que não têm suporte nativo a índices secundários.