Bom pessoal, lembrando agora que a gente está falando agora de saga em momentos de orquestração e não de coreografia. Ou seja, você tem um cara que vai ficar aí no meio orquestrando e garantindo que todos os passos são finalizados. Bacana? Então deixa eu trazer aqui para vocês alguns pontos de partida. Eu estou partindo aqui do princípio que cada uma dessas transações vão acontecer em microserviços que têm os seus próprios bancos de dados totalmente independentes. Então, deixa eu até aumentar o zoom aqui para que você consiga ver como que as coisas elas acontecem aqui. Então vamos imaginar que para iniciar uma saga, eu vou ter o meu mediador recebendo dados de algum tópico, pode ser de uma Apache Kafka, de um RabbitMQ ou eventualmente poderia ser uma requisição REST, não interessa. Um GRPC não interessa, aqui eu coloquei como tópico. Mas basicamente, ele vai passar aqui para a gente um dado inicial. Legal? E esse dado inicial, o que ele vai fazer? Ele vai acoplar a um inicializador da nossa saga. E esse inicializador dessa nossa saga, o que ele vai fazer? Ele vai mandar essa mesma mensagem para um tópico de um micro serviço número 1. Então é isso que você tem que entender. Então, aqui está o primeiro momento que iniciou a primeira transação. Um ponto importante aqui que você tem que se ligar é que na hora que isso acontece, o sistema aqui, ele começa a guardar estados. Ou seja, a saga, né? Ou seja, ela iniciou. O passo, opa, o passo que ela... O passo que ela começou foi o passo 1. E o status do primeiro passo é running. Por quê? Porque esse passo aqui começou a ser executado. E, obviamente, tá? por que porque esse passo aqui começou a ser executado e obviamente está a cada saga que você inicia ela tem um id né pra identificação para separar uma saga da outra legal então o que acontece nesse momento aqui esse micro serviço um ele vai process processar transação na hora que ele processa a transação ele dá um retorno e aqui tá eu estou mandando esse retorno para o próprio tópico tá mas esse retorno ele poderia ser em tópicos diferentes então posso ter um tópico para recebimento e um tópico específico para envio de dados aí é questão de como cada sistema quer se comportar tá aí o que vai acontecer ele manda essa informação aqui né falando sobre o step 1 tá então nesse momento aqui se você perceber os dados da saga eles começam a mudar o estado. A saga agora está como Running. O Step 1, o status dele foi que teve sucesso. E agora ele fala que o próximo passo é o Step 2, que vai começar a rodar. Eu poderia até ter colocado aqui como pending, e na hora que ele começar a rodar, eu mudo aqui para running, mas eu acho que deu para vocês pegarem a ideia. Quando esse passo 2 começa a inicializar, ou seja, quando é enviada a informação para o passo 2, a gente tem uma publicação num tópico para o microserviço 2 que vai executar esse microserviço 2. E agora, o que vai acontecer aqui com a gente? Ele vai processar com sucesso, vai avisar o Step 2 que ele processou. Então, nesse momento aqui, a nossa saga continua rodando, falando que o Step 2 foi realizado com sucesso. E agora, o próximo Step que a gente vai ter aqui é o Step número 3, que vai começar a rodar. número 3, que vai começar a rodar. Então, se você perceber, uma operação só começa a ser executada após a outra. Isso aqui a gente está falando, pessoal, de sistemas que são distribuídos. Mas lembrando que, dependendo da situação, você consegue executar sagas de forma local dentro do seu próprio sistema com um único sistema. Como um sistema monolítico, por exemplo, também. Só para você saber. Então, o que acontece agora aqui? O step number 3, ele começa a ser executado. começa a ser executado e nesse momento ele começa a ser executado né ele manda informação aqui para esse tópico e na hora que ele executou a parada falhou tá ou seja vamos imaginar que aconteceu algum erro e o que que acontece quando um erro, a gente tem que compensar esse erro, ou seja, realizar um processo de rollback. Como que funciona aqui? Uma vez que a gente percebeu que a informação na hora de processar falhou, esse microserviço número 3 vai retornar aqui para o tópico falando compensate. Deu erro e você vai ter que compensar. aqui para o tópico, falando compensate. Deu erro e você vai ter que compensar. Legal? Ou seja, deu ruim. A gente vai ter que voltar todos os steps agora. Então, o que vai acontecer? Ele recebe e o status da saga muda agora. O status da nossa saga agora, ao invés de running, ela vai mudar para compensating. Ou seja, iniciou em processo de compensação. O step que foi executado, que era o número 3, falhou. Então isso eu sei agora o porquê a minha saga estava compensando. Legal? Agora, qual que é o próximo passo aqui embaixo? O próximo passo é execução do microserviço número 3 de novo. O passo número 3. Por quê? Porque ele executou aqui o passo número 3 e ele fez um monte de coisa e uma parte dele falhou ele falou poxa deixou compensar realmente certinho então o que acontece ele recebe aqui a opção do micro serviço 3 pedindo pra compensar se isso aqui no caso se essa chamada aqui realizou alguma operação no final mesmo falhando caso contrário aqui o step poderia ser já o número o número 2 legal mas eu botei o número 3 aqui e agora aqui o que vai acontecer né perceba que ele executou o step número 3 e agora ele vai executar normalmente o número 3 o que ele vai fazer? No step number 3, ele vai executar agora aqui uma operação de compensação. Ou seja, tudo que no step anterior, no step 3 mesmo, foi executado, ele vai voltar para garantir que não vai ter nenhuma besteira. Legal? E aí, o que vai acontecer? Ele vai mandar a informação aqui de volta. E aí aí a nossa saga tem o seguinte status agora o status ainda está compensando o step número 3 foi igual a compensar ou seja foi compensado já o strep o step number 3 tal número 3 e agora ele vai falar qual é o próximo step, o número 2. Qual vai ser o status dele? Compensando. Perceba agora que a gente está voltando, a gente estava 1, 2, 3, agora a gente vai 3, 2, 1. Então ele está falando, olha, o step 2 está compensando. Aí a gente vai receber a informação aqui no step 2, o Step 2 vai executar a transação de compensação. A informação vai voltar aqui. E daí a gente muda o status da saga novamente. O status da saga ainda está compensando. O Step 2 foi já compensado. Qual é o último Step que a gente tem agora aqui? O Step 1, falando que ele está compensado. Qual que é o último step que a gente tem agora aqui? O step número 1, falando que ele está compensando. Então a gente manda a informação para o step número 1, aqui inclusive o service é 1, para deixar certinho aqui para vocês. Aí o 1 executa a informação de compensação, ele retorna a informação para cá e agora o status da saga vai mudar. O status da saga agora é compensated and completed. O que isso significa? Significa que a saga realmente acabou, mas ela acabou de forma compensada. Então, eu posso partir do princípio que o que ela foi feita para fazer no início não aconteceu. Porque se tivesse acontecido, ela estaria ali como Completed apenas. Mas ela está como Compensated and Completed. O Step número 1 está Compensated e o Step número 1, o Status, está Compensated. Então aqui a gente acabou uma saga passo por passo pessoal deve dar pra você imaginar o bocado de trabalho que é criar um orquestrador desse que consiga gerenciar de forma distribuída todos esses passos né então no próximo vídeo eu quero mostrar pra você um rascunho tá de orquestrador só pra você entender em relação ao código como que isso poderia ser beleza então vamos nessa