Cosmos DB: um banco de dados multimodelo

Introdução

Vivemos em uma tempestade de dados, e a grande vantagem do momento atual é a possibilidade de escolher o Sistema Gerenciador de Banco de Dados (SGBD) mais adequado para as necessidades de cada aplicação.

A liberdade traz a responsabilidade de analisar corretamente os requisitos e escolher uma solução que equilibre o preço, o desempenho, a curva de aprendizado, as necessidades de hardware, a monitoração, entre tantos outros requisitos importantes.

 

O que é o Cosmos DB

Cosmos DB é um serviço de banco de dados do Azure, construído para atender às necessidades que os outros bancos de dados não atendiam.

Por ser um serviço do Azure – os dados podem estar distribuídos em todas as regiões do Azure –, tem uma latência impressionante (na casa de milissegundos), cinco modelos de consistência e alta disponibilidade garantida. Não possui schema e tem indexação automática.

Uma coisa que eu acho fantástica são as APIs, porque permitem a manipulação de dados de diversos modelos, sem descaracterizá-los.

 

O desempenho, o uso e a análise

O Cosmos DB é muito legal, mas não é um serviço que você deve usar para armazenar logs Use-o para trazer mais valor para o seu negócio, atente-se ao fato de que “Com o Azure Cosmos DB, você paga pela taxa de transferência provisionada e pelo armazenamento que consome por hora. A taxa de transferência deve ser provisionada para garantir que recursos de sistema suficientes estejam disponíveis para seu banco de dados Cosmos do Azure em todos os momentos. Você precisa de recursos suficientes para atender ou exceder as SLAs do Azure Cosmos DB” (Documentação oficial).

Sendo bem direta, o desempenho é proporcional ao pagamento. Não espere o sistema mais rápido do mundo se você não configurou corretamente a quantidade de recursos.

 

Multimodelo?

Antes de explicar por que o Cosmos DB é um serviço multimodelo, é importante relembrar quais são os tipos de BD NoSQL:

 

Chave-valor:

Como o próprio nome diz, armazena uma chave (usada na consulta) e um valor. São muito usados como cache das aplicações porque armazenam partes críticas de dados na memória para acesso de baixa latência.

Os exemplos de bancos de dados desta categoria são:

  • Redis;
  • Voldemort;
  • Memcahed
  • Riak.

 

Documentos

São bancos de dados parecidos com os bancos key-value, porque têm uma chave (que identifica unicamente o registro e pode ser usada para consultas) e valores que armazenam dados; a grande diferença é que os valores também podem ser usados em consultas.

Nesta categoria, os dados normalmente têm o formato JSON, sendo o mais utilizado o MongoDB.

Fazem parte desta categoria também:

  • CouchDB;
  • OrientDB;
  • RavenDB;
  • TerraStore.

 

Colunares

Neste tipo de NoSQL, os dados não são armazenados em linhas, mas sim em colunas, conforme podemos ver na Figura 1 a seguir.

Figura 1 – Forma de armazenamento em (a) linhas e (b) colunas (Fonte: http://www.lbd.dcc.ufmg.br/colecoes/erbd/2013/007.pdf)

Um banco de dados colunar é excelente para escritas rápidas e para recuperação de grandes volumes de dados.

São bancos de dados colunares:

  • Cassandra;
  • HBase;
  • Hipertable;
  • Amazon Redshift.

 

Grafos

São bancos de dados em que os registros pequenos têm relações complexas.

Exemplos de bancos de dados orientados a grafos:

  • FlockDB;
  • Neo4J;
  • OrientDB;
  • Infinit Graph.

 

 

As APIs do Cosmos DB

Uma das grandes vantagens do Cosmos DB é a possibilidade de usar um único serviço para manipular dados em vários formatos. Para isso, ele tem algumas APIs que estão listadas a seguir.

 

Tabela do Azure – Key-value

A API Tabelas Azure armazena grandes quantidades de dados estruturados e não relacionais. 

 

Na terminologia padrão, cada linha da tabela representa uma entidade e as colunas armazenam várias propriedades da entidade. Cada entidade tem um par de chaves e valores.

Figura 2 – Exemplo de dados API Tabelas do Azure (Fonte: https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-overview)

API do Azure Cosmos DB para MongoDB – Documentos

Esta API é a junção de dois mundos bem legais: o MongoDB, que já conhecemos (se você não conhece, acesse meu blog www.db4beginners.com/MongoDB), com os recursos do Azure Cosmos DB.

Se você já utiliza o MongoDB e deseja mudar para o Cosmos DB, fique atento, porque a API do Cosmos DB é baseada na versão 3.2 do MongoDB e este já está na versão 4.2.

Se sua aplicação foi criada com o MongoDB 3.2 e você deseja migrar para o Cosmos DB, você precisará apenas alterar a string de conexão da sua aplicação, ou seja, nenhuma alteração no código precisará ser feita.

Use a API do MongoDB para armazenamento e manipulação de dados semiestruturados, no formato JSON. A minha recomendação é utilizá-la se você estiver migrando dados do MongoDB para o Cosmos DB.

Se você estiver começando um projeto que manipulará dados no formato JSON, use a API Core (SQL).

Figura 3 – Exemplo de dados no formato JSON (Fonte: https://docs.microsoft.com/pt-br/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server?view=sql-server-2017)

Cassandra – Colunar (ou família de colunas)

O Cassandra é um SGBD Colunar e tem como característica principal o desempenho na inclusão de grandes volumes de dados.

Se você usa o Apache Cassandra, pode migrar seus aplicativos para o Cosmos DB sem ter que alterar seus aplicativos; em muitos casos, você precisará alterar somente a string de conexão.

Figura 4 – Exemplo de dados na API do Cassandra (Fonte: https://blog.dbi-services.com/apache-cassandra-overview/)

Gremlin (grafos) – Grafos

No mundo real, os dados são conectados naturalmente. A modelagem de dados tradicional se concentra em entidades, mas, para muitos aplicativos, também há a necessidade de modelar as relações e as entidades.

Um grafo é uma estrutura composta por vértices e arestas, que podem ter um número arbitrário de propriedades. Os vértices são objetos individuais, como uma pessoa, um lugar ou um evento. As arestas são as relações entre os vértices. Por exemplo, uma pessoa pode conhecer outra pessoa, estar envolvida em um evento e ter ido recentemente a um local. As propriedades expressam informações sobre os vértices e as arestas.

Figura 5 – Exemplo de grafo (Fonte: https://docs.microsoft.com/pt-br/azure/cosmos-db/graph-introduction)

Núcleo (SQL) – Documentos

Esta API é sensacional! Se você começará um novo projeto armazenando documentos no formato JSON e usará o Cosmos DB, recomendo que a API seja usada, devido à quantidade de recursos, ao desempenho e à facilidade.

Com ela, podemos usar a linguagem SQL para consultar documentos JSON armazenados no Cosmos DB. Além disso, podemos usar o JavaScript como um “novo SQL” (confesso que estou me adaptando a isso) e, com essa linguagem, criar stored procedures, triggers e user defined functions (UDF).

Um dos recursos que eu gosto muito é o feed de alterações. Com ele, podemos criar aplicações para “ouvir” em tempo real as alterações que estão acontecendo nos dados. 

 

Para o bom uso desses recursos, é importante saber:        

  • Uma conta do Cosmos DB é formada por um conjunto de bancos de dados, cada um contendo diversos containers. Cada container pode conter stored procedures, triggers, UDFs e documentos.
  • As stored procedures, triggers e UDF são pré-compiladas.
  • No Cosmos DB, o JavaScript é hospedado no mesmo espaço de memória do banco de dados. Portanto, as solicitações realizadas dentro de stored procedures e triggers são executadas no mesmo escopo de uma sessão do banco de dados. Isso permite que o Cosmos DB garanta as propriedades ACID para todas as operações que fazem parte de uma única trigger ou stored procedure.
  • Se houver uma exceção propagada no script, toda a transação será desfeita. 

Figura 6 – Organização dos objetos na API Núcleo (SQL) (Fonte:https://dzone.com/articles/using-azure-documentdb-and-aspnet-core-for-extreme)

 

Persistência poliglota

Eu adoro esse assunto e venho pesquisando sobre ele há alguns anos.

Martin Fowler definiu persistência poliglota como a utilização de diversas tecnologias para armazenamento de dados, de acordo com as características dos dados.

No artigo em que ele fala desse assunto, explica que as aplicações têm dados de diversos tipos e formatos, por isso vários SGBDs deveriam ser utilizados em uma mesma aplicação. Isso aumenta o desempenho, o custo e a complexidade.

Devemos nos atentar ao fato de que Fowler falou sobre esse assunto em 2012. De lá para cá, os SGBDs evoluíram muito e temos possibilidades fantásticas, como o Cosmos DB, que tem APIs para a manipulação de diversos formatos de dados sem a complexidade e o custo de ter vários SGBDs diferentes.

Persistência poliglota está relacionada à utilização do melhor recurso para um determinado modelo de dados, e não somente ao uso de diversos SGBDs.

Conclusão

O Cosmos DB é um serviço incrível.

Antes de utilizá-lo, lembre-se de que é vital fazer uma boa análise dos requisitos da sua aplicação, porque você precisará escolher a API correta, as regiões onde os seus dados estarão, a quantidade de RUs para o banco de dados ou a quantidade de RUs para os seus containers. Escolhendo as configurações corretas para a sua necessidade, o Cosmos DB voa!

 

Referências e links indicados

https://docs.microsoft.com/pt-br/azure/cosmos-db/

https://martinfowler.com/articles/nosql-intro-original.pdf

https://bit.ly/danimonteirodba

https://www.youtube.com/watch?v=of-2xEV-SMQ

https://imasters.com.br/banco-de-dados/os-desafios-da-persistencia-poliglota

https://imasters.com.br/banco-de-dados/diminuindo-os-custos-da-persistencia-poliglota

https://blog.dbi-services.com/apache-cassandra-overview/

http://www.lbd.dcc.ufmg.br/colecoes/erbd/2013/007.pdf

https://docs.microsoft.com/pt-br/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server?view=sql-server-2017

https://docs.microsoft.com/pt-br/azure/cosmos-db/graph-introduction


Autor:

Meu nome é Danielle Monteiro, sou mestra em Engenharia da Computação, Microsoft RD e MVP, ganhadora do prêmio Willian Zola da MongoDB, MongoDB Female Innovator e autora do blog DB4Beginners.com. Tenho como objetivo ajudar desenvolvedores iniciantes a modelar e consultar bancos de dados relacionais e NoSQL para que eles possam criar ótimos aplicativos e conquistar os melhores empregos.