Respostas:
Em geral, o objetivo do padrão de antepara é evitar falhas em uma parte do sistema para derrubar todo o sistema. O termo vem de navios em que um navio é dividido em compartimentos estanques separados para evitar que uma única ruptura no casco alague todo o navio; ele inundará apenas uma antepara.
As implementações do padrão bulkhead podem assumir muitas formas, dependendo do tipo de falhas contra as quais você deseja proteger o sistema. Discutirei apenas o tipo de falhas que o Hystrix trata nesta resposta.
Acho que o padrão de antepara foi popularizado pelo livro Release It! por Michael T. Nygard.
A implementação do bulkhead no Hystrix limita o número de chamadas simultâneas para um componente . Dessa forma, o número de recursos (normalmente threads) que estão aguardando uma resposta do componente é limitado.
Assumir que tem uma base, multi aplicação de rosca (por exemplo, uma aplicação típica da web) pedido que utiliza três componentes diferentes, Um , B , e C . Se pedidos para componente C começa a travar, eventualmente, todos os manipulação de solicitação de tópicos irá pendurar na espera por uma resposta de C . Isso tornaria o aplicativo totalmente não responsivo. Se as solicitações para C forem tratadas lentamente, teremos um problema semelhante se a carga for alta o suficiente.
A implementação do Hystrix do padrão bulkhead limita o número de chamadas simultâneas para um componente e teria salvado o aplicativo neste caso. Suponha que temos 30 tópicos pedido de manuseio e há um limite de 10 chamadas simultâneas para C . Em seguida, na maioria dos tópicos de manuseio 10 pedido pode pendurar ao chamar C , os outros 20 threads ainda pode manipular as solicitações e componentes de uso A e B .
Hystrix 'tem duas abordagens diferentes para o anteparo, isolamento de thread e isolamento de semáforo.
A abordagem padrão é entregar todas as solicitações ao componente C para um pool de threads separado com um número fixo de threads e nenhuma (ou uma pequena) fila de solicitações.
A outra abordagem é ter todos os chamadores adquirir uma autorização (com 0 tempo de espera) antes de os pedidos para C . Se uma licença não pode ser adquirida do semáforo, as chamadas para C não são transferidas.
A vantagem da abordagem do pool de threads é que as solicitações passadas para C podem atingir o tempo limite, algo que não é possível ao usar semáforos.
Aqui está um bom exemplo com explicação de tempo de execução para anteparo no Resilience4j que é inspirado no Netflix Hystrix.
As configurações de exemplo abaixo podem fornecer alguma clareza de uso.
Configurações de exemplo: permitir no máximo 5 chamadas simultâneas a qualquer momento. Mantenha as outras chamadas em espera até que uma das 5 chamadas simultâneas em andamento termine ou até no máximo 2 segundos.
A ideia é não sobrecarregar nenhum sistema com mais carga do que ele pode consumir. Se a carga de entrada for maior do que o consumo, aguarde um tempo razoável ou limite o tempo e vá para o caminho alternativo.