CQRS e validações

5

Estou começando a me apresentar nos conceitos de CQRS, mas me deparo com a seguinte situação: Suponha que você tenha uma entidade que deve ter um nome exclusivo. Para verificar se, antes de criar a entidade, você deve fazer uma consulta, assim você está verificando o subsistema de consulta. Mas o que acontece se a sincronização ainda não aconteceu entre o sistema de comando e o sistema de consulta? Outro cliente acabou de enviar o mesmo nome antes de você. O que acontece nesse caso?

    
por Apocatastasis 12.07.2013 / 23:56
fonte

2 respostas

3

Bem, você não deve usar o subsistema de consulta para validações - use o subsistema de comando para isso. Olhe para a foto no artigo do Fowler aqui - as validações são normalmente colocadas no lado do modelo de comando. Se, por exemplo, você tentar dar a uma entidade um nome exclusivo, seu subsistema de comando deve lançar uma exceção se esse nome já tiver sido usado anteriormente. O iniciador desse comando deve esperar que isso aconteça, mesmo quando ele usou o subsistema de consulta antes para encontrar um nome "livre".

Isto é, naturalmente, para o caso de "consistência eventual" entre os diferentes modelos, onde há um atraso entre a sincronização. Se você tem um sistema onde ambos os modelos são estritamente mantidos consistentes, as regras podem ser obviamente diferentes.

    
por 13.07.2013 / 00:28
fonte
1

Existem dois possíveis remédios aqui.

Primeiro, As condições da corrida não existem . Se você está operando em velocidades de negócios, onde normalmente tem processos de longa duração, você normalmente descobrirá que as corridas realmente não acontecem (então você não deve investir muito profundamente na tentativa de lidar com elas) OU que as corridas são permitidas e existem comandos de compensação que são usados para remediar contingências.

Segunda abordagem: se a restrição de nome exclusivo for realmente uma invariante de negócios que precisa ser mantida, a entidade responsável pela criação precisa garantir a exclusividade do nome - por exemplo, mantendo uma lista de todos os nomes em usar. O cliente faz o possível para evitar a duplicação, verificando primeiro o lado da leitura para detectar se um nome já está em uso; mas no caso de uma corrida por dois clientes diferentes, um dos comandos falha , e o cliente que perde a corrida é informado da falha e escolhe outro nome.

    
por 11.12.2015 / 05:06
fonte

Tags