Estudo de caso · Stack

Como o Nubank montou um banco em Clojure e Datomic

O Nubank é o banco digital que começou com um cartão de crédito no Brasil e hoje atende milhões de clientes na América Latina. Desde o início apostou em Clojure, no banco de dados Datomic e em Kafka na AWS, depois levou tudo para Kubernetes e acabou comprando a empresa por trás do Clojure.
Copiar stacknubank.com.br Banco digital · Brasil · fundada em 2013

A stack da Nubank

Abrir no montador

Linguagem

  • Clojureinfoq.com

    Linguagem principal dos microsserviços do backend.

    Por quê: Empurra o código para a simplicidade desde o início, e lógica financeira combina com código funcional.

Hospedagem

  • AWSinfoq.com

    Nuvem onde o banco roda, com deploy contínuo.

    Por quê: O time não queria cuidar de máquinas físicas enquanto crescia.

  • Kubernetesinfoq.com

    Roda os serviços, hoje no Amazon EKS, no lugar do antigo CloudFormation.

    Por quê: O CloudFormation não acompanhava tantos serviços, e o Kubernetes facilitou mudar a infraestrutura.

Banco de dados

  • Datomicinfoq.com

    Banco principal, um registro imutável que guarda cada mudança.

    Por quê: Guardar o histórico de cada mudança dá auditoria de graça e consultas no tempo para depurar.

  • Amazon DynamoDBinfoq.com

    Armazenamento por baixo do Datomic.

    Por quê: Era fácil de operar para um time pequeno.

Framework de celular

  • Flutterbuilding.nu.com

    Framework padrão para as novas funcionalidades do app.

    Por quê: Ganhou do Kotlin Native e do React Native em testes, hot reload e estabilidade da API.

Busca de dados

  • Kafkainfoq.com

    Tarefas de alto volume e comunicação entre os serviços.

    Por quê: As mensagens ficam guardadas, então dá para voltar o offset e reprocessar as antigas.

  • Apache Sparkbuilding.nu.com

    Transformações de dados, escritas em Scala.

  • Databricksbuilding.nu.com

    Notebooks onde o pessoal escreve e testa as consultas de dados.

  • BigQuerybuilding.nu.com

    Um dos jeitos de consultar o dado processado no Google Cloud.

Framework de servidor

  • Finaglebuilding.nu.com

    Base dos microsserviços em Clojure, em arquitetura hexagonal.

Erros

  • Prometheusinfoq.com

    Métricas em tempo real que também alimentam alertas e deploys canário.

  • Grafanainfoq.com

    Painéis em cima das métricas do Prometheus.

Como montaram

As apostas de 2013

Lucas Cavalcanti, um dos primeiros engenheiros, explicou as escolhas iniciais na QCon. O Datomic é um banco imutável que guarda o histórico de cada mudança, o que dá auditoria de graça para um banco. O Clojure roda na JVM e empurra o código para a simplicidade, e lógica financeira combina bem com código funcional.

O Kafka entrou porque as mensagens ficam guardadas e dá para voltar o offset e reprocessar as antigas, o que salvou o time algumas vezes. Tudo rodava na AWS para um time pequeno não precisar cuidar de máquinas.

Fontes:infoq.com

Crescer copiando o banco inteiro

Entre 2015 e 2016, em vez de dividir só o banco de dados, o Nubank passou a rodar cópias completas do sistema, cada uma atendendo uma parte dos clientes. Isso adiou otimizações complicadas no código, com o custo de um shard crescer muito mais que os outros.

Em 2017 e 2018 trocaram o CloudFormation pelo Kubernetes, migrando shard por shard com o banco funcionando, e depois passaram para o Amazon EKS.

Fontes:infoq.com

Comprando a empresa do Clojure

Em 2019 o Nubank descrevia o backend como microsserviços escaláveis escritos quase todos em Clojure com Finagle, em arquitetura hexagonal, com Kafka entre os serviços e Prometheus no monitoramento.

Em julho de 2020 o Nubank comprou a Cognitect, empresa por trás do Clojure e do Datomic, que trabalhava com ele desde 2014. Rich Hickey seguiu à frente do Clojure, que continua independente e open source.

Fontes:building.nu.com building.nu.com

Flutter no celular

Era difícil contratar especialistas em mobile nativo, então em 2019 um grupo de engenheiros experientes comparou Kotlin Native, React Native e Flutter. O Kotlin Native ainda não tinha camada de interface, e o React Native dependia demais de bibliotecas de terceiros.

O Flutter ganhou pelos testes e pela experiência de desenvolvimento, e virou o padrão para as novas funcionalidades do app. Devs nativos de Kotlin e Swift seguem cuidando do que é específico de cada plataforma.

Fontes:building.nu.com

A plataforma de dados

As transformações de dados são escritas em Scala com Spark, e quem analisa programa em notebooks do Databricks. O dado processado vai para o S3 e para o Google Cloud, e o pessoal consulta pelo Databricks, pelo BigQuery e ferramentas parecidas.

Fontes:building.nu.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.

  • Amazon CloudFront
  • Amazon Web Services
  • Envoy
  • HSTS
  • Next.js
  • React
  • Webpack