Estudo de caso · Stack

Como o Notion escalou o Postgres e a estrutura de dados

O Notion é um espaço de trabalho onde times escrevem documentos, montam wikis e organizam projetos, tudo feito de blocos. O produto roda em React, TypeScript e Node.js sobre um conjunto de bancos Postgres fatiados na AWS, com um data lake de Kafka, Hudi e Spark criado para acompanhar bilhões de blocos.
Copiar stacknotion.com Espaço de trabalho para documentos, wikis e projetos · Estados Unidos · fundada em 2013

A stack da Notion

Abrir no montador

Linguagem

Biblioteca de interface

Hospedagem

  • AWSnotion.com

    Nuvem dos bancos (RDS), dos arquivos (S3) e do Kubernetes (EKS).

Banco de dados

  • PostgreSQLnotion.com

    Banco principal de produção, fatiado por workspace em 480 partes lógicas no Amazon RDS.

Framework de celular

Busca de dados

  • Kafkanotion.com

    Leva os eventos de mudança do Postgres até o data lake, um tópico por tabela.

    Por quê: Escolhido por escalar bem e encaixar na infraestrutura que já tinham.

  • Debeziumnotion.com

    Captura as mudanças de cada banco Postgres e publica no Kafka.

    Por quê: Escolhido por escalar, ser fácil de configurar e combinar com a infraestrutura.

  • Apache Hudinotion.com

    Grava o fluxo de mudanças do Kafka em tabelas no S3.

    Por quê: Lidava melhor com a carga cheia de atualizações do que Iceberg ou Delta Lake em 2022.

  • Apache Sparknotion.com

    Motor principal para transformar e desnormalizar os blocos, em PySpark e Scala.

    Por quê: Oferece mais que SQL, escala em várias máquinas e é open source.

  • Snowflakenotion.com

    Armazém de análise, mantido para dados que mais crescem do que mudam.

  • SQLitenotion.com

    Cache no aparelho, nos apps de desktop e, via WebAssembly, no navegador.

    Por quê: O cache em SQLite já tinha deixado o desktop uns 50% mais rápido, então levaram para a web.

Framework de servidor

Arquivos

  • Amazon S3notion.com

    Armazenamento central do data lake, bruto e tratado.

    Por quê: Combinava com a stack na AWS e guarda muito volume barato para vários motores de processamento.

Busca

  • Elasticsearchnotion.com

    Faz a busca, alimentada pelo data lake.

Como montaram

De um Postgres único para 480 fatias

Por uns cinco anos o Notion rodou em um único banco Postgres. Em 2021 esse banco acordava o plantão com picos de CPU, e o VACUUM travado trazia o risco de estourar o contador de transações.

O time fatiou o banco na própria aplicação em vez de adotar Citus ou Vitess, para controlar como os dados se espalham. Os dados são divididos pelo ID do workspace em 480 fatias lógicas, primeiro em 32 bancos físicos e depois em 96.

Fontes:notion.com notion.com

Um data lake feito em casa

No começo, o Notion copiava o Postgres para o Snowflake com o Fivetran. Funcionava para dados que só crescem, mas não para os blocos do Notion, que mudam o tempo todo, então em 2022 o time montou o próprio lake.

O Debezium captura as mudanças do Postgres para o Kafka, o Apache Hudi grava tudo no Amazon S3 e o Spark faz o processamento pesado. Snowflake e Fivetran ficaram onde ainda servem, e os dados tratados alimentam a busca e os recursos de IA.

Fontes:notion.com

SQLite no aparelho para abrir mais rápido

Em 2021 o Notion pôs um cache em SQLite nos apps de Mac e Windows, e a abertura de páginas e a navegação ficaram cerca de 50% mais rápidas.

Depois levou a mesma ideia para o navegador com a versão WebAssembly do SQLite, guardada no OPFS e coordenada entre abas por um SharedWorker. A navegação entre páginas ficou uns 20% mais rápida nos navegadores modernos.

Fontes:notion.com

Apps nativos no celular com uma camada em Rust

As vagas atuais do Notion descrevem apps de celular nativos: o Android é feito em Kotlin com Jetpack Compose, e iOS e Android dividem uma camada em Rust.

Na web e no servidor, as vagas repetem a mesma base: React, TypeScript, Node.js, Postgres e Elasticsearch, com Go aparecendo no time de infraestrutura de banco.

Fontes:jobs.ashbyhq.com jobs.ashbyhq.com jobs.ashbyhq.com jobs.ashbyhq.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.

  • Algolia
  • Cloudflare
  • Cloudflare Bot Management
  • Contentful
  • HSTS
  • Linkedin Ads
  • Linkedin Insight Tag
  • Naver Analytics
  • Next.js
  • Vercel
  • Webpack
  • hCaptcha