Sistemas Distribuídos: O que é Linearizabilidade?
Entenda como a linearizabilidade garante a consistência mais confiável, impondo ordem coerente em operações simultâneas em sistemas distribuídos.

Imagine que você está com fome e entra em um restaurante lotado. A fila é longa, mas você espera pacientemente a sua vez. Quando finalmente chega perto do balcão, alguém que chegou depois de você, lá no fim da fila, simplesmente aparece na sua frente e é atendido primeiro!
Parece caótico, certo? Pois bem, a linearizabilidade em sistemas distribuidos nasceu para resolver esse tipo de problema e hoje nós entenderemos como esse conceito funciona.
O que é Linearizabilidade?
Linearizabilidade (ou linearizability em inglês) é um critério de consistência em sistemas distribuídos. Em termos simples, um sistema linearizável é aquele no qual as operações parecem ocorrer em uma única ordem global, coerente com o tempo real. É como se todas as ações fossem registradas em uma linha do tempo impecável, sem inversões estranhas.
Mas por que Linearizabilidade é importante
Para entender melhor, vamos pará um outro exemplo prático. Imagine que você e seu amigo estão realizando transações em contas distribuídas geograficamente. Você faz uma transferência para a conta dele enquanto ele, simultaneamente, está verificando o saldo da própria conta.
Com a linearizabilidade, você pode ter certeza de que todas as operações são vistas na mesma ordem por todos os sistemas envolvidos. Se sua transferência é concluída antes dele verificar o saldo, ele verá o saldo atualizado refletindo sua transferência imediatamente. Sem linearizabilidade, a ordem das operações poderia parecer diferente para cada um, gerando confusão e possíveis inconsistências.

Como Alcançar a Linearizabilidade?
Vamos explorar diferentes maneiras de conseguir a linearizabilidade em um sistema distribuído:
Única Cópia
A abordagem mais simplista é usar uma única cópia dos dados, com isso sempre que realizar alguma consulta, o resultado será a "fonte da verdade", porém esse método tem suas desvantagens e uma delas é a disponibilidade, dado que caso o servidor tenha problemas e caia, os dados ficaram inacessíveis até o servidor voltar.
Complicações com a Replicação de Dados
Para aumentar a disponibilidade de um sistema distribuído, não há como escapar de replicar os dados. É nesse ponto que as coisas se tornam mais complexas, pois é imprescindível garantir que todas as réplicas permaneçam atualizadas. Embora à primeira vista pareça algo simples, na prática surgem inúmeros desafios, especialmente diante de atrasos imprevisíveis na rede e de uma infinidade de cenários de falha possíveis em sistemas distribuídos.
Uma maneira de tentar resolver isso é adotando uma estratégia de replicação com um único líder (Single-leader Replication). Nessa abordagem, apenas um servidor (o líder) é responsável por todas as escritas nos dados. As réplicas de leitura sempre consultam o líder para garantir que estão obtendo a versão mais atualizada dos dados.
Contudo, isso pode impactar bastante o desempenho, já que cada leitura precisa verificar com o líder. Além disso, é preciso evitar a situação conhecida como "split-brain", onde dois servidores agem como líderes simultaneamente, o que quebraria a linearizabilidade e causaria uma verdadeira bagunça nas operações.
Linearizabilidade na Estratégia de Replicação com Único Líder
A base de dados Google Spanner, por exemplo, consegue preservar a linearizabilidade com um impacto mínimo de custo usando a sua API TrueTime.
Basicamente, eles têm uma maneira sofisticada de sincronizar os relógios de todos os servidores, garantindo que todas as operações sejam registradas na ordem correta sem atrasos significativos. Se quiser saber mais sobre como o Spanner faz isso, dá uma olhada no artigo deles sobre o assunto.
Quando Usar ou Não Usar Linearizabilidade?
Embora a linearizabilidade ofereça fortes garantias de consistência, ela não vem sem custos. Implementar linearizabilidade exige mecanismos complexos de consenso e coordenação entre servidores, o que pode aumentar a latência e reduzir a disponibilidade do sistema.
- Quando usar:
- Sistemas Financeiros: Transações bancárias, transferências de dinheiro e sistemas de pagamento que exigem precisão absoluta na ordem das operações.
- Controle de Inventário em Tempo Real: Sistemas que gerenciam estoques sensíveis onde uma atualização incorreta pode levar a erros significativos.
- Sistemas de Controle Industrial: Onde a ordem exata das operações pode impactar a segurança e a eficiência dos processos.
- Quando não usar:
- Redes Sociais: Onde pequenas discrepâncias na ordem das operações (como likes ou comentários) são aceitáveis e não afetam a experiência do usuário de forma significativa.
- Aplicações de Entretenimento: Streaming de vídeo ou plataformas de compartilhamento de conteúdo onde a ordem exata das operações não é crítica.
- Sistemas de Caching Distribuído: Onde a velocidade e a disponibilidade são mais importantes do que a precisão absoluta da ordem das operações.
Conclusão
A linearizabilidade é um conceito fundamental para garantir a consistência e a confiabilidade em sistemas distribuídos, especialmente em contextos onde a ordem das operações é crítica, como em sistemas financeiros. Ela assegura que todas as operações sejam vistas na mesma sequência por todos os participantes, evitando confusões e inconsistências que podem minar a confiança no sistema.
Entender a linearizabilidade permite que arquitetos de sistemas, desenvolvedores e gerentes de produto tomem decisões informadas, equilibrando consistência, desempenho e complexidade para construir sistemas distribuídos que atendam às suas necessidades específicas de forma eficaz e confiável.