1 pontos por GN⁺ 4 시간 전 | Ainda não há comentários. | Compartilhar no WhatsApp
  • O sistema de 13 anos que vinha processando dezenas de bilhões de notificações por ano começou a sofrer timeouts quando um único grande creator gerava milhões de eventos, então o Patreon o redesenhou com uma camada de fanout que pré-cria notificações por destinatário
  • Aplicou um fanout em duas etapas, dividindo a lista de destinatários em pequenos lotes e processando feed no app, push e e-mail de forma independente, garantindo escalabilidade horizontal e isolamento de falhas entre canais
  • Para grandes creators, push e feed no app ficaram 80% mais rápidos, e e-mail 55% mais rápido; quando o público quadruplica, o aumento da latência ponta a ponta caiu de 186% para 33% e 60%, respectivamente
  • Com a Notification Factory e uma API única, send_fanout_notifications, o Patreon padronizou filtragem, verificação de elegibilidade e geração de payloads, além de rastrear tempos por etapa e resultados por destinatário para simplificar operações e debugging
  • 10 equipes e mais de 30 engenheiros migraram mais de 200 notificações, e a geração de rascunhos com IA junto com um prazo claro definido pela liderança ajudou a reduzir trabalho repetitivo e a operação paralela prolongada

Os limites de escala expostos pelos grandes creators

  • O Patreon envia dezenas de bilhões de notificações por ano para fãs quando creators publicam posts ou iniciam livestreams
  • Com o lançamento das assinaturas gratuitas e o crescimento da plataforma, o número de fãs por creator disparou, e no início de 2025 gargalos graves de desempenho começaram a aparecer, especialmente entre os grandes creators
  • As notificações de post antigas usavam uma única tarefa assíncrona para buscar todos os destinatários, filtrar por preferências de cada usuário, gerar o payload de cada destinatário e então encaminhar tudo para os sistemas de entrega de feed no app, push e e-mail
  • No caso dos grandes creators, uma única tarefa passou a ser responsável por gerar milhões de notificações, causando timeouts constantes e dificultando a entrega confiável para audiências enormes
  • O fluxo antigo tinha duas limitações estruturais
    • O custo de geração por destinatário ficava concentrado em uma única tarefa assíncrona, o que impossibilitava escalabilidade horizontal e criava um teto claro de throughput
    • Feed no app, push e e-mail eram fortemente acoplados, então a falha de um canal podia bloquear os demais
  • Várias equipes de produto criaram estratégias próprias de escala para notificações de alto volume, o que resolveu problemas de curto prazo, mas aumentou a complexidade da plataforma e dificultou desenvolvimento, operação e debugging
  • A decisão foi manter os sistemas de entrega existentes, mas colocar na frente deles uma camada comum de fanout para oferecer escalabilidade horizontal, isolamento por canal e observabilidade

Seis requisitos de projeto para a plataforma de fanout

  • A nova camada foi desenhada para dividir listas grandes de destinatários em pequenos lotes, gerar notificações por destinatário e então entregá-las aos sistemas existentes de feed no app, push e e-mail
  • A plataforma adotou os seis requisitos abaixo
    • Facilidade para desenvolvedores: notificações de alto volume não deveriam exigir que cada equipe resolvesse escalabilidade e confiabilidade do zero, e a plataforma precisava reduzir erros de uso enquanto suportava vários casos
    • Escalabilidade horizontal: a lista de destinatários precisava ser dividida automaticamente em pequenos lotes para processamento assíncrono
    • Isolamento por canal: feed no app, push e e-mail precisavam rodar de forma independente para que a falha de um canal não se propagasse aos outros
    • Processamento por prioridade: notificações sensíveis a tempo deveriam usar filas dedicadas e pools de workers separados das notificações comuns
    • Observabilidade: era preciso investigar resultados de filtragem e entrega e medir a latência ao longo de todo o ciclo de vida da notificação
    • Extensibilidade: recursos futuros, como geração da lista de destinatários, deveriam poder ser adicionados sem outro grande refactor

Separando a lógica de negócio com Notification Factory

  • Para separar a orquestração da plataforma da lógica de negócio específica de cada notificação, o Patreon introduziu a abstração Notification Factory
  • Cada factory define o blueprint do processamento de uma notificação com os seguintes elementos
    • prioridade de processamento
    • configurações de notificação aplicáveis
    • forma de filtrar destinatários
    • verificação de elegibilidade específica da notificação
    • forma de gerar payloads por canal
  • Esse padrão é baseado no motor interno de tarefas distribuídas do Patreon e compartilha vários conceitos com ele
  • O modelo Notification define os argumentos da tarefa que contêm dados únicos de uma notificação específica e compartilhados por todos os destinatários
  • A subclasse correspondente de BaseNotificationFactory atua como o handler da tarefa e contém as configurações e métodos para filtrar destinatários e gerar notificações
  • Para que a tarefa de fanout, que recebe apenas payloads serializados de notificação, consiga localizar a lógica de negócio que deve executar, o Patreon usa um registro que mapeia cada modelo Notification para sua classe factory correspondente
  • Era necessário suportar diferentes tipos de notificação e, ao mesmo tempo, evitar erros comuns de implementação e consultas de dados ineficientes
    • Como o Patreon tem vários tipos de registros de usuário e diferentes formas de filtragem, a interface de destinatário foi generalizada
    • Também foram fornecidos hooks claros para implementar preferências do usuário e verificações de elegibilidade específicas de cada notificação

Uma API única e fanout em duas etapas

  • Antes, cada canal usava APIs de envio separadas, o que fazia os fluxos de feed no app, push e e-mail divergirem e forçava as equipes de produto a pensar cedo demais no comportamento específico de cada canal
  • Após o redesenho, o ponto de entrada foi unificado em uma API única: send_fanout_notifications
    • Quem chama a API envia o payload da notificação, a lista de destinatários e um timestamp usado para medir a latência de entrega
    • A API localiza a factory correspondente à notificação, define tamanho de lote e prioridade e distribui tarefas por canal de forma independente
    • Falhas ou atrasos em um canal não bloqueiam os outros
  • A primeira etapa cuida da escala da geração de notificações
    • A lista completa de destinatários é dividida em pequenos lotes
    • Cada lote é processado pela tarefa FanoutNotifications
    • A tarefa filtra destinatários, executa verificações de elegibilidade específicas da notificação e usa a Notification Factory para gerar payloads por canal
  • A segunda etapa cuida da escala da transferência para entrega
    • As notificações geradas passam por novo fanout para tarefas de entrega dedicadas a feed no app, push e e-mail
  • O handler central, FanoutNotifications, fica entre a API e os sistemas legados de entrega por canal, transformando uma tarefa gigantesca em várias tarefas pequenas que podem ser processadas de forma independente

Observabilidade e debugging por destinatário

  • Notificações podem falhar ou ser ignoradas por vários motivos, como o usuário ter desativado as preferências, não passar na verificação de elegibilidade ou não poder receber por e-mail
  • Na plataforma antiga, para verificar o resultado do processamento de uma notificação específica era preciso juntar logs e dados de vários sistemas, e como não havia rastreamento abrangente por destinatário, investigações podiam levar horas
  • A nova plataforma foi projetada para responder às seguintes perguntas
    • quanto tempo levou para enviar a notificação
    • qual era o tamanho da lista inicial de destinatários
    • quantas pessoas foram filtradas e por quais motivos
    • quantas entregas foram bem-sucedidas por canal
    • por que um usuário específico recebeu ou não recebeu uma notificação específica
  • Foi introduzido um modelo de dados de timing e logging propagado por toda a plataforma
    • timestamps são registrados em cada etapa do fluxo da notificação
    • métricas e eventos são gerados tanto para resultados agregados quanto para resultados por destinatário
    • desenvolvedores podem anexar propriedades de logging para incluir entidades relacionadas em traces de execução e eventos
  • Com melhorias em observabilidade, alertas, dashboards e ferramentas de debugging, engenheiros de produto e equipes de suporte passaram a conseguir investigar mais problemas sem depender da equipe de plataforma

Migração de mais de 200 notificações

  • Como o padrão Notification Factory mudou a própria forma de desenvolver e manter notificações, não era possível migrar apenas com uma simples ferramenta de transformação de código (codemod)
  • Era necessário preservar exatamente a lógica de negócio, dependências de dados, regras de elegibilidade e comportamento por canal de cada notificação
  • Com base na documentação de migração e em PRs exemplares feitos manualmente, o Patreon criou uma skill de IA
    • Desenvolvedores podiam executar /migrate-notif-fanout <notif_name> para gerar um primeiro resultado de migração
    • Isso foi eficaz em tarefas repetitivas como criar o modelo da notificação, conectar a factory, ajustar pontos de chamada e aplicar os padrões da plataforma
  • A IA não substituiu o julgamento de engenharia, porque podia deixar passar lógica de negócio sutil, alucinar e gerar código duplicado que exigia limpeza
  • Mais de 200 notificações foram migradas, e com colaboração em grande escala incluindo uso de IA, os 80% restantes foram concluídos em 6 semanas

Ganhos de desempenho e impacto no desenvolvimento de produto

  • Ao mover a geração de notificações por destinatário para tarefas com escalabilidade horizontal, o Patreon passou a conseguir gerar de forma estável milhões de notificações por creator sem timeouts
  • O desempenho de notificações de alto volume para grandes creators melhorou significativamente
    • push e feed no app ficaram 80% mais rápidos
    • notificações por e-mail ficaram 55% mais rápidas
    • quando a audiência quadruplica, a latência ponta a ponta de push e feed no app aumenta 33%, e a de e-mail, 60%
    • nas mesmas condições, a plataforma antiga tinha aumento de latência de 186%
  • As equipes de produto deixaram de precisar desenhar soluções de escala separadas para cada notificação de alto volume, e a velocidade de desenvolvimento também melhorou
  • A nova plataforma sustentou lançamentos importantes de 2025, como Lives, Quips e iniciativas para atrair grandes creators
  • Sem o redesenho com fanout, esses lançamentos teriam esbarrado nos gargalos existentes e exigido mais tempo de engenharia para criar soluções pontuais de escala
  • Com métricas de timing por etapa, a equipe passou a identificar onde o tempo está sendo gasto e ajustar a infraestrutura de acordo com o equilíbrio desejado entre velocidade e custo

Nove meses de operação paralela e coordenação organizacional

  • A parte mais difícil foi alterar um sistema legado em produção enquanto se coordenava a migração entre várias equipes
  • Os dois sistemas de notificação rodaram em paralelo por 9 meses
    • Toda mudança de plataforma precisava ser compatível tanto com o caminho antigo quanto com o novo caminho com fanout
    • O escopo para bugs e incidentes aumentou, e quanto mais a migração se prolongava, maior ficava o risco operacional
    • Alguns incidentes menores causados por problemas de compatibilidade reforçaram a necessidade de concluir a migração com rapidez e segurança
  • No início, o Patreon adotou uma abordagem bottom-up, em que cada equipe de produto definia a prioridade da própria migração de notificações
    • Em 6 meses, apenas cerca de 20% tinham sido migradas
    • O ritmo desacelerava porque a migração perdia espaço para roadmaps de produto e outras prioridades de equipe
  • Depois que a liderança de engenharia concordou com a conclusão no 1º trimestre de 2026 e definiu um prazo claro com prioridade em toda a empresa, o restante da migração foi concluído em 6 semanas
  • O trabalho total envolveu 10 equipes e mais de 30 engenheiros
    • um tracker no Notion e automações foram usados para acompanhar o progresso
    • houve comunicação frequente com stakeholders e distribuição do trabalho entre várias equipes
    • a equipe de plataforma executou cerca de metade das migrações e depois repassou deploy e limpeza para as equipes donas das notificações
    • a carga foi distribuída para evitar concentração de trabalho nas equipes com mais notificações
  • Também foi realizada uma semana de migração de notificações com office hours, leaderboard, brindes e happy hour para acelerar o progresso e celebrar a conclusão
  • Houve ainda uma folga de 2 semanas antes do prazo final da transferência
    • esse tempo foi usado para ajudar equipes que precisavam de suporte adicional e procurar trabalhos pendentes no codebase
    • na checagem final foram encontradas 4 novas migrações necessárias e vários itens incompletos, todos resolvidos com impacto pequeno no cronograma

Lições de uma grande migração de plataforma

  • Sem prioridade explícita, migrações que atravessam várias equipes competem com o roadmap de cada time e são facilmente adiadas
    • Isso fica especialmente evidente na longa cauda das notificações de baixo volume, em que o ganho de escala é menos visível
    • Alinhamento da liderança, prioridade compartilhada e prazo claro foram essenciais para concluir a migração em um tempo razoável
  • O trabalho de plataforma não termina na API

    • Antes, investigar dúvidas sobre notificações de outras equipes e problemas de entrega consumia boa parte do plantão on-call dos engenheiros de plataforma
    • Melhorias em observabilidade, alertas, dashboards e ferramentas de debugging precisavam vir junto para que equipes de produto e suporte pudessem investigar de forma independente e para reduzir a carga de on-call da plataforma
    • Era preciso considerar não só o gargalo atual, mas também o próximo gargalo
    • Um único projeto não conseguiria resolver todos os problemas de escala de notificações
    • O sistema foi projetado para acomodar recursos futuros e reduzir a chance de outra grande refatoração quando o volume de notificações continuar aumentando

O próximo gargalo e os planos futuros

  • A geração de notificações foi escalada, mas o próximo gargalo é a geração da lista de destinatários
  • À medida que o público-alvo continua crescendo, consultar com eficiência milhões de destinatários se torna cada vez mais importante
  • O plano é incorporar a geração da lista de destinatários à Notification Factory para que a plataforma assuma mais do fluxo de notificações de ponta a ponta
  • As configurações de notificação também serão melhoradas tanto para desenvolvedores quanto para fãs
    • desenvolvedores terão mais facilidade para criar e gerenciar novas configurações
    • fãs terão uma experiência melhor para entender e controlar suas preferências de notificação

Ainda não há comentários.

Ainda não há comentários.