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