Desenvolvido desde 2010, por Rich Hickey e a equipe Relevance, o Datomic oferece algumas abordagens novas para arquitetura de bancos de dados. Impulsionado pelas tendências atuais, como computação em nuvem e armazenamento, o Datomic possui transações consistentes, API de consulta rica e dimensionamento de leitura.
No início de março, a equipe da Relevance, juntamente com Rich Hickey e Stuart Halloway, anunciou uma nova plataforma de banco de dados na qual eles têm trabalhado desde 2010.
O Datomic aproveita evoluções recentes da computação distribuída, especialmente do armazenamento de dados como serviço (SaaS), da disponibilidade de quantidades de servidores de aplicação de acordo com a demanda momentânea e, também, da sua necessidade de escalar mais operações de leitura que de escrita. Outros aspectos importantes do Datomic são:
- separação dos conceitos de leitura e escrita;
- garantias transacionais fortes nas escritas;
- a noção de imutabilidade, expressa por bases de dados estritamente incrementais;
- snapshots do banco de dados ao longo do tempo com valores consultáveis;
- incorporação do tempo (transações) na estrutura de dados central do Datom como um fato relacionado a entidades, atributos, valores e transações;
- Datalog como uma linguagem de consulta estruturada baseada em lógica, permitindo consultas complexas, incluindo joins inferidos.
Exemplo da linguagem Datalog (consulta de custos de transporte superiores ao preço do produto) [:find ?cliente ?produto :where [?cliente :enderecoEntrega ?endereco] [?endereco :cep ?cep] [?produto :produto/peso ?peso] [?produto :product/preco ?preco] // função invocada dentro do código da aplicação [(Entrega/estimativa ?cep ?peso) ?custoEntrega] [(<= ?preco ?custoEntrega)]]
A arquitetura do Datomic é composta pelos seguintes blocos:
- um serviço de armazenamento rápido e distribuído (AWS Dynamo DB em SSD);
- um serviço transacional único, responsável exclusivamente por serializar escritas em uma corrente de dados consistente;
- uma biblioteca de funcionalidades incluída nas aplicação, que tratam tanto da consulta e carregamento de dados quanto dos índices.
Rich falou sobre o Datomic em uma breve entrevista concedida para a InfoQ. Ele também falou do Datomic em seu Keynote na Clojure/West.
Desde o anúncio do Datomic, que foi acompanhado de uma série de apresentações sobre sua arquitetura, tem havido uma série de discussões interessantes.
Sergio Bossa e Daniel Spiewak questionaram algumas decisões de design do Datomic.
Um dos questionamentos foi sobre a vazão reduzida de operações de escrita e a escolha de um serviço transacional único, o que poderia resultar em um ponto central de falha bem como no principal gargalo.
Outra indagação foi a respeito da decisão de mover quantidades massivas de dados para o código (aplicações executando consultas) ao invés de movimentar o código para os dados, como diversas abordagens (incluindo o map-reduce) realizam atualmente.
Rich Hickey respondeu a estes questionamentos nos blogs de Alexandru Popescu e Michael Fogus. Ele ressaltou que o transacionador pode ser construído como um componente de alta disponibilidade e que há a possibilidade de serem criados multiplos bancos de dados Datomic, paralelos e compartilhados, que podem ser consultados de forma cruzada. Ele também destacou que o ponto principal do Datomic não está na vazão extremamente alta de escritas mas, sim, na escalada de leituras, nas consultas elaboradas e em seu sistema transacional consistente.
A resposta sobre a movimentação dos dados para a aplicação discute o esforço corrente dos servidores de banco de dados em possuírem muitas responsabilidades, como consulta, escrita, distribuição, otimização, log, monitoração e muitas outras. O Datomic tenta separar estas responsabilidades. Aplicações são muito mais fáceis de escalar do que servidores de banco de dados. Elas podem, inclusive, cuidar de consultas diferentes - e necessidades, provenientes de casos de uso, de atender a diferentes características de consulta bem como de requisições de dados (hot dataset).
Outro ponto interessante foi que o Datomic pode ser visto como um índice distribuído globalmente, cuja atualização em disco é feita de forma constante. Além disso, índices delta estão sendo computados constantemente no transacionador, assim como cada aplicação a ser virtualmente fundida com o índice principal. Os segmentos do índice, que é cacheado e imutável, permitem ao mecanismo de consulta recuperar diretamente partes específicas de valores do banco de dados sem a necessidade de transportar partes grandes do banco de dados para o cliente.
As ofertas atuais do Datomic cobrem:
- uma biblioteca de funcionalidades, que traz em si uma implementação, em memória, tanto do transacionador e quanto do serviço de armazenamento (para desenvolvimento);
- uma máquina virtual, que contém uma instância do transacionador e um serviço de armazenamento de dados persistentes (para testes e aplicações pequenas);
- uma oferta comercial pública em AWS com uma faixa de uso grátis (até 1000 horas por mês), utilizando o DynamoDB da Amazon.