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
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.
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.
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.
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.