>_ DevTrendspt

Idioma

Início

Linguagens

Seções

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarcados Segurança
Rust

Como Executar Cloudflare Durable Objects em Seus Próprios Servidores Usando celld

Ryan Dahl e a equipe do Deno open-sourcearam discretamente o projeto celld. Se você já invejou os usuários do Cloudflare pelo conceito de Durable Objects, mas não queria lidar com vendor lock-in, isso pode te interessar.

celld é um runtime de daemon Rust que pode executar bundles de Cloudflare Workers e instâncias isoladas de Durable Objects em seu próprio hardware. Sem Etcd, sem Raft, e sem serviços pesados de coordenação.

O Núcleo do Conceito

Backends tradicionais são tipicamente divididos em microsserviços sem estado e um único banco de dados relacional grande. À medida que a carga aumenta, o banco de dados inevitavelmente se torna o principal gargalo.

O Cloudflare propôs uma abordagem diferente. Cada entidade ativa da aplicação (por exemplo, uma sala de chat, carrinho de compras ou sessão de documento) recebe seu próprio isolate V8 e um banco de dados SQLite pessoal. O objeto acorda quando uma requisição chega, mantém o estado na memória e em um arquivo SQLite local, e simplesmente adormece quando ocioso.

O principal problema era a natureza fechada do ecossistema: executar essa configuração fora da infraestrutura do Cloudflare era praticamente impossível até agora.

Como o celld Funciona Internamente

Os desenvolvedores do celld optaram por uma simplificação radical. A arquitetura do nó consiste em quatro componentes:

  1. V8 Embarcado para executar código JavaScript e TypeScript de bundles do Wrangler.
  2. SQLite local para o arquivo de banco de dados separado de cada objeto.
  3. Armazenamento compatível com S3 (AWS S3, MinIO, Cloudflare R2) como fonte única da verdade.
  4. Transporte entre servidores com assinatura HMAC para troca de dados entre nós.

A solução mais interessante aqui é a aband

ono de protocolos clássicos de consenso. Nós de cluster não precisam eleger um líder ou executar Consul.

Em vez disso, os servidores se comunicam com o S3 através de uma operação atômica de Compare-And-Swap (CAS). Quando um nó quer assumir a propriedade de um objeto, ele escreve um arquivo de propriedade no bucket S3. Quem conseguir atualizar o registro via CAS primeiro lida com o tráfego. Se um nó trava, o timeout de escrita expira, e um servidor vizinho assume o objeto, baixa seu banco de dados SQLite atualizado do bucket e continua trabalhando.

Lançamento e Implantação

Builds padrão do Wrangler funcionam para compilar o projeto, mas você vai precisar de um servidor com 5 e o próprio binário 6.

A instalação é feita com um único comando:

0

O fluxo de trabalho é dividido em duas etapas. Primeiro, faça upload do build do worker para o bucket:

1

Depois inicie o daemon no servidor:

2

Cada nó no cluster lê o manifesto 7 do bucket. Se você precisar subir um servidor adicional, você inicia outro processo com o mesmo bucket e especifica seu endereço de rede em 8.

Em relação à segurança: o tráfego entre servidores do celld não criptografa TLS por padrão. Os autores recomendam colocar as portas internas dos nós atrás de uma rede overlay segura como WireGuard ou Tailscale. Todas as requisições entre pares são automaticamente assinadas com uma chave HMAC 9 que o primeiro nó cria automaticamente no bucket.

Diagnóstico e Gerenciamento de Carga

Para monitoramento do cluster, existe o utilitário 10. Ele consulta os vizinhos e exibe as métricas atuais:

3

O comando vai exibir o consumo de CPU, memória RSS, o número de conexões WebSocket ativas e a contagem de objetos ativos em cada nó.

Se um servidor começar a ficar sobrecarregado, o celld tem um mecanismo de descarte de pressão para objetos ativos. Os limites são definidos via variáveis de ambiente:

4

Quando o limite é excedido, o celld salva objetos inativos no S3, libera a propriedade e para de aceitar novas entidades até que a carga caia para o valor de 11. Objetos com requisições frequentes ou conexões WebSocket abertas não são afetados.

Uma Abordagem Incomum para Contribuir

Se você for ao repositório 12 com a intenção de abrir um Pull Request, vai encontrar o botão desabilitado. Forks são permitidos, mas PRs no GitHub estão completamente desabilitados.

Ryan Dahl explica isso como uma luta contra spam de agentes de IA: revisar pull requests gigantescos auto-gerados sem contexto leva tempo demais dos mantenedores. Aqueles que quiserem enviar um patch são solicitados a fazer 13 e enviar o arquivo por email para o endereço pessoal 14.

Quem Deve Dar Uma Olhada Neste Projeto

O projeto está em desenvolvimento ativo, com especificações de protocolo armazenadas diretamente no código do crate Rust 15. É cedo demais para puxá-lo para produção crítica, mas experimentar definitivamente vale a pena.

A ferramenta será útil nos seguintes casos:

  1. Desenvolvedores de serviços multiplayer, chats e CRMs personalizados.
  2. Equipes que planejam sair do lock-in do Cloudflare sem reescrever código.
  3. Fãs da arquitetura com banco de dados separado por cliente-usuário.
  4. Engenheiros aprendendo sobre sistemas distribuídos sem Raft e Etcd.

Projetos relacionados