2 pontos por GN⁺ 2024-07-30 | 1 comentários | Compartilhar no WhatsApp
  • Movable tree CRDTs and Loro's implementation

  • Contexto

    • Em sistemas distribuídos e softwares colaborativos, gerenciar relações hierárquicas é algo complexo
    • Ao modelar movimentos combinando exclusão e inserção em uma estrutura de dados, é difícil resolver conflitos e atender às expectativas dos usuários
    • Por exemplo, se o mesmo nó for movido simultaneamente para pais diferentes, podem surgir nós duplicados com o mesmo conteúdo
  • Conflitos em árvores movíveis

    • Principais operações de uma árvore movível: criar, excluir e mover
    • Conflitos que podem ocorrer ao sincronizar operações concorrentes:
      • o mesmo nó é excluído e movido
      • o mesmo nó é movido para baixo de nós diferentes
      • outros nós são movidos, gerando um ciclo
      • um nó descendente é movido enquanto um nó ancestral é excluído
  • Exclusão e movimento do mesmo nó
    • Relativamente fácil de resolver
    • Dependendo do timestamp em sistemas distribuídos ou dos requisitos específicos da aplicação, uma das operações é aplicada e a outra é ignorada
  • Mover o mesmo nó para pais diferentes
    • Mesclar operações de movimento concorrentes é mais complexo
    • Dependendo da aplicação, diferentes abordagens podem ser adotadas:
      • excluir o nó e criar uma cópia sob outro nó pai
      • permitir que o nó fique ligado a dois pais (geralmente isso não é permitido)
      • ordenar todas as operações e aplicá-las sequencialmente
  • Geração de ciclos pelo movimento de nós diferentes
    • Resolver ciclos causados por operações de movimento concorrentes é complexo
    • Há várias soluções:
      • gerar um erro
      • renderizar os nós em ciclo em uma área especial de "timeout"
      • processar as operações de movimento no servidor
      • usar ordenação topológica
      • ocultar a aresta que causa o ciclo
  • Exclusão de nó ancestral e movimento de nó descendente
    • O movimento de um nó descendente durante a exclusão de um ancestral pode passar facilmente despercebido
    • Excluir diretamente todos os nós descendentes pode ser interpretado como perda de dados
  • Como aplicativos populares tratam conflitos

    • Dropbox: tratava a movimentação de arquivos como exclusão seguida de criação, mas isso traz risco de perda de dados
    • Figma: um servidor central detecta ciclos e rejeita a operação para manter a consistência
  • CRDTs de árvore movível

    • Uso de CRDTs em vez de soluções centralizadas
    • Os algoritmos iniciais baseados em CRDT eram difíceis de implementar e tinham grande overhead de armazenamento
    • Com otimizações contínuas, alguns algoritmos de sincronização de árvores baseados em CRDT tornaram-se adequados para ambientes de produção
  • Operações de movimento de alta disponibilidade para árvores replicadas

    • As três operações da árvore (criar, excluir e mover) são unificadas como operações de movimento
    • A operação de movimento é definida como Move t p m c
    • A exclusão de nós é tratada movendo-os para o nó TRASH
  • Timestamps lógicos globalmente ordenados
    • Uso de timestamps de Lamport para determinar a ordem causal dos eventos em sistemas distribuídos
    • Números menores indicam eventos mais antigos
  • Aplicação de operações remotas
    • A segurança de uma operação depende do estado da árvore no momento da aplicação
    • Ao processar atualizações remotas, as operações mais recentes são desfeitas, a nova operação é inserida e, em seguida, as operações desfeitas são reaplicadas
  • CRDT: hierarquia de árvore mutável

    • Cada nó acompanha todos os nós pais históricos e recebe contadores
    • Se surgir um ciclo durante a sincronização, o nó é reconectado ao nó pai histórico mais próximo
  • Implementação de CRDTs de árvore movível na Loro

    • Implementa o algoritmo de Martin Kleppmann para oferecer alto desempenho
    • Integra o algoritmo Fractional Index para permitir a ordenação de nós filhos
  • Conflitos potenciais na ordenação de nós filhos

    • Ao inserir vários nós na mesma posição, pode ser atribuído o mesmo Fractional Index
    • PeerID é usado para determinar a ordem relativa entre Fractional Index idênticos
  • Implementação e tamanho da codificação

    • Fractional Index fornece a ordem dos nós
    • O tamanho da codificação pode exigir bytes adicionais no pior caso, mas isso é raro
  • Trabalhos relacionados

    • Além de Fractional Index, também existem CRDTs de lista movível
    • Fractional Index é simples de implementar e útil quando apenas a ordem relativa é necessária
  • Benchmark

    • Foi realizado um benchmark de desempenho da implementação de árvore movível da Loro
    • Há suporte para colaboração em tempo real e checkout fluido de versões históricas
  • Resumo

    • Apresenta a dificuldade de implementar CRDTs de árvore movível e dois algoritmos inovadores
    • A Loro integra o algoritmo de Martin Kleppmann com Fractional Index para atender a vários cenários de aplicação
  • Resumo do GN⁺

    • CRDTs de árvore movível desempenham um papel importante na gestão de estruturas hierárquicas de dados em sistemas distribuídos
    • A Loro oferece alto desempenho e resolução eficiente de conflitos, sendo adequada para aplicações de colaboração em tempo real
    • Usa Fractional Index para resolver o problema de ordenação de nós filhos
    • Outros projetos com funcionalidades semelhantes incluem Figma e Dropbox

1 comentários

 
GN⁺ 2024-07-30
Comentários do Hacker News
  • Está desenvolvendo um novo editor multiplayer

    • Suporta trabalho com texto e outliner
    • O documento é transformado em uma grande estrutura de árvore
    • A sincronização é feita usando operações insmov (mover ou inserir)
    • Quando o servidor envia mudanças, o cliente as reaplica
    • Na maioria dos casos, não é necessário desfazer operações
    • Quase não há problemas durante atualizações em tempo real
  • Disponibiliza a React Table Library como código aberto

    • Lida com estruturas de árvore de pastas/arquivos
    • Suporta mover e duplicar pastas/arquivos, carregamento sob demanda etc.
    • Passou a entender por que o Google Drive só exibe e permite editar no mesmo nível hierárquico
  • Pede conselhos

    • Está usando uma grande árvore desnormalizada no frontend
    • Gerencia perfis de usuário em um layout de blocos
    • Envia a quantidade mínima de dados para garantir atualizações seguras
    • Parece que usar CRDT tornaria o gerenciamento de estado muito mais fácil
    • Isso permitiria sincronização entre abas do navegador
  • Ao trabalhar com conteúdo de texto formatado como no Google Docs/Zoho Writer, é necessário manipular árvores

    • É difícil resolver problemas de conflito simultâneo
    • Parece possível combinar CRDT de lista com CRDT de árvore
    • Seria preciso adicionar endereços bidimensionais a todas as operações
  • Pergunta se existe algum CRDT prático para aplicações densas em dados, como imagens (pixels) e modelos 3D

  • Acha que o primeiro parágrafo soa como a voz do ChatGPT