O CosmosDB é um banco NoSQL oferecido no Azure destinado a aplicações que necessitam de alta disponibilidade, performance e baixa latência, independentemente da localização da sua aplicação. Para alcançar esses requisitos e trabalhar de maneira performática, otimizando custos, é necessário entender e trabalhar em torno das particularidades do seu modelo de particionamento de dados, além de estruturar como suas funcionalidades são integradas e potencializadas por outros recursos do Azure.
A terminologia NoSQL, ou Not Only SQL, é utilizada para representar bancos de dados não-relacionais que armazenam dados em estruturas como chave-valor, grafos, documentos e colunares. Isso torna possível representar os dados de aplicações mais fielmente, entregando mais velocidade nas operações. Outra característica de bancos NoSQL é a escalabilidade horizontal, podendo atender requisitos de disponibilidade de forma simples.
CosmosDB
Originalmente chamado de DocumentDb, o CosmosDB é uma base nosql schema-agnostic, organizada internamente com items containers e databases. Containers são análogos a coleções ou tabelas, e Items, análogos a documentos ou registros.Um dos diferenciais do CosmosDB é dispor de diferentes APIs para acesso de dados: SQL, MongoDB, Gremlin, Cassandra, Azure Table Storage e etcd. Isso facilita muito a portabilidade de aplicações existentes que possuem outra base de dados e desejam migrar para o serviço da Azure.
Para alcançar requisitos de escalabilidade e disponibilidade, o CosmosDB pode ser utilizado em qualquer região disponível pelo Azure, diminuindo a latência entre sua aplicação e o dado, além de disponibilizar replicação de dados “transparente” entre regiões, sem causar impacto na performance ou downtime. Seu modelo de precificação é baseado em throughput, por meio da atribuição e do uso de RU’s (request units), com cada container podendo ser dimensionado manualmente, ou de maneira automática, baseado na necessidade da aplicação, assim otimizando custos. Cada operação realizada no CosmosDB resulta em um custo operacional representado por uma quantia de RU’s, assim sendo, é de grande importância o trabalho de otimização do uso de Request Units.
Para realizar a otimização de RUs é necessário entender e trabalhar com o particionamento do CosmosDB. Os containers são definidos por padrão com uma chave de particionamento que não pode ser alterada após sua criação. Essa chave de particionamento é utilizada para a organização lógica dos dados e, com isso, no processo de escrita, dados armazenados em uma mesma partição ficam armazenados em uma mesma unidade lógica. Porém, se armazenarmos todos os dados de uma base em apenas uma partição, podemos ter problemas de armazenamento, pois partições são limitadas em 20Gbs de espaço.
Outro fator importante para levar em consideração em relação às operações de escrita é sobre a distribuição de dados nas diferentes partições. É importante que a chave de partição escolhida seja eficiente em manter uma proporção semelhante entre todas as partições do banco de dados.
Já para operações de leitura, é importante que o dado buscado esteja em uma única partição, assim evitando consultas Cross Partition, que buscam em todas as partições disponíveis os dados, utilizando RU’s de maneira excessiva.
Com isso, à primeira vista, temos um paradoxo evidente: se o dado for otimizado para escrita, a leitura pode ser penalizada, e vice-versa.
Para utilizar o CosmosDB de maneira eficiente, é preciso entender seu conceito de particionamento, seus mecanismos como o ChangeFeed e a interação dele com Azure Functions. Um fato mais importante é que se faz necessário compreender a distribuição dos dados da sua aplicação para modelar seus containers, itens e partições de maneira a extrair todos benefícios de performance, disponibilidade e escalabilidade que esse serviço do Azure oferece.