Estudo de caso · Stack

Como a PostHog construiu uma análise de produto open source que aguenta escala

A PostHog é um conjunto open source de análise de produto, gravação de sessões, feature flags e experimentos. A base é um app em Django e React sobre o ClickHouse, com serviços em Rust e Kafka segurando a enxurrada de eventos que chega.
Copiar stackposthog.com Análise de produto e ferramentas para desenvolvedores · Estados Unidos · fundada em 2020

A stack da PostHog

Abrir no montador

Biblioteca de interface

Hospedagem

  • AWSposthog.com

    Hospeda a PostHog Cloud, incluindo o cluster de ClickHouse em EC2.

  • Kubernetesposthog.com

    Roda os serviços do app num cluster EKS.

Banco de dados

  • ClickHouseposthog.com

    Guarda e consulta todos os eventos de análise.

    Por quê: Nos testes deles, foi sempre cerca de dez vezes mais rápido que Pinot, Presto, Druid, TimescaleDB e Citus.

  • PostgreSQLposthog.com

    Guarda os dados do app no Amazon Aurora, com acesso pelo PgBouncer.

Build e runtime

  • GitHub Actionsposthog.com

    Cuida da integração e da entrega contínuas.

Busca de dados

  • Keaposthog.com

    Cuida do estado do front, em cima do Redux.

  • Apache Kafkaposthog.com

    É o barramento central de mensagens entre a entrada dos eventos e o armazenamento.

  • Redisposthog.com

    Sustenta a fila de tarefas dos jobs em segundo plano.

  • Dagsterposthog.com

    Roda os jobs internos de dados.

    Por quê: Mostra bem a linhagem dos dados e facilita os testes.

Framework de servidor

  • Djangoposthog.com

    Roda o app web e a API.

  • Rustposthog.com

    Roda os serviços de alto volume que recebem eventos, avaliam feature flags e ingerem gravações de sessão.

  • Node.jsposthog.com

    Roda o worker de CDP, que processa os eventos na chegada e manda para os destinos.

  • Temporalposthog.com

    Orquestra fluxos complexos, críticos e visíveis para o usuário.

    Por quê: Garante execução exatamente uma vez em cenários de falha complicados e sai bem mais barato que o Dagster em tarefas recorrentes.

Testes

  • Playwrightposthog.com

    Roda os testes de ponta a ponta do front.

Arquivos

  • Amazon S3posthog.com

    Guarda as gravações de sessão e as exportações.

Como montaram

Um MVP em Django e Postgres no Heroku

A primeira versão foi feita pelo cofundador Tim Glaser em quatro semanas, durante a Y Combinator. Era um app Django simples, que consultava os eventos pelo ORM do Django, rodava no Postgres do Heroku e subia com um clique.

Essa simplicidade trouxe os primeiros usuários. Quando mais times adotaram o produto e passaram a mandar mais eventos, o Postgres do Heroku chegou ao limite e as consultas ficaram lentas.

Fontes:posthog.com

A troca do Postgres pelo ClickHouse nos eventos

Em 2021 o time testou Pinot, Presto, Druid, TimescaleDB, Citus e ClickHouse olhando velocidade, facilidade de hospedar por conta própria e linguagem de consulta. O ClickHouse saiu cerca de dez vezes mais rápido, e o cluster de teste virou o de produção. Segundo a PostHog, o Postgres sofria a partir de uns 10 mil usuários ativos por mês.

Os dois bancos rodaram juntos, recebendo os mesmos dados, e cada recurso foi migrado de cada vez atrás das próprias feature flags. Quando tudo tinha mudado, pararam de gravar eventos no Postgres. Nem tudo foi tranquilo: centenas de mutations por minuto, bem acima do que o ClickHouse recomenda, derrubaram o serviço uma vez.

Fontes:posthog.com posthog.com

Rust e Kafka na entrada dos eventos

Hoje o caminho mais pesado fica fora do app Django. Serviços em Rust recebem os eventos, avaliam as feature flags e ingerem as gravações de sessão, e o Kafka é o barramento central que liga a entrada ao armazenamento.

Um worker de CDP em Node.js processa os eventos na chegada e manda para os destinos. O Django continua servindo o app e a API, e o handbook deixa o Rust para os serviços de alta escala.

Fontes:posthog.com posthog.com

Três ferramentas para trabalho em segundo plano

A PostHog usa o Celery só para tarefas pequenas e rápidas, porque o handbook diz que ele pode falhar em fluxos maiores ou longos. Trabalhos médios e grandes vão para outro lugar.

O Temporal cuida dos fluxos que o usuário vê e dos críticos, pela garantia de execução exatamente uma vez, e sai bem mais barato que o Dagster em tarefas recorrentes. O Dagster fica com os jobs internos de dados, onde a linhagem dos dados e os testes pesam mais.

Fontes:posthog.com

A PostHog Cloud na AWS

Na PostHog Cloud, os serviços do app rodam num cluster Kubernetes no EKS da AWS, e os bancos ficam à parte. O ClickHouse é um cluster próprio em EC2, com shards e réplicas, o Postgres roda no Aurora com PgBouncer na frente, e as gravações de sessão e exportações ficam no S3.

Fontes:posthog.com

Também detectado no site

Achado na página inicial com as regras abertas do Wappalyzer (HTML, scripts e cabeçalhos). Mostra o que roda no navegador, não o backend inteiro.

  • Gatsby
  • HSTS
  • Naver Analytics
  • Vercel
  • Webpack