Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central....

57
Gustavo Bicalho Maurício Verardo Construindo a NuConta

Transcript of Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central....

Page 1: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Gustavo BicalhoMaurício Verardo

Construindo a NuConta

Page 2: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Agenda

● NuConta● Microsserviços no Nubank● Transferindo dinheiro entre NuContas

○ Event-sourcing: Modularidade e Escalabilidade○ Consistência em sistemas distribuídos

● O feed de movimentações○ Backend for Frontends com GraphQL

Page 3: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

NuConta

Page 4: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

NuConta

Page 5: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

NuConta

Page 6: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

NuConta

Page 7: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

NuConta

Page 8: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

NuConta

Page 9: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

NuConta

Page 10: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

NuConta

https://nubank.design/

Page 11: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Microsserviços

Page 12: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Microsserviços

Fatura

Saldo

AntecipaçãoAntecipações

Saldos

Faturas

Page 13: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Saldos

Antecipações

Faturas

Microsserviços

Fatura

Saldo

Antecipação

Load

Balancer

Load

Balancer

Load

Balancer

Page 14: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Microsserviços

Serviço A Serviço BHTTP

Page 15: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Microsserviços

Serviço A

Tópico do Kafka

Serviço B

Page 16: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Transferindo dinheiro entre NuContas

SOUTHEAST BRAZIL REGION FROM SPACE

Page 17: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Transferindo dinheiro entre NuContas

Pedido de envio

Envio

Recebimentos

Recebimento

Envios

Liquidação

Saldos

Depósito

Page 18: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Transferindo dinheiro entre NuContas

Pedido de envio

RecebimentosEnvios

Saldos

Pedido

Envio Solicitado

Page 19: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Transferindo dinheiro entre NuContas

Pedido de envio

RecebimentosEnvios

Saldos

Pedido

Envio Solicitado

Liquidação

Liquidação efetuada

Page 20: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Transferindo dinheiro entre NuContas

Pedido de envio

RecebimentosEnvios

Saldos

Pedido

Envio Solicitado

Liquidação

Envio

Liquidação efetuada

Dinheiro enviado para NuConta

Page 21: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Transferindo dinheiro entre NuContas

Pedido de envio

RecebimentosEnvios

Saldos

Pedido

Envio Solicitado

Liquidação

Envio

Liquidação efetuada

Dinheiro enviado para NuConta

Recebimento

Dinheiro Recebido

Page 22: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Transferindo dinheiro entre NuContas

Pedido de envio

RecebimentosEnvios

Saldos

Pedido

Envio Solicitado

Liquidação

Envio

Liquidação efetuada

Dinheiro enviado para NuConta

Recebimento

Dinheiro Recebido

Depósito

Page 23: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Características interessantes desse fluxo

Pedido de envio

RecebimentosEnvios

Saldos

Pedido

Envio Solicitado

Liquidação

Envio

Liquidação efetuada

Dinheiro enviado para NuConta

Recebimento

Dinheiro Recebido

Depósito

Page 24: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Event Sourcing

Page 25: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Pedido de envio

RecebimentosEnvios

Saldos

Pedido

Envio Solicitado

Liquidação

Envio

Liquidação efetuada

Dinheiro enviado para NuConta

Recebimento

Dinheiro Recebido

Depósito

E se o cliente quiser enviar transferências para outra instituição financeira?

Page 26: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Pedido de envio

Envios

Saldos

Pedido

Envio Solicitado

Liquidação

Envio

Liquidação efetuada

Depósito

E se o cliente quiser enviar transferências para outra instituição financeira?

Dinheiro enviado para outra instituição

Integração com o banco central

Page 27: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Pedido de envio

RecebimentosEnvios

Saldos

Pedido

Envio Solicitado

Liquidação

Envio

Liquidação efetuada

Dinheiro enviado para NuConta

Recebimento

Dinheiro Recebido

Depósito

E se o cliente receber transferências de outra instituição financeira?

Page 28: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Recebimentos

Saldos

Liquidação

Recebimento

Dinheiro Recebido

Depósito

E se o cliente receber transferências de outra instituição financeira?

Dinheiro recebido do Banco Central

Integração com o Banco Central

Page 29: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Pedido de envio

RecebimentosEnvios

Saldos

Pedido

Envio Solicitado

Liquidação

Envio

Liquidação efetuada

Dinheiro enviado para NuConta

Recebimento

Dinheiro Recebido

Depósito

E se o cliente quiser pagar a fatura do cartão de crédito?

Page 30: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Pedido de Pagamento

Pagamento de Fatura

Saldos

Pedido

Pagamento Solicitado

Liquidação

Pagamento

Liquidação efetuada

Pagamento de fatura

Depósito

E se o cliente quiser pagar a fatura do cartão de crédito?

Cartão de crédito

Page 31: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Saldos

Liquidação

Depósito

Event Sourcing

Saldo hoje

Saldo no ano que vem

Saldo no mês passado

Page 32: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Pedido de envio

RecebimentosEnvios

Saldos

Pedido

Envio Solicitado

Liquidação

Envio

Liquidação efetuada

Dinheiro enviado para NuConta

Recebimento

Dinheiro Recebido

Depósito

Event Sourcing

Page 33: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Consistência em sistemas distribuídos

Page 34: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

O que pode dar errado?

Pedido de envio

Envios

Liquidação

Saldos

Envio Solicitado

Envio

Liquidação para envio

Recebimentos

Recebimento

Dinheiro enviado para NuConta

Dinheiro Recebido

Depósito

Pedido

Page 35: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

O que pode dar errado?

Pedido de envio

Envios

Saldos

Envio Solicitado

Envio

Liquidação para envio

Recebimentos

Recebimento

Dinheiro enviado para NuConta

Dinheiro Recebido

DepósitoLiquidação

Pedido

Page 36: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Primeiro requisito: Processamento at-least-once

Todo evento publicado é recebido e processadocompletamente pelos consumidores pelo menos uma vez

Page 37: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Primeiro requisito: Processamento at-least-once

MSG

OK!

:)

MSG

MSG

MSG

Page 38: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Primeiro requisito: Processamento at-least-once

● Mensagens são persistidas e replicadas no Kafka cluster, podendo ser consumidas a qualquer momento

● Próxima mensagem da fila será entregue de novo até que consumidor confirme que completou seu processamento

● Consumidor só deve confirmar o processamento depois que completar todos os efeitos colaterais

Page 39: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Segundo requisito: Idempotência

● Uma operação é idempotente se aplicá-la várias vezes é equivalente a aplicá-la uma vez

● Exemplos:○ Multiplicação por 0: 7*0 = 7*0*0 = 7*0*0*0 … = 0○ DELETE FROM users WHERE users.id = 186

Page 40: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Segundo requisito: Idempotência

● Cada evento em nossa arquitetura tem um UUID aleatório● Cada evento derivado usa o UUID do evento anterior (origem) como chave

única (chave de idempotência)● Serviços garantem consistência interna: banco de dados local valida a chave

única● Resultado: Criar um evento a partir de outro é uma operação idempotente

LiquidacaoID: 78Origem: PedidoDeEnvio:32

PedidoDeEnvioID: 32

Page 41: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Segundo requisito: Idempotência

LiquidacaoID: 78Origem: PedidoDeEnvio:32

PedidoDeEnvioID: 32

EnvioID: 44Origem: Liquidacao:78

RecebimentoID: 156Origem: Envio:44

DepositoID: 377Origem: Recebimento:156

Page 42: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

E quando um serviço cair?

Envios

Saldos

Pedido de envio

Envio Solicitado

Liquidação

Pedido

Page 43: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

E quando um serviço cair?

Envios

Saldos

Pedido de envio

Liquidação

Envio Solicitado

Pedido

Page 44: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

E se rolar um bug ou mensagem inválida?

Envio

SaldosDeadletters

xkcd.com (CC BY-NC 2.5)

Deadletters:Tópico onde guardamos mensagens cujo processamento falhou (inclui metadados como stack-traces, timestamp, etc)

Pedido de envio

Liquidação

Envio Solicitado

Pedido

Page 45: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

E se rolar um bug ou mensagem inválida?

Envio

SaldosDeadletters

xkcd.com (CC BY-NC 2.5)

Republicar

/dev/null

Descartar

Deadletters:Tópico onde guardamos mensagens cujo processamento falhou (inclui metadados como stack-traces, timestamp, etc)

Pedido de envio

Liquidação

Envio Solicitado

Pedido

Page 46: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Feed de movimentações

Page 47: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio
Page 48: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Dados distribuídos = muitos requests

EnviosPedido de envioEnvio

Recebimentos Recebimento

SaldosDepósitoLiquidação

Page 49: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Evento de envio no feed● Valor● Data● Status: pendente | falha | sucesso

Modelo do backend != visão do cliente

Liquidação Envio

404 | 404

404

EnviosPedido de envioEnvio

SaldosLiquidação

Page 50: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

● Lançar uma nova versão de um aplicativo numa app store pode demorar dias

● Muitos usuários continuam com versões antigas por muito tempo

● Bugfixes e otimizações demoram para chegar

● Frontend acoplado impede evoluções no backend

Ciclos de atualização lentos

Page 51: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Backend For Frontend

BFF

EnviosPedido de envioEnvio

Recebimentos Recebimento

SaldosDepósitoLiquidação

Page 52: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

"GraphQL is a query language designed to build client applications by providing an intuitive and flexible syntax and system for describing their data requirements and

interactions."

(GraphQL spec: http://facebook.github.io/graphql/)

Page 53: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Schema é o modelo disponível para o frontend

schema { query: Query}

type Query { saldo(accountId: ID!): Float feed(accountId: ID!): [Envio | Recebimento]}

type Recebimento { data: Date valor: Float}

enum StatusEnvio { PENDENTE, FALHA, SUCESSO}

type Envio { data: Date valor: Float status: StatusEnvio}

EnviosPedido de envioEnvio

Recebimentos Recebimento

SaldosDepósitoLiquidação

Page 54: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Query define os campos que o client precisa

schema { query: Query}

type Query { saldo(accountId: ID!): Float feed(accountId: ID!): [Envio | Recebimento]}

type Recebimento { data: Date valor: Float}

enum StatusEnvio { PENDENTE, FALHA, SUCESSO}

type Envio { data: Date valor: Float status: StatusEnvio}

query feedScreen($accountId: ID!) {

feed(accountId: $accountId) {

... on Envio { data valor status }

... on Recebimento { data valor }

}

}

POST /api/query

Page 55: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Query define os campos que o client precisa

schema { query: Query}

type Query { saldo(accountId: ID!): Float feed(accountId: ID!): [Envio | Recebimento] saldoDetalhado(accountId: ID!): SaldoDetalhado}

query($accountId: ID!) { feed(accountId: $accountId) { … } saldoDetalhado(accountId: $accountId) { … }}

Client v2

query($accountId: ID!) { feed(accountId: $accountId) { … } saldo(accountId: $accountId)}

Client v1

Page 56: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Recapitulando

● Event-sourcing

● Comunicação assíncrona via Kafka

● Backend for Frontend com GraphQL

Page 57: Construindo a NuConta · Dinheiro recebido do Banco Central Integração com o Banco Central. Pedido de envio Envios Recebimentos Saldos Pedido Envio Solicitado Liquidação Envio

Gustavo BicalhoMaurício Verardo

Obrigado!

https://sou.nu/vagasnu