the Two Generals problem
termoprogramaçãonuvemredes
A prova de que duas partes num canal não confiável jamais podem ter certeza de que concordaram em agir juntas.
Dois generais precisam atacar simultaneamente e só se comunicam por mensageiros que podem ser capturados; seja qual for a confirmação enviada por último, quem a enviou não pode saber se chegou, então nenhum protocolo finito alcança acordo com certeza, resultado formalizado nos anos 1970. É a impossibilidade de alicerce sob as transações distribuídas, a entrega exactly-once e todo loop de retry com chaves de idempotência. Seu irmão mais difícil, os generais bizantinos, acrescenta traidores; sistemas reais se contentam com o provavelmente-acordado, que é o que timeouts e confirmações de fato compram.
Dois exércitos precisam atacar simultaneamente para vencer e só conseguem se comunicar por mensageiros que podem ser capturados. O primeiro general envia um horário, e não tem como saber que chegou. O segundo confirma, e não tem como saber que a confirmação chegou. Nenhuma sequência finita de mensagens produz certeza dos dois lados, e o problema é comprovadamente insolúvel.
Não é um quebra-cabeça, é uma condição de contorno dos sistemas distribuídos, e significa que acordo garantido sobre um canal não confiável é impossível, e não meramente difícil. Todo sistema real, portanto, contorna isso em vez de resolvê-lo, e saber disso muda o que se procura num projeto.
As consequências práticas estão em toda parte. Entrega exatamente uma vez não existe; o que existe é entrega ao menos uma vez mais processamento idempotente, que produz o mesmo resultado observável e é mecanismo genuinamente diferente. Um sistema de pagamentos não pode ter certeza de que uma cobrança teve sucesso, então reconcilia. O TCP não garante que o par recebeu sua última mensagem, apenas que confirmou as anteriores. Todo projeto que pressupõe certeza sobre o estado de uma parte remota está pressupondo algo que a matemática diz que ele não pode ter.