Apresentando as Edge Functions na Nulvless Network
O que são edge functions, como executam seu TypeScript na região mais próxima de cada usuário e quando usar no lugar do serverless de uma região só.
Nesta página
Uma edge function é um pequeno trecho de código de servidor que roda em várias regiões ao mesmo tempo, o mais perto possível de quem a chama. Você faz o deploy uma vez, e cada requisição é atendida pela cópia mais próxima, em vez de viajar até um único servidor do outro lado do mundo.
Este post explica o que são edge functions, como elas rodam na Nulvless Network, como se comparam às funções serverless tradicionais e para que elas servem.
Edge functions, em um parágrafo
Uma função serverless tradicional vive em uma região. Se seus usuários estão em São Paulo, Lisboa e Tóquio e a função roda na Virgínia, dois desses três usuários pagam por uma travessia de oceano a cada chamada. Uma edge function é publicada em todas as regiões de uma rede global e roda onde a requisição chega. Ela continua sendo serverless: sem máquinas para gerenciar, sem capacidade para planejar, cobrança por invocação. O que muda é onde o código roda.
Servidor em uma região
A requisição atravessa até uma região, e a checagem de sessão pode atravessar de novo
Edge function
A requisição para no edge mais próximo, onde a sessão também é conferida
A diferença aumenta quando a função precisa saber quem está chamando. Em uma arquitetura de uma região só, conferir uma sessão costuma significar mais uma viagem, até onde quer que o serviço de identidade esteja. Na Nulvless Network o serviço de identidade roda no mesmo edge que a sua function, então essa checagem também fica local.
A Nulvless Network
A Nulvless Network é a camada global de edge por baixo de todo projeto Nulvless. Cada requisição chega à região mais próxima do usuário, a sessão pode ser verificada ali mesmo, e suas edge functions rodam no mesmo lugar. É a mesma rede que atende login, sessões e tokens, e por isso uma requisição autenticada não precisa atravessar um oceano para descobrir quem a enviou.
Toda function recebe uma URL estável, montada a partir do seu projeto:
https://<project>.nulvless.co/functions/<slug>A URL é a mesma em todo lugar. A rede decide qual região responde.
O que acontece em uma requisição
Nulvless Network, edge mais próximo
1Rota
Uma chamada a /functions/report chega à região mais próxima
2Execução
Um isolate inicia sua function em milissegundos, com os secrets dela
3Verificação
auth.verify confere a sessão sem sair da rede
4A resposta sai do mesmo edge em que a requisição chegou
- Rota. A requisição para
/functions/<slug>chega ao edge mais próximo da Nulvless Network. - Execução. Sua function inicia em um isolate V8, não em um container. Isolates iniciam em milissegundos, então o cold start fica curto, e cada um fica isolado de todas as outras functions.
- Verificação. Se a function precisa saber quem está chamando, ela pergunta
com
auth.verify, e a resposta vem da mesma rede. - Resposta. A resposta volta para o usuário a partir do edge em que chegou.
Escrevendo uma edge function
As Edge Functions da Nulvless rodam TypeScript em um runtime compatível com
Deno, com suporte a npm. A menor function útil é um export default com um
handler fetch, que recebe um Request padrão e devolve um Response padrão:
export default {
async fetch(req: Request) {
const url = new URL(req.url);
const name = url.searchParams.get('name') ?? 'mundo';
return Response.json({ message: `Olá, ${name}` });
},
};Não há nada específico da Nulvless nesse código. Ele usa as Web APIs que você
já conhece: Request, Response, URL e fetch. Deno.serve também
funciona, assim como um framework como Express ou Fastify, se você preferir.
Pacotes npm
Importe pacotes do npm com o especificador npm:. Não há package.json nem
build para configurar:
import { z } from 'npm:[email protected]';
const Body = z.object({ email: z.string().email() });Fixe a versão, como acima, para que uma nova versão de uma dependência nunca mude sua function sem um deploy.
Secrets e variáveis de ambiente
Chaves de API e outras configurações nunca vão no código. Adicione-as na aba Secrets da function no console e leia em tempo de execução:
const stripeKey = Deno.env.get('STRIPE_SECRET_KEY');Os secrets são injetados quando a function roda e versionados por chave, então trocar um deles não exige mexer no código.
Toda function também recebe alguns valores sem que você precise adicioná-los:
NULVLESS_URL, a URL do seu projeto, além de NULVLESS_FUNCTION_SLUG e
NULVLESS_FUNCTION_VERSION. Nomes que começam com NULVLESS_ ou NVL_ são
reservados para eles, então use outro prefixo nos seus secrets.
Do código a todos os edges
1Escrever
TypeScript no editor do console ou no seu repositório
2Build
Imports npm resolvidos e empacotados, sem build para configurar
3Deploy
A nova versão vai para todos os edges
4Observar
Logs, erros e latência por versão, com rollback em um clique
Você pode escrever uma function no editor dentro do console para uma mudança rápida, ou mantê-la no seu próprio repositório. Cada deploy faz o build da function, resolve os imports npm e envia a nova versão para todos os edges. Todo deploy fica guardado como uma versão, então um release ruim está a um clique do rollback, e os logs, erros e a latência da function ficam registrados por versão.
Quando usar uma edge function
Edge functions combinam com trabalho curto, disparado por uma requisição e perto dos seus usuários ou da sessão deles:
- Endpoints de API autenticados que conferem quem está chamando e o que pode fazer, e então respondem. Mostramos isso passo a passo em Autenticação de usuários em edge functions.
- Webhooks do Stripe, do GitHub ou de qualquer provedor que precise de um
200rápido. - Recursos de IA que chamam a OpenAI ou outro modelo em nome de um usuário autenticado, sem expor sua chave de API no navegador.
- Mensagens transacionais, como enviar um e-mail de boas-vindas pela Nulvless Communications depois de um cadastro.
- Integração entre serviços, como sincronizar um novo cliente com seu CRM.
Elas não combinam com jobs longos, processamento pesado em lote ou qualquer coisa que precise manter por muito tempo uma conexão com um único banco longe dos seus usuários. Deixe isso em um backend ou em uma fila, e use uma edge function para entregar o trabalho a eles.
Perguntas frequentes
Qual a diferença entre edge functions e funções serverless?
As duas são serverless: você publica código, não servidores. Uma função serverless comum roda em uma região que você escolhe. Uma edge function roda em todas as regiões de uma rede global e é executada pela mais próxima da requisição.
Edge functions têm cold start?
Sim, mas curto. As Edge Functions da Nulvless rodam em isolates V8 em vez de containers, então uma nova instância inicia em milissegundos, não em segundos.
Em que linguagem as Edge Functions da Nulvless são escritas?
TypeScript ou JavaScript, em um runtime compatível com Deno, com Web APIs e
pacotes npm pelo especificador npm:.
Como mantenho chaves de API fora do código?
Guarde-as como secrets da function no console e leia com Deno.env.get. Elas
são injetadas em tempo de execução e nunca ficam no código.
Uma edge function consegue saber qual usuário está chamando?
Sim. Envie o access token do usuário no header Authorization e confira com
auth.verify do @nulvless/nulvless-js. O
próximo post mostra o fluxo completo,
incluindo papéis, escopos e modo sudo.
