CRDT em produção: convergir não significa estar correto
CRDT em produção resolve uma parte difícil da sincronização: fazer réplicas concorrentes chegarem ao mesmo estado. A armadilha é tratar isso como se fosse a mesma coisa que preservar intenção, regra de negócio e custo operacional aceitável.
Imagine duas pessoas editando offline o mesmo documento. Uma alteração gera AB, outra gera BC. Se o sistema usa Last Write Wins para a propriedade inteira, as réplicas podem concordar em AB ou em BC, mas não em ABC. A convergência existe. O trabalho de alguém desaparece.
Essa é a pergunta que importa para arquitetura: quando duas mudanças válidas se encontram, qual resultado o domínio aceita?
CRDT em produção resolve merge concorrente?
Um CRDT é um tipo de dado construído com regras de combinação embutidas. Quando as réplicas recebem o mesmo conjunto de atualizações, essas regras fazem todas convergirem para o mesmo estado, sem exigir uma ordem total central para cada escrita.
Essa propriedade é útil em edição colaborativa, trabalho offline, replicação geográfica e sistemas que não podem depender de coordenação síncrona a cada alteração. Mas ela tem condições. As atualizações ainda precisam chegar. A aplicação ainda precisa autenticar, autorizar, persistir, reconectar, deduplicar e lidar com falhas de entrega.
Em texto colaborativo, o problema aparece rápido. “Inserir na posição 5” não é uma instrução estável quando outra réplica inseriu caracteres antes da mesma posição. Por isso algoritmos de sequência usam alguma forma de identidade ou ordenação lógica. O índice visível na tela não basta.
WebSocket vs CRDT: qual problema cada um resolve?
WebSocket resolve transporte bidirecional. Ele abre um canal para mensagens circularem com baixa latência. Isso não define a semântica de merge.
Se duas réplicas produziram estados concorrentes, a conexão apenas entrega mensagens. Quem decide se o resultado será AB, BC, ABC, uma interleaving estranha ou uma rejeição explícita é o modelo de dados e a regra de domínio. Confundir transporte com merge costuma produzir sistemas que parecem funcionar na demo e quebram quando aparecem offline, reconexão, duplicação de mensagens ou alterações simultâneas no mesmo campo.
Também existe diferença entre famílias de CRDT. Implementações baseadas em estado e baseadas em operações colocam requisitos em lugares diferentes. Em muitos desenhos, disseminar operações reduz payload, mas empurra mais responsabilidade para a camada de entrega: causalidade, persistência, idempotência e recuperação precisam deixar rastro.
Quando CRDT vale a pena e quando vira custo?
CRDT tende a valer a pena quando o produto realmente precisa aceitar concorrência, offline, alta disponibilidade sob falha de rede ou replicação geográfica com baixa coordenação. Quanto menos esses requisitos existem, mais difícil fica justificar a conta.
Essa conta não é abstrata. Convergência costuma cobrar metadados: identificadores, informação causal, histórico, tombstones em alguns algoritmos ou trabalho posterior de compactação. Não existe um percentual universal. O custo depende do tipo de dado, do padrão de edição, do número de réplicas e do algoritmo escolhido.
JupyterLab é um caso real instrutivo: usa Yjs para colaboração em tempo real, mas ainda mantém persistência e reconexão como camadas separadas no ambiente do Jupyter Server. O CRDT participa do modelo colaborativo. Ele não substitui banco, protocolo e operação.
O contraponto também é útil. A Figma documentou uma arquitetura com servidor como autoridade central para ordenar e validar mudanças, inspirada em ideias de CRDT, mas não um CRDT puro. Isso simplificou parte do merge, mas trouxe outra conta: disponibilidade, durabilidade e recuperação. No desenho antigo, checkpoints podiam deixar uma janela de perda de trabalho, depois reduzida com write-ahead log.
Por que convergir não garante correção do domínio?
Convergência responde a uma pergunta técnica: todas as réplicas chegaram ao mesmo estado? Correção responde outra: esse estado respeita a intenção do usuário e os invariantes do domínio?
Duas réplicas podem vender o mesmo assento offline e depois convergir para um estado consistente entre elas. O sistema concordou consigo mesmo, mas violou a regra de negócio. Em outros domínios, duas frases digitadas ao mesmo tempo podem convergir para um texto intercalado e ilegível. Tecnicamente igual em todas as cópias. Ruim para o humano.
A decisão pragmática não é “usar CRDT” ou “usar servidor central” como posição ideológica. É mapear quais operações do domínio aceitam merge automático e quais exigem reserva, coordenação, particionamento de direitos ou rejeição posterior. Estrutura de dados ajuda. Arquitetura ainda decide o que é correto.
Referências
- A comprehensive study of Convergent and Commutative Replicated Data Types - Shapiro, Preguiça, Baquero e Zawirski - https://dsf.berkeley.edu/cs286/papers/crdt-tr2011.pdf
- Conflict-free Replicated Data Types (CRDTs) - Preguiça, Baquero e Shapiro - https://arxiv.org/abs/1805.06358
- Conflict-free Replicated Data Types: An Overview - Preguiça - https://arxiv.org/abs/1806.10254
- Dynamo: Amazon’s Highly Available Key-value Store - DeCandia et al. - https://web.stanford.edu/class/cs245/readings/dynamo.pdf
- The WebSocket Protocol, RFC 6455 - IETF - https://datatracker.ietf.org/doc/html/rfc6455
- Yjs documentation - Yjs - https://docs.yjs.dev/
- Efficient State-based CRDTs by Delta-Mutation - Almeida, Shoker e Baquero - https://arxiv.org/abs/1410.2803
- Interleaving anomalies in collaborative text editors - Kleppmann, Gomes e Mulligan - https://martin.kleppmann.com/papers/interleaving-papoc19.pdf
- Moving text in collaborative rich-text editors - Kleppmann - https://martin.kleppmann.com/2022/11/08/peritext-rich-text-crdt.html
- A highly-available move operation for replicated trees - Kleppmann et al. - https://martin.kleppmann.com/papers/convergence-cacm.pdf
- Coordination Avoidance in Database Systems - Bailis et al. - https://arxiv.org/abs/1402.2237
- JupyterLab Real Time Collaboration - JupyterLab - https://jupyterlab.readthedocs.io/en/3.6.x/user/rtc.html
- Yjs in the Wild - Yjs - https://docs.yjs.dev/yjs-in-the-wild
- How Figma’s multiplayer technology works - Figma Engineering - https://www.figma.com/blog/how-figmas-multiplayer-technology-works/
- Making multiplayer more reliable - Figma Engineering - https://www.figma.com/blog/making-multiplayer-more-reliable/