Algumas opções
Use um canal de comunicação persistente
Em vez de HTTP, descarte as mensagens em uma fila altamente disponível e persistente. Por exemplo, Kafka. Enquanto o servidor de destino estiver disponível em algum momento, ele receberá a mensagem.
Você tem o compromisso de provisionar e administrar agora um subsistema complexo (a fila). Portanto, analise se isso vale a pena.
Recuar e tentar novamente
Peça ao chamador que mantenha a solicitação com falha (possivelmente persistida no disco) e tente periodicamente novamente. Nesse caso, é importante distinguir entre sua solicitação que causa uma falha e o serviço que está sendo desativado. O primeiro provavelmente é devido a um bug e deve ser registrado ... as novas tentativas provavelmente não farão diferença até que uma correção seja feita.
Detectar e compensar
Uma tarefa periódica verifica condições de consistência entre microsserviços. Por exemplo, a falha registra até as consultas diretas da API, conforme necessário. Se descobrir um problema (por exemplo, há um pedido, mas a remessa nunca recebeu a lista de embalagem), execute as etapas de compensação. Essas etapas podem estar criando um tíquete de suporte para uma correção manual, ou enviando um e-mail a alguém ou qualquer outra coisa.
Considere alternativas de design
Um caso como esse provavelmente exige um gateway de API para gerenciar chamadas para microsserviços afetados. Dessa forma, você controla quais táticas são usadas para mitigar esse problema. Você provavelmente não deseja sobrecarregar os clientes com esses detalhes de implementação. Consulte Padrão do disjuntor .
Como os microsserviços são independentes, sempre haverá algum caso de falha que pode resultar em inconsistência. Você precisa estar preparado para fazer correções manuais quando elas surgirem.
Se você precisar de consistência forte, os microsserviços não serão um bom ajuste. Se ainda estiver precisando de escalabilidade, convém analisar o sharding, onde dados relacionados podem ser colocados no mesmo shard para garantir a consistência. Você ainda pode expandir o IO adicionando shards.
Se você precisar de consistência forte e não tiver problemas de escalabilidade, use apenas serviços monolíticos. Use as bibliotecas como limites dentro do seu aplicativo para separar preocupações.