16 setembro 2011

CQRS e Event Sourcing, você ainda vai ouvir falar disso

Dois conceitos novos para a gente aprender e adotar em desenvolvimento de aplicações corporativas: CQRS e Event Sourcing.

CQRS ou CQS significa "Command-Query (Responsibility) Separation" e é um paradigma que sugere a separação dos modelos de consulta e de alteração dos dados persistidos pela aplicação.

Os frameworks MVC hoje em dia em geral apenas segregam o Model para abstrair a persistência da informação, mas não busca a isolação das operações que não fazem alteração de "estado" das operações que alteram "estado".

E por que você então tentaria entortar o teu cérebro para gerenciar esta distinção? A questão é que existem oportunidades escondidas significativas nesta separação: As operações que não alteram estado podem ser cacheadas e/ou utilizar de consistência eventual para aumento de performance, as operações que alteram estado podem ser segregadas em servidores separados, inclusive num formato ou banco de dados diferente do utilizado pelas operações de consulta.

Uma destas formas de efetuar armazenamento das alterações num formato diferente é o conceito de Event Sourcing, aonde o armazenamento dos mesmos se dá na forma de mensagens/eventos, e não do simples armazenamento do novo estado.

A partir daí, algum mecanismo pode imediatamente converter o evento recém salvo e alterar o(s) repositório(s) que contenham o "estado" atual e que sejam usado para as operações de consulta que não alteram estado.

E porque este assunto entrou em voga nestes dois últimos anos? Basicamente por causa da tremenda oportunidade para aumento da escalabilidade das aplicações no formato scale-out, o custo baixíssimo do espaço em disco que permite facilmente armazenar num event-store a vida inteira de uma aplicação, e as oportunidades intrínsecas de auditoria e análise do histórico de transações.

O assunto é um pouco denso e complicado, mas é possível achar apresentações falando sobre experiências de implementação de CQRS e Event Sourcing:

Nenhum comentário: