Atualmente, tenho dois microsserviços. Vamos chamá-los A
e B
.
O banco de dados no microsserviço A
possui a seguinte tabela:
A
|-- users
O banco de dados no microsserviço B
possui a seguinte tabela:
B
|-- trackers
Os requisitos declaram que users
e trackers
têm um relacionamento muitos para muitos.
Não sei como lidar adequadamente com isso em uma arquitetura de microsserviços.
Eu pude ver isso funcionando de uma de três maneiras:
- Uma
user_trackers
tabela é adicionada ao microsserviçoA
. Isso age de maneira semelhante a uma tabela de junção que contém "chaves estrangeiras" parausers
etrackers
. - Uma
owners
tabela é adicionada ao microsserviçoB
. Esta tabela age de maneira semelhante a uma tabela de junção polimórfica. Isso permitiria a qualquer serviço criar uma associação com um rastreador. Isso pode ser algo como isto:B |-- trackers |-- owners |-- owner_id |-- owner_type |-- tracker_id
- Mantenha registros para
users
etrackers
em cada microsserviço. Mantenha-os sincronizados com algum tipo de sistema pubsub.
Originalmente, eu iria para a opção 2 porque gostava de preservar os limites da transação. Eu posso criar um rastreador e associá-lo a algo atomicamente. No entanto, parece fora do escopo do microsserviço B
. Por que o microsserviço se B
preocupa com o fato de A
querer criar uma associação?
Sinto que provavelmente há um bom padrão aqui do qual não estou ciente. Alguma das opções que eu expus faz sentido? Existe outra opção que pode fazer mais sentido?
fonte
A resposta de Zapadlo contém muitas informações e raciocínios bons. Vou adicionar aqui alguns conselhos práticos que podem facilitar o trabalho com seus problemas e com os conselhos nessa resposta.
A maneira como você estruturou sua pergunta de design é em torno das estruturas de banco de dados e como ajustar um novo requisito para suas estruturas. Isso implica que você está criando o design de serviço a partir do seu modelo de dados. Por exemplo, o que não vejo é como o relacionamento entre usuários e rastreadores deve ser acessado ou usado.
No design de serviço, a estrutura da interface é a coisa mais importante sobre o design. De fato, a implementação é quase irrelevante em comparação, principalmente no caso de microsserviços. O motivo é que, uma vez que você coloca seu serviço em prática, todas as dependências do serviço devem existir apenas na interface. Se você acertar, poderá reescrever completamente a implementação sem nenhum consumidor. E esse é o principal benefício da autonomia. Ninguém liga para como você o construiu. Eles só precisam funcionar da maneira que você comunicou.
Antes que alguém possa determinar como isso fica no banco de dados ou onde você deseja isso, você realmente precisa explicar como essas informações serão usadas. Isso é algo que será exposto por meio de um serviço ou é algum tipo de dado que você deseja embaralhar para análise?
Em uma nota lateral, eu evitaria dependências bidirecionais a quase todo custo. Se você tem dependências, realmente deseja que apenas um lado conheça o outro. Uma vez que as dependências estão em ambas as direções, seus serviços se tornam essencialmente uma unidade atômica.
fonte
Muito disso se resume ao próprio domínio. Se um usuário com zero rastreadores não faz sentido, o serviço do usuário precisa saber sobre rastreadores. Se um rastreador precisar ter um usuário, ele precisará saber sobre os usuários. Se algo como ter um rastreador com vários proprietários ou poder transferir um rastreador de um usuário para outro faz sentido, talvez essas informações pertençam a outro serviço.
fonte
Pergunta: Por que seus dados são separados ao longo dos Datatables?
Eu tenderia a optar pela opção 3: os serviços são totalmente separados e podem responder às respectivas perguntas que talvez precisem responder. Além disso, eles são muito mais resistentes. Mas tenha cuidado, seus serviços poderão se desincronizar se perderem eventos, mas isso pode ser resolvido com a consistência eventual.
Além disso, você pode considerar a fusão dos dois serviços - se ambos não puderem responder sem conhecer um ao outro, eu os fundiria, pois provavelmente fazem parte de um único domínio.
fonte