Modelos de sistemas distribuídos, problemas dos dois generais. Aqui eu vou contar um pouco de história para você. Antes de eu começar, eu apenas quero comentar que, pessoalmente, o Martin Kleppmann e eu não temos preferência ou favoritismo por analogias militares. Porém, o problema dos dois generais é a maneira como nós vamos encontrar este conteúdo nas literaturas. Então, aqui não existe nenhuma intenção de fazer nenhuma apologia a militarismo. E sim, estou sendo direto com vocês na maneira como o conteúdo é apresentado na literatura. O problema dos dois generais, literatura de sistemas distribuídos. Então, vamos lá. Nós temos uma situação em que dois exércitos, exércitos aliados, desejam invadir, desejam conquistar uma cidade. E esses exércitos estão geograficamente distribuídos, estão afastados entre si e precisam fazer essa comunicação por meio de mensageiros. Então, eu espero que nesse ponto você já comece a visualizar os exércitos com seus respectivos generais como os nós de um possível sistema de banco de dados distribuído. Voltando aqui à nossa situação, nós vamos ter um resultado desejado que é o exército 1 ataca se e somente se o exército 2 atacar. Por que? Caso o exército 1 ataque sozinho, a cidade vai vencer, porque as defesas da cidade são muito fortes, são necessários dois exércitos para que a cidade seja tomada. E da mesma maneira, se o exército 2 for sozinho, também não vai conseguir tomar a cidade, os dois exércitos precisam ir juntos para que a cidade seja conquistada. Então nós vamos ter na tabela as possibilidades. Se o exército 1 não atacar e o exército 2 também não atacar, não temos resultado. Nada acontece. Caso o exército 1 ataque e o exército 2 não, então nós temos uma derrota. A cidade vence. Da mesma forma, se o exército 1 não atacar enquanto o exército 2 ataca, também é derrota. E caso ambos os exércitos consigam atacar, então há a vitória. Então, nós já percebemos que é necessário acontecer uma comunicação para que isso dê certo, para que esse objetivo de conquistar a cidade seja alcançado. Então, nós vamos perceber que o padrão de comunicação aqui, na primeira situação, o general 1 manda a mensagem de vamos atacar para o general 2, e o general 2 precisa confirmar que o ataque será feito. confirmar que o ataque será feito. Então, se a resposta for interrompida, nós temos já uma interrupção, temos uma partição de rede aqui. Na situação 2, o general 1 tenta enviar uma mensagem e essa mensagem nem chega para o general 2, também é uma outra situação de particionamento de rede. Do ponto de vista do General 1, essas situações são idênticas, não é possível identificar a diferença. Então, é necessário ter uma comunicação efetiva para que ambos os exércitos movam em conjunto e consigam alcançar o seu objetivo. Vamos olhar isso aplicado em uma situação de sistemas distribuídos. Então, aqui nós temos um momento em que um cliente realiza um pedido em uma loja online e este pedido tem o respectivo pagamento. Então aqui a situação é, nós temos a loja online não enviando o produto e o meio de pagamento não recebendo o dinheiro, não fazendo a cobrança deste pedido. Então o resultado é nada, ninguém ganha, o cliente não ganha o seu produto e o comerciante não ganha o seu dinheiro. Na outra situação, a loja envia o produto, mas o cliente não é cobrado, não paga pelo produto. Então nós temos uma perda financeira para a loja. Na outra situação, a loja não envia o produto, mas o cliente realizou o pagamento deste produto. Então, nós temos também uma perda, uma derrota para o cliente. E somente caso o produto seja enviado após o pagamento confirmado, aí sim nós temos a situação de sucesso, a situação de vitória. Então, aqui nós temos este dilema dos generais aplicados. Eu quero também aproveitar e fazer um destaque que, especificamente para método de pagamento, a gente pode talvez até entender que não se aplica diretamente, porque o pagamento é uma ação que pode ser revertida. Então, na prática, em sistemas produtivos, nós vamos perceber que a parte dos pagamentos sempre acontece. Todo mundo recebe o dinheiro. Por quê? Caso o produto não seja enviado, ou seja, eu tenho uma falha no meu nó ali da loja online, o pagamento pode ser revertido, a gente devolve o dinheiro para o cliente. Mas, em linhas gerais, eu acredito que o problema dos dois gerais aqui fica claro para a gente nesse instante. O principal aqui é entender que nós precisamos ter uma comunicação eficiente em sistemas distribuídos.