ArchitectureScalingNode.js

Como criamos um serviço de captura de tela escalável

5 min read
Como criamos um serviço de captura de tela escalável

Introdução

Construir um serviço de captura de tela confiável é mais difícil do que parece. Quando começamos o SiteSnapshot, pensamos que seria tão simples quanto iniciar algumas instâncias do Puppeteer. Estávamos errados.

O Desafio

Renderizar páginas web modernas consome muitos recursos.

  • Vazamentos de memória em navegadores headless.
  • Lidando com timeouts e processos zumbis.
  • Escalonamento horizontal em várias regiões.

Neste post, vamos mergulhar em como resolvemos esses problemas.

Nossa Arquitetura

Mudamos de um sistema monolítico baseado em Cron para um Modelo de Worker Distribuído.

// Exemplo de consumo da nossa fila de workers
async function processQueue(jobId) {
  const browser = await getBrowserInstance();
  try {
    const page = await browser.newPage();
    await page.goto(job.url);
    await page.screenshot({ path: job.path });
  } finally {
    await browser.close();
  }
}

Componentes Chave

  1. Queue Manager (Gerenciador de Fila): Distribui trabalhos de forma justa.
  2. Worker Nodes (Nós de Trabalho): Contêineres stateless que executam as verificações.
  3. Storage Layer (Camada de Armazenamento): Supabase para metadados, S3 para imagens.

Conclusão

Ao desacoplar o agendador da camada de execução, alcançamos 99,9% de confiabilidade.

Quer monitorar seu site visualmente? Comece grátis hoje.