Spotify architecture visualization
Todas as arquiteturas
Análise técnica

Spotify

Como o Spotify roda a maior plataforma de música orientada a eventos do mundo em GCP, BigQuery e Scio.

Números que importam

600M+
Usuários mensais
500B+
Eventos / dia
10s of PB
Petabytes no BigQuery
1,000+
Pipelines no Dataflow

Stack técnica

Google Pub/Sub· streaming
Google Dataflow· processamento batch + stream
BigQuery· warehouse
Scio· SDK Scala do Beam
Flink· streaming de baixa latência
Cassandra + Bigtable· stores operacionais
Backstage· portal de desenvolvedor
Luigi → Flyte· orquestração

A arquitetura em um dashboard interativo

A ideia é essa: aprender lendo o diagrama. Cada caixa e cada seta conta uma parte da história — clique pra abrir.

Como ler este diagrama
Caixas = componentes

Cor indica o papel: cliente, streaming, storage, compute, ML, serving. Clique em qualquer caixa pra ver o que é, por que é usada e como funciona ali.

Setas = fluxo de dados
streaming· eventos ao vivobatch· job periódicosync· chamada diretaserve· resposta ao usuário
Clique em uma etapa para explorar
eventosfeatures batchfeatures streamingpersonalizada
ClientesClienteclique →
Event DeliveryStreamingclique →
Pub/SubStreamingclique →
Dataflow · Sci…Computaçãoclique →
FlinkComputaçãoclique →
BigQueryArmazenamentoclique →
Feature storeServiçoclique →
Discover · Rad…Serviçoclique →
Todo play, skip, like e busca num cliente Spotify vira um evento com schema validado via Pub/Sub, é processado por Beam/Scio no Dataflow, cai no BigQuery e alimenta o loop de recomendação de volta pra sua tela de Home.
Opcional
Ler o deep dive completo em texto
As mesmas ideias do diagrama, com mais contexto — recomendado depois de explorar as etapas.

O problema: 600M de pessoas, e nenhum par quer a mesma playlist

O produto do Spotify é fundamentalmente um problema de recomendação. Discover Weekly, Daily Mix, Blend, Radio, e até a ordem da sua tela de Home são todos outputs de modelo. Esse modelo é tão bom quanto os eventos que o alimentam — todo play, skip aos 3s, joinha e busca tem que cair no warehouse, limpo, na hora, toda vez.

A 500 bilhões de eventos por dia, "limpo" não é pouca coisa. A plataforma inteira do Spotify é desenhada em torno de tornar esse pipeline de eventos entediante pra que o trabalho interessante — modelos, produto, growth — tenha piso sólido.

Event Delivery: o contrato entre apps e dados

Todo evento que o Spotify entrega é definido num schema registry. Se um cliente quer emitir TrackPlayed, ele registra o schema (campos, tipos, significado semântico) como código. O sistema de event delivery:

  • Rejeita eventos que não batem com um schema conhecido
  • Suporta evolução de schema backward-compatible (novos campos opcionais OK, mudanças breaking exigem nome de evento novo)
  • Roteia eventos pro Pub/Sub com o schema anexado
  • Materializa automaticamente uma tabela BigQuery por tipo de evento, espelhando o schema

É o mesmo padrão que Uber e Netflix redescobriram com nomes diferentes (Keystone, Schema Service da Uber). O insight: o schema do evento é a interface entre engenheiros de produto e engenheiros de dados. Entregue, tenha ownership, evolua com propósito.

Scio + Dataflow: pipelines Beam que não odeiam engenheiros Scala

O Spotify open-sourceou o Scio — um SDK Scala pro Apache Beam / Google Dataflow. A API Java do Beam é verbosa. Scio faz o Beam parecer com Spark ou Scalding: uma API fluente, tipada, funcional.

Um pipeline canônico em Scio: enriquecer eventos brutos de play com metadados de track, agregar por usuário, escrever no BigQuery.

import com.spotify.scio.bigquery._
import com.spotify.scio.{ContextAndArgs, ScioContext}

object PlayEnrichment {
  def main(cmdlineArgs: Array[String]): Unit = {
    val (sc, args) = ContextAndArgs(cmdlineArgs)

    // Lê eventos com schema validado do BigQuery (ou Pub/Sub pra streaming)
    val plays = sc.typedBigQuery[PlayEvent](args("input"))

    // Broadcast da dimensão de tracks pra join side-input
    val tracks = sc.typedBigQuery[Track]("tracks_curated").asMapSideInput

    plays
      .withSideInputs(tracks)
      .flatMap { (p, ctx) =>
        ctx(tracks).get(p.trackId).map { t =>
          EnrichedPlay(p.userId, p.trackId, t.artistId, t.genre, p.ms)
        }
      }
      .toSCollection
      .saveAsTypedBigQueryTable(args("output"))

    sc.run()
  }
}

O mesmo código roda como batch (sobre a tabela BigQuery de ontem) ou streaming (sobre o tópico Pub/Sub). Um único código, dois modos de execução. É esse o ponto do Beam.

BigQuery como o warehouse, não como o tudo

Diferente da Netflix (S3 + Iceberg + Trino) ou do Airbnb (S3 + Spark + Presto), o Spotify fez uma aposta opinativa em BigQuery como warehouse. Funciona porque:

  • Separação de storage e compute é nativa: eles não rodam cluster, submetem queries.
  • Streaming inserts aterrissam eventos do Pub/Sub com segundos de latência.
  • BigQuery + Dataflow são da mesma família de produto — sem impedance mismatch.

O trade é vendor lock-in. O Spotify aceita porque o custo operacional de rodar Presto/Spark/HDFS na escala deles exigiria um time grande de infra. BigQuery deixa 30 engenheiros de dados servirem 3.000 usuários internos. Essa conta vence.

Não copie isso sem fazer a conta. BigQuery na sua escala pode ser uma ordem de magnitude mais caro que um lakehouse S3 + Trino. Ou pode ser mais barato. Roda os números.

Backstage: o portal do dev faz parte da plataforma de dados

O Spotify open-sourceou o Backstage — um portal de desenvolvedor que cataloga todo serviço, pipeline, dataset e dashboard da empresa. Não é uma ferramenta específica de dados, mas resolveu um problema muito de dados:

  • "Qual pipeline produz a tabela user_daily_active?"
  • "Quem é dono do schema do evento TrackPlayed?"
  • "Quais dashboards downstream quebram se eu mudar esse campo?"

Com 500 eventos × 3.000 usuários × 1.000 pipelines, descoberta não é problema de UX — é existencial. O Backstage indexa tudo e torna o grafo de ownership atravessável. Mesmo problema que o Airbnb resolveu com Dataportal, o LinkedIn com DataHub. Ferramentas diferentes, mesma lição: sua plataforma de dados precisa de um catálogo ou vai colapsar sob o próprio peso.

O que você pode de fato roubar desse design

  • Schema é o contrato. Se seu pipeline de eventos aceita qualquer coisa, ele aceita tudo — inclusive o cliente quebrado de amanhã. Entregue um schema registry (Avro, Protobuf, JSON Schema, tanto faz) antes do seu terceiro pipeline.
  • Um código, dois modos. Beam / Scio / Spark Structured Streaming prometem a mesma coisa: batch e streaming do mesmo código. Onde puder, aceite a promessa — vai evitar uma classe inteira de bugs de produção.
  • BigQuery vs lakehouse é decisão de negócio, não técnica. BigQuery é incrível até deixar de ser. Lakehouse é portável mas tem piso de ops. Modele a curva de custo de 3 anos; não discuta no Twitter.
  • O catálogo É a plataforma. Você não tem uma plataforma de dados até que outra pessoa consiga achar o dataset. Backstage, DataHub, Amundsen ou uma wiki bem cuidada — escolha uma e ponha gente pra manter.

Fontes e leituras curadas

As fontes públicas por trás desta análise, com nosso comentário sobre por que valem seu tempo.

Aprenda o que faz isso funcionar

As aulas do DataForge que cobrem as peças dessa arquitetura.

Última atualização:
← Ver todas as arquiteturas