Onde deve ir o disjuntor?

Aug 18 2020

Estou desenvolvendo uma nova API REST e já vi alguns projetos colocarem o disjuntor no Controller. Eu costumava colocá-lo no arquivo DAO.

A primeira diferença que posso dizer é que colocá-lo no DAOé que todo serviço que consome esse terceiro será aberto no cenário de erro. E colocá-lo no Controller, EVENTUALMENTE abriria todas as rotas que consomem esse terceiro; então não será imediatamente. Mas a segunda opção (no Controller) parece mais fácil de manter.

Alguma recomendação sobre onde deve ir?

Respostas

3 Christophe Aug 19 2020 at 17:02

Há duas partes nesta resposta. A primeira parte já foi abordada por Robert Harvey em seu comentário:

  • De acordo com o catálogo de padrões de microsserviços de Chris Richardson, o disjuntor deve estar em um proxy para o serviço remoto. O API Gateway é um bom lugar para isso.
  • Outra alternativa é a descoberta do lado do servidor, especialmente se a estratégia de recuperação implica encontrar outras instâncias em execução do mesmo serviço.

Mas há uma segunda parte. O objetivo do disjuntor é falhar rapidamente se o serviço for detectado como indisponível, em vez de acumular etapas que falharão posteriormente, criando muita frustração. Portanto, o disjuntor obtém seu pleno sentido apenas se o serviço consumidor estiver pronto para reagir ao intervalo:

  • Talvez o serviço remoto seja essencial, e o serviço consumidor pode decidir se colocar em espera (ou seja, disjuntor interno).
  • Pode ser que o serviço remoto não seja essencial, e o serviço consumidor pode decidir continuar a servir, mas em modo degradado.
  • (os disjuntores baseados em descoberta de serviço provavelmente não falharão, mas encontrarão outro serviço em funcionamento e os consumidores não perceberão).

Do ponto de vista geral, este tipo de escolhas no comportamento é uma responsabilidade do controlador: o controlador coordena entre os elementos do serviço e é capaz de adaptar o processamento com base na informação de "falha".

No entanto, se no seu caso, trata-se apenas de obter dados de outro lugar e se sua estratégia de processamento de erros é sempre a mesma (sem diferença entre essencial e não essencial; por exemplo, tente usar um valor em cache se disponível e falhe caso contrário) você poderia perfeitamente decidir colocá-lo no dao imho.