GenStage é uma nova forma de definir um pipeline dentro do Elixir, de modo que cada etapa seja feita de forma independente e em processos separados. Nessa palestra será apresentado como implementar um GenStage com seus producers e consumers, juntamente como monitorar cada um dos processos criados. Será mostrado também, como estas técnicas foram aplicadas dentro da Skyhub - B2W.
link do projeto: https://github.com/rodrigolck/genstages
5. 5
GENSTAGEDefinição
● Baseado em GenServers
● Pipeline de processos independentes no Elixir
● Troca de Mensagens entre ‘estados’
● Producers, Consumers e Producer_Consumers
7. 7
GENSTAGE
Opções para inscrição:
● max_demand: demanda máxima que pode ser
requisitada(default 1000)
● min_demand: demanda mínima, que quando
alcançada, irá iniciar a requisição
imediatamente(default 500)
10. 10
GENSTAGE
Pontos de Cuidado:
● O producer deve retornar o número exato de
eventos requisitado, nem mais nem menos
○ Mais - Funciona, porém não tão performático
○ Menos - Travará o fluxo por nunca estar
completo
11. 11
GENSTAGE
Pontos de Cuidado:
● Caso ocorra um erro no consumer, aquele batch
que estava sendo executado será perdido e será
requisitado o próximo
13. 13
GENSTAGE
Pontos de Cuidado:
● Caso ocorra um erro no consumer, aquela entrada
que estava sendo executado será perdida e será
requisitada a próxima
14. 14
GENSTAGE
Producer com RabbitMQ:
● Pergunta: Demanda a mais ou a menos, pode vir a
trazer problemas. Como fornecer mensagens do
RabbitMQ na medida correta?
15. 15
GENSTAGE
Producer com RabbitMQ:
● Pergunta: Demanda a mais ou a menos, pode vir a
trazer problemas. Como fornecer mensagens do
RabbitMQ na medida correta?
● Solução: Guardar a demanda no estado e reduzir
do mesmo a cada mensagem enviada
18. 18
Monitor
ConsumerSupervisor
● Cadastrar cada processo que está sendo
executado nos filhos do ConsumerSupervisor
● Monitorar cada processo cadastrado
● Nos casos de erros inesperados, tomar a ação
devida
19. 19
Process
monitor
● Quando o processo morre, ele retorna:
{:DOWN, ref, :process, object, reason}
● ref - referência do monitor
● object - pid do processo que acaba de morrer
● reason - motivo do término do processo