Apresentação - Saga
Apresentação - Saga
Apresentação - Saga
Microsserviços: Padrão
Saga Orquestrado
Conceitos de transações distribuídas e sagas
na arquitetura de microsserviços.
• Instrutor aqui na Udemy, com 3 cursos publicados, e dono do canal Comics & Code,
que tem conteúdos sobre programação e quadrinhos.
• Entrega contínua
Existem padrões de arquitetura de microsserviços que podem ser implementados para evitar
problemas de dados inconsistentes em transações distribuídas, iremos falar sobre 3 deles:
• Geralmente funciona de maneira síncrona, com requisições HTTP, a estratégia consiste em iniciar um fluxo, realizar
requisições HTTP para os serviços envolvidos para validar se o serviço tem o necessário para persistir uma informação
(fase 1), e em seguida, realizar outra requisição para cada serviço, persistindo a informação desejada (fase 2).
• O problema dessa estratégia é que, em qualquer cenário de falha, os dados ficam inconsistentes.
Saga Orquestrado e Coreografado
Conceitos, vantagens e desvantagens
Padrão Saga - Conceitos
• É um padrão que tem como objetivo garantir a execução de sucesso de um fluxo de transações,
e também garantir que em caso de falha, todas as alterações sejam desfeitas na sequência que
foram realizadas.
• Consiste na ideia de uma coreografia existente entre os microsserviços, ou seja, o próprio serviço possui a
lógica para saber qual será o próximo passo a ser decidido no fluxo com base no resultado da iteração
atual, seja sucesso ou falha.
• Nesta estratégia, o próprio serviço tem conhecimento dos próximos serviços que serão executados na
ordem conforme a resposta.
Padrão Saga Coreografado
• Pode ser mais complexo de ser testado devido o conhecimento geral dos
microsserviços envolvidos.
Padrão Saga – Saga Execution
Controller
• Necessidade de ter uma tabela de Outbox em todos os serviços que utilizarem esta
abordagem.
• A idempotência é um conceito que se aplica a operações ou ações que podem ser repetidas
várias vezes sem causar efeitos colaterais adicionais ou alterar o resultado final além da
primeira execução.
• Como o Kafka é uma ferramenta distribuída, é possível que um tópico consiga consumir um
mesmo evento mais de uma vez, pense o seguinte cenário:
Apache Kafka – Conceitos e
aplicações
1. Temos um tópico com 4 partições, e 2 consumers, que irão consumir os eventos de cada uma
das 2 partições.
2. Neste caso, o nosso produtor quer garantir a entrega do evento, e ele sempre publicará no
tópico o mesmo evento 4 vezes, para garantir que as 4 partições recebam o evento.
3. Se o mesmo evento for publicado nas 4 partições e cada um dos 2 consumers consumirem de 2
partições, então, nós iremos consumir o mesmo evento mais de uma vez.
4. Neste caso, mesmo criando uma chave única de publicação utilizando key value, o problema
será que a key será sempre distinta e o value será sempre igual, neste caso, é interessante que a
gente implemente uma estratégia para identificação de um evento idêntico, no caso, algum ID
que represente aquele contexto.
Apache Kafka – Conceitos e
aplicações
• Para isto, podemos usar um ID que iremos persistir nos serviços para identificar que todos os
eventos daquele payload sejam relacionados a este contexto específico.
• Um exemplo do nosso projeto, sempre que gerarmos um pedido, antes dele ser comunicado aos
tópicos do Kafka, nós geraremos um UUID e um OrderID (ID do MongoDB), e estes 2
identificadores sempre estarão no payload dos eventos.
• Com isso, em cada microsserviço, nós iremos persistir nossas ações vinculadas a esses 2 ids, e
sempre iremos validar se já não existe uma interação para esses 2 ids, garantindo que nunca
repita uma ação que não pode ser repetida, por exemplo, atualização de estoque dos produtos ou
tentativa de realização de pagamento.
Apache Kafka – Tópicos ou Filas?
• É muito comum a confusão entre tópicos e filas, principalmente quando falamos
sobre o Kafka, porém, são conceitos diferentes, o Kafka trabalha com tópicos e não
filas. Inclusive é muito comum a confusão de pessoas que não conhecem o Kafka e
pensam que é uma alternativa ao RabbitMQ e que faz a mesma coisa, mas não!
• O Kafka possui persistência de eventos de maneira nativa e padrão, enquanto o Rabbit não,
mesmo podendo ser configurável através de plugins.
• O Kafka possui garantia de entrega do evento por padrão, enquanto o RabbitMQ mesmo tendo a
possibilidade, não trabalha com esta abordagem por padrão.
Referências
• O que são microsserviços? https://aws.amazon.com/pt/microservices/
• What are microservices? https://microservices.io/
• Usando Saga para garantir consistência de dados em ambientes distribuídos
https://sidhartarezende.medium.com/usando-saga-para-garantir-consist%C3%AAncia-de-dados-em-ambientes-distribu%C3%A
Ddos-2edad93798c7
• Padrão SAGA para arquitetura de Microsserviços:
https://www.zup.com.br/blog/padrao-saga-para-arquitetura-de-microsservicos
• Pattern: Saga https://microservices.io/patterns/data/saga.html
• Saga Pattern in Microservices https://www.baeldung.com/cs/saga-pattern-microservices
• SAGA Pattern Briefly https://medium.com/trendyol-tech/saga-pattern-briefly-5b6cf22dfabc
• Saga Orchestration for Microservices Using the Outbox Pattern https://www.infoq.com/articles/saga-orchestration-outbox/
• [MICROSERVICES] Outbox Pattern https://medium.com/@victorhsr/microservices-outbox-pattern-a4344d8ed0b
• Pattern: Transactional Outbox https://microservices.io/patterns/data/transactional-outbox.html
• Patterns for distributed transactions within a microservices architecture
https://developers.redhat.com/blog/2018/10/01/patterns-for-distributed-transactions-within-a-microservices-architecture
Referências
• Apache Kafka: https://kafka.apache.org/intro
• Entendendo como o Consumidor Kafka funciona:
https://medium.com/@alvarobacelar/entendendo-como-um-consumidor-kafka-funciona-ee72237904c8
• Entendendo o Apache Kafka I: https://medium.com/luizalabs/entendendo-o-apache-kafka-i-27342ec9e29
• How to Develop a Winning Kafka Partition Strategy: https://www.openlogic.com/blog/kafka-partitions
• Apache Kafka: Introduction: https://kafka.apache.org/intro
• Event-driven Architecture (EDA) em uma Arquitetura de Microsserviços:
https://medium.com/@marcelomg21/event-driven-architecture-eda-em-uma-arquitetura-de-micro-servi%C3%A7os-1981614c
dd45
• O que é uma arquitetura orientada por eventos?: https://aws.amazon.com/pt/event-driven-architecture/
• Event-driven architecture style: https://learn.microsoft.com/en-us/azure/architecture/guide/architecture-styles/event-driven
• Pattern: Event-driven architecture: https://microservices.io/patterns/data/event-driven-architecture.html
Muito obrigado!