A um tempo venho estuando sobre microsserviços e quando penso em como aplica-lo ao projeto que trabalho, um monólito, me vem várias dúvidas em relação a como distribuí-los e de como ficaria a base dados, o caso é o seguinte: possuo um checkout (projeto backend) que tem a responsabilidade de criar o cadastro do cliente, fazer o cálculo da compra e depois realiza o pagamento de um produto, no qual pode ser usado um cupom de desconto. Logo imaginei em fazer a divisão dos microsserviços da seguinte maneira:
- cliente (cadastro e consulta de cliente)
- carrinho (calculo da compra, acionado também para cada vez que o cliente altera a quantidade, cupom e etc. para mostrar em tempo real para ele no front)
- pagamento (executa o pagamento de fato)
- produto (todo o CRUD de produto)
- cupom (todo o CRUD de cupom usado nas compras)
E aí que vem minha primeira dúvida: para eu fazer o cálculo da compra devo receber sempre do front-end o id do cliente, id do produto e código do cupom, pois preciso verificar se o cliente é cnpj para aplicar um desconto, verificar se o cupom existe, se ele está valido e qual é o desconto, por fim consulta o produto para ver qual seu preço. Entao para eu criar esse microsserviços eu teoricamente teria muita mensagem síncrona (via http, por exemplo) com outros microsserviços, o que não é o ideal para eles. Esta é uma forma correta de fazer divisão dos microsserviços? Como eu poderia fazer para mitigar essas chamadas síncronas? Pensei em usar filas nas chamadas de alguma forma, mas o tempo de resposta ficaria muito grande para o ciente (obs: é necessário receber apenas os ids do front e fazer a consulta no banco, para ter integridade dos dados)
Segunda dúvida: Ao realizar a etapa de pagamento preciso criar no banco do microsserviço de pagamento o registro de compra que possui o relacionamento de muitos para muitos com o produto, logo precisando de uma segunda tabela compra_produto, porem os dados dos produtos estão apenas na base do microsserviço de produto, então não daria para criar a coluna produto_id na tabela compra_produto como foreign key, seria apenas um registro normal. Isso estaria correto? Ou devo replicar os dados de produtos para a base dados microsserviço de pagamento (O que seria bem custoso) ?