2 pontos por GN⁺ 2024-10-15 | 1 comentários | Compartilhar no WhatsApp
  • Zero-latency SQLite storage in every Durable Object

    • Kenton Varda apresenta a próxima versão da plataforma Durable Object da Cloudflare. A plataforma foi recentemente atualizada de um armazenamento chave/valor para um sistema relacional completo baseado em SQLite
    • Para um contexto útil sobre a primeira versão dos Durable Objects, vale consultar Cloudflare's durable multiplayer moat de Paul Butler. Ela é popular para construir aplicações de colaboração em tempo real baseadas em WebSocket
    • Os novos Durable Objects baseados em SQLite são um elemento fascinante de design de sistemas distribuídos que sugere uma forma interessante de projetar aplicações em larga escala
  • Ideia central dos Durable Objects

    • Um Durable Object oferece leituras e escritas muito rápidas ao colocar a lógica da aplicação no mesmo host físico dos dados
    • Um único objeto é executado em uma única thread de uma única máquina, então sua taxa de processamento é limitada. Para lidar com mais tráfego, criam-se mais objetos. Isso é mais simples quando cada unidade de estado tem tráfego baixo o suficiente para ser atendida por um único objeto
  • Exemplo de sistema de reserva de voos

    • Cada voo pode ser mapeado para um Durable Object dedicado com seu próprio banco de dados SQLite. Milhares de novos bancos de dados são criados por dia para cada companhia aérea
    • Cada DO tem um nome único, e a rede da Cloudflare roteia as requisições para esse objeto onde quer que ele esteja no mundo
  • Detalhes técnicos

    • Inspirado no Litestream, cada DO transmite continuamente uma sequência de entradas WAL para um armazenamento de objetos. Isso é feito em lotes a cada 16 MB ou a cada 10 segundos
    • Para garantir durabilidade dentro da janela de 10 segundos, as escritas são enviadas para cinco réplicas em data centers próximos assim que são confirmadas, e a escrita é aceita quando três delas dão confirmação
  • Design da API JavaScript

    • Foi projetada de forma bloqueante, e não assíncrona. Isso serve para oferecer operações de persistência rápidas em uma única thread
    • Inclui exemplos que mostram intencionalmente o padrão de consultas N+1, que o SQLite consegue lidar bem
  • Storage Relay Service

    • É o sistema subjacente dos Durable Objects e já sustenta o sistema SQLite D1 existente da Cloudflare há mais de um ano
  • Onde os Durable Objects são criados

    • Os Durable Objects não mudam de localização depois de criados. Por padrão, eles são instanciados no data center onde a requisição inicial get() é feita
    • Para criar manualmente Durable Objects em outro local, fornece-se o parâmetro opcional locationHint ao get()
  • Site where.durableobjects.live

    • É um site que rastreia onde os DOs são criados na rede da Cloudflare

Resumo do GN⁺

  • Os Durable Objects da Cloudflare, baseados em SQLite, apresentam novas possibilidades para projetar aplicações em larga escala. Eles oferecem desempenho rápido ao colocar os dados e a lógica da aplicação no mesmo host físico
  • Esse sistema é especialmente útil para aplicações de colaboração em tempo real e oferece flexibilidade para lidar com diferentes unidades de estado
  • Os Durable Objects criam réplicas em vários data centers para garantir a durabilidade dos dados, aumentando a estabilidade e a confiabilidade
  • Essa tecnologia pode ser interessante para desenvolvedores interessados em projetar sistemas distribuídos em larga escala. Sistemas com funcionalidades semelhantes incluem o DynamoDB da Amazon e o Firestore do Google

1 comentários

 
GN⁺ 2024-10-15
Comentários no Hacker News
  • A API de escrita é síncrona, mas tem uma funcionalidade assíncrona oculta de espera. Se uma escrita falhar, o runtime substitui a resposta por uma falha HTTP, o que permite agrupar escritas automaticamente e assumir sucesso

    • Não há transações de leitura, então é difícil obter um snapshot de um ponto específico no tempo
    • Cada instância de runtime é limitada a 128MB de RAM
    • WebSockets podem hibernar e, nesse estado, não geram custo. Isso permite que o cliente mantenha a conexão mesmo quando o DO está adormecido
    • Há um recurso de RPC automático, então é possível se comunicar com outros DOs ou workers como se fossem chamadas JS normais. O runtime cuida da serialização e do parsing
  • Cada DO faz streaming da sequência de entradas do WAL para o object storage, em lotes a cada 16MB ou 10 segundos

    • Globalmente, uma escrita pode levar até 10 segundos para aparecer nas leituras
    • É difícil substituir clusters de banco de dados distribuídos regionalmente
  • Gosto do design dos Durable Objects. É fácil entender como funcionam por dentro

    • Os DOs são bons para criar experiências em tempo real rápidas e de baixo custo, mas análises e relatórios ficam difíceis
    • Se você colocar os dados no SQLite, precisa consultar várias pequenas instâncias de SQLite e mesclar os resultados
  • É difícil entender onde fica a localização física dos Durable Objects

    • Fico me perguntando se eles ficam na região onde a chamada de API aconteceu
    • Fico me perguntando se um DO pode se mover automaticamente para outro local
  • É difícil entender as novas tecnologias de nuvem

    • Mesmo com mais de 15 anos de experiência em desenvolvimento web, sinto que essas tecnologias não são para mim
  • Fico me perguntando como lidar com migrações de esquema

    • Se o banco de dados existir por tenant, aplicar mudanças de esquema em cada DO parece difícil
  • O design dos DOs é interessante, mas acho que só serve para sistemas de alta carga ou projetos de brincadeira

    • No trabalho, são necessários sistemas comprovados, e os DOs ainda não estão maduros
  • Fiquei impressionado com o design dos DOs. Acho que a forma como lidam com trabalhos complexos em pequena escala se parece com a estrutura de produtos reais

  • Notei que a CF incentiva os desenvolvedores a usarem DOs

    • As conexões WebSocket dos workers expiram após 30 segundos, e o uso de DOs é recomendado
  • Fico me perguntando se os DOs correspondem ao "modelo" na arquitetura MVC

    • Tenho curiosidade sobre usar DOs por tenant e sobre como consultar ou fazer join entre todos os DOs