ID: 0x

|

DATE:

Cloudflare Workers: o que é e como funciona na edge

AUTHOR:

|

READ_TIME: ~5 MIN

conheça o Cloudflare Workers

Quando publiquei a primeira versão deste artigo, em 2022, a Cloudflare ainda usava a sintaxe de Service Worker em muitos exemplos. A plataforma evoluiu desde então. Hoje, Module Workers, Wrangler e bindings formam o fluxo recomendado.

O Cloudflare Workers permite executar código serverless na rede global da Cloudflare. Assim, você pode criar APIs, redirects, middleware e aplicações completas sem administrar servidores.

Neste guia, vamos entender como o runtime funciona. Além disso, criaremos um Worker com a sintaxe atual.

O que é Cloudflare Workers?

Cloudflare Workers é uma plataforma serverless para executar código na rede da Cloudflare. Em vez de manter uma máquina virtual ou um container por aplicação, você envia o código para a plataforma.

A Cloudflare distribui esse código pela sua rede global. Quando uma requisição chega, o runtime executa o Worker conforme a rota configurada.

Se o conceito ainda for novo, vale começar pelo artigo sobre o que é serverless. Também publiquei uma introdução sobre como funciona a CDN da Cloudflare.

O runtime usa o motor JavaScript V8, também presente no Chromium e no Node.js. Além disso, oferece APIs conhecidas da web, como Request, Response, fetch, Streams e Web Crypto.

Porém, Cloudflare Workers não é um processo Node.js tradicional. A plataforma oferece compatibilidade com várias APIs do Node por meio da flag nodejs_compat. Ainda assim, você deve confirmar o suporte de cada pacote antes de usá-lo.

Como Cloudflare Workers funciona?

Três conceitos ajudam a entender a plataforma: isolates, computação por requisição e execução distribuída.

Isolates do V8

O V8 executa cada aplicação em um isolate. Um isolate é um contexto leve e isolado de memória.

Esse modelo permite que um processo do runtime hospede muitas aplicações. Como resultado, a plataforma evita o custo de iniciar uma máquina virtual para cada função.

Os isolates também começam mais rápido que processos baseados em VMs ou containers. No entanto, eles não permanecem ativos para sempre. A plataforma pode removê-los por limites de recursos, atualizações ou decisões do runtime.

Por isso, nunca trate a memória global como armazenamento persistente.

Computação por requisição

A sintaxe atual usa ES modules. O arquivo exporta um objeto com os handlers dos eventos que o Worker processa.

Um Worker HTTP básico usa o handler fetch:

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);

    if (url.pathname === "/api/hello") {
      return Response.json({
        message: "Olá do Cloudflare Workers!",
      });
    }

    return new Response("Rota não encontrada", {
      status: 404,
    });
  },
};Code language: JavaScript (javascript)

O handler recebe três argumentos:

  • request: contém a requisição HTTP.
  • env: expõe variáveis, secrets e bindings configurados.
  • ctx: controla tarefas ligadas ao ciclo de vida da execução.

O handler deve retornar uma instância de Response ou uma Promise que resolva para uma resposta.

O exemplo antigo com addEventListener ainda funciona. Contudo, a Cloudflare marcou a sintaxe de Service Worker como deprecated. Portanto, use Module Workers em projetos novos.

CPU time não é o mesmo que duração

O runtime mede o tempo em que a CPU executa o seu código. Esperar uma chamada de rede com fetch, por exemplo, não consome CPU time durante a espera.

A duração total da requisição inclui rede, armazenamento e outras operações assíncronas. Para requisições HTTP, não existe um limite rígido de duração enquanto o cliente continua conectado.

Se uma tarefa puder terminar depois da resposta, use ctx.waitUntil():

export default {
  async fetch(request, env, ctx) {
    const response = Response.json({ status: "ok" });

    ctx.waitUntil(registrarEvento(env, request));

    return response;
  },
};

async function registrarEvento(env, request) {
  // Envie analytics ou atualize um cache aqui.
}Code language: JavaScript (javascript)

Use waitUntil apenas quando a resposta não depender do resultado. Caso contrário, use await antes de retornar.

Como criar seu primeiro Cloudflare Worker

A ferramenta oficial de linha de comando se chama Wrangler. O C3, ou Create Cloudflare CLI, gera a estrutura inicial.

No terminal, execute:

npm create cloudflare@latest -- meu-primeiro-workerCode language: CSS (css)

Durante a configuração, escolha um exemplo Hello World e o template Worker only. Em seguida, abra a pasta criada:

cd meu-primeiro-worker

Para iniciar o ambiente local:

npx wrangler dev

O Wrangler abre um servidor em http://localhost:8787. Agora você pode editar src/index.js e validar o resultado localmente.

Quando o código estiver pronto, faça o deployment:

npx wrangler deploy

O projeto recebe um endereço *.workers.dev. Você também pode conectar uma rota ou um custom domain.

O arquivo wrangler.jsonc guarda a configuração do projeto. Entre outras opções, ele define o arquivo principal e a compatibility_date.

A Cloudflare recomenda usar a data atual em projetos novos. Depois, atualize essa data com testes para adotar mudanças recentes do runtime.

Como trabalhar com estado e armazenamento

Não armazene dados de usuário em variáveis globais. Duas requisições podem usar o mesmo isolate, isolates diferentes ou localidades diferentes.

Este exemplo é inseguro:

let usuarioAtual;

export default {
  async fetch(request) {
    usuarioAtual = request.headers.get("X-User-Id");

    return Response.json({
      usuario: usuarioAtual,
    });
  },
};Code language: JavaScript (javascript)

Uma requisição seguinte pode encontrar o valor anterior. Além disso, o dado desaparece quando o isolate é removido.

Passe os dados pelas funções e escolha um serviço de armazenamento adequado:

  • Workers KV: configurações e dados lidos com frequência quando a consistência eventual é aceitável.
  • R2: imagens, arquivos e outros objetos grandes.
  • D1: dados relacionais consultados com SQL.
  • Durable Objects: estado consistente, coordenação e aplicações em tempo real.

Esses serviços chegam ao código por meio de bindings. Um binding funciona como permissão e API. Dessa forma, você não precisa expor uma chave para acessar um recurso da própria conta.

Limites do Cloudflare Workers

A plataforma impõe limites de CPU, memória, tamanho do Worker e subrequests. Esses valores variam entre os planos.

Em julho de 2026, o plano gratuito inclui:

  • 100 mil requisições por dia;
  • 10 ms de CPU por requisição HTTP;
  • 128 MB de memória;
  • 50 subrequests por execução;
  • bundle comprimido de até 3 MB.

O plano pago amplia vários desses limites. Entretanto, os valores podem mudar. Consulte sempre a página oficial de limites do Workers antes de planejar uma aplicação.

Também não confunda CPU time com wall time. Uma chamada externa lenta pode aumentar a duração sem usar CPU durante toda a espera.

Quando usar Cloudflare Workers?

Cloudflare Workers funciona bem para tarefas que precisam ficar próximas da entrada da aplicação:

  • criar APIs e endpoints;
  • validar autenticação;
  • adicionar ou alterar headers;
  • implementar redirects;
  • personalizar respostas;
  • fazer proxy para uma API;
  • aplicar regras de cache;
  • processar webhooks;
  • servir aplicações full-stack.

Para sites estáticos com integração Git, veja também como funciona o Cloudflare Pages. Workers e Pages podem trabalhar juntos por meio de Pages Functions e bindings.

Cuidados antes de adotar a plataforma

O modelo distribuído traz velocidade e escala. Contudo, ele também exige algumas decisões de arquitetura.

Primeiro, valide as APIs disponíveis no runtime. Nem todo pacote criado para Node.js funcionará sem ajustes.

Depois, escolha o armazenamento pela consistência necessária. Workers KV, por exemplo, tem consistência eventual. Portanto, ele não substitui Durable Objects em cenários que exigem coordenação forte.

Por fim, acompanhe CPU time, subrequests e observabilidade. Uma função pequena pode chamar vários serviços e alcançar limites antes do esperado.

Conclusão

Cloudflare Workers combina um runtime baseado em V8 com a rede global da Cloudflare. Assim, você pode executar código serverless sem manter servidores ou containers.

O exemplo moderno usa Module Workers, recebe request, env e ctx, e retorna uma Response. Para persistir dados, use bindings e os serviços adequados.

Comece com um endpoint simples, teste com Wrangler e faça o deployment em workers.dev. Depois, evolua a aplicação conforme a necessidade de armazenamento, consistência e observabilidade.

Referências


ENCODING: UTF-8

|

CHMOD: 644

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

// RELATED_ENTRIES

NEXT_READS