O que é o Bulkhead Pattern usado pela Hystrix?


Respostas:


193

Geral

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.

O que Hystrix resolve

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 .

Abordagens de Hystrix

Hystrix 'tem duas abordagens diferentes para o anteparo, isolamento de thread e isolamento de semáforo.

Isolamento de fio

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.

Isolamento de semáforo

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.

Diferenças

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.


10
Além disso, no wiki Hystrix original agora há uma descrição detalhada de ambas as abordagens: github.com/Netflix/Hystrix/wiki/How-it-Works
Dmitry

1
qual é a diferença entre disjuntor e antepara?
voipp

4
Os disjuntores @voipp são uma coisa bem diferente. Eles detectam quando um serviço está em um estado não íntegro e movem os chamadores para um estado de "falha rápida", onde eles não chamam o serviço não íntegro, mas retornam um código de erro até que o serviço esteja bom novamente. Isso evita sobrecarregar o serviço não íntegro para que ele possa se recuperar e evita falhas em cascata, pois os chamadores não ficam mais lentos.
K Erlandsson

1

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.