SlideShare uma empresa Scribd logo
1 de 57
Baixar para ler offline
Gustavo Bicalho
Maurício Verardo
Construindo a
NuConta
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
NuConta
NuConta
NuConta
NuConta
NuConta
NuConta
NuConta
NuConta
https://nubank.design/
Microsserviços
Microsserviços
Fatura
Saldo
Antecipação
Antecipações
Saldos
Faturas
Saldos
Antecipações
Faturas
Microsserviços
Fatura
Saldo
Antecipação
Load
Balancer
Load
Balancer
Load
Balancer
Microsserviços
Serviço A Serviço B
HTTP
Microsserviços
Serviço A
Tópico do
Kafka
Serviço B
Transferindo dinheiro entre NuContas
SOUTHEAST BRAZIL REGION FROM SPACE
Transferindo dinheiro entre NuContas
Pedido de envio
Envio
Recebimentos
Recebimento
Envios
Liquidação
Saldos
Depósito
Transferindo dinheiro entre NuContas
Pedido de envio
RecebimentosEnvios
Saldos
Pedido
Envio Solicitado
Transferindo dinheiro entre NuContas
Pedido de envio
RecebimentosEnvios
Saldos
Pedido
Envio Solicitado
Liquidação
Liquidação efetuada
Transferindo dinheiro entre NuContas
Pedido de envio
RecebimentosEnvios
Saldos
Pedido
Envio Solicitado
Liquidação
Envio
Liquidação efetuada
Dinheiro enviado para
NuConta
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
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
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
Event Sourcing
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?
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
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?
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
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?
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
Saldos
Liquidação
Depósito
Event Sourcing
Saldo hoje
Saldo no ano que vem
Saldo no mês passado
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
Consistência em sistemas distribuídos
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
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ósito
Liquidação
Pedido
Primeiro requisito: Processamento at-least-once
Todo evento publicado é recebido e processado
completamente pelos consumidores pelo menos uma vez
Primeiro requisito: Processamento at-least-once
MSG
OK!
:)
MSG
MSG
MSG
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
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
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
Liquidacao
ID: 78
Origem: PedidoDeEnvio:32
PedidoDeEnvio
ID: 32
Segundo requisito: Idempotência
Liquidacao
ID: 78
Origem: PedidoDeEnvio:32
PedidoDeEnvio
ID: 32
Envio
ID: 44
Origem: Liquidacao:78
Recebimento
ID: 156
Origem: Envio:44
Deposito
ID: 377
Origem: Recebimento:156
E quando um serviço cair?
Envios
Saldos
Pedido de envio
Envio
Solicitado
Liquidação
Pedido
E quando um serviço cair?
Envios
Saldos
Pedido de envio
Liquidação
Envio
Solicitado
Pedido
E se rolar um bug ou mensagem inválida?
Envio
Saldos
Deadletters
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
E se rolar um bug ou mensagem inválida?
Envio
Saldos
Deadletters
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
Feed de movimentações
Dados distribuídos = muitos requests
Envios
Pedido de envio
Envio
Recebimentos Recebimento
Saldos
Depósito
Liquidação
Evento de envio no feed
● Valor
● Data
● Status: pendente | falha | sucesso
Modelo do backend != visão do cliente
Liquidação Envio
404 | 404
404
Envios
Pedido de envio
Envio
Saldos
Liquidação
● 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
Backend For Frontend
BFF
Envios
Pedido de envio
Envio
Recebimentos Recebimento
Saldos
Depósito
Liquidação
"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/)
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
}
Envios
Pedido de envio
Envio
Recebimentos Recebimento
Saldos
Depósito
Liquidação
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
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
Recapitulando
● Event-sourcing
● Comunicação assíncrona via Kafka
● Backend for Frontend com GraphQL
Gustavo Bicalho
Maurício Verardo
Obrigado!
https://sou.nu/vagasnu

Mais conteúdo relacionado

Mais procurados

[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유Hyojun Jeon
 
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)Seongyun Byeon
 
Grokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking VN
 
Disaster Recovery Plans for Apache Kafka
Disaster Recovery Plans for Apache KafkaDisaster Recovery Plans for Apache Kafka
Disaster Recovery Plans for Apache Kafkaconfluent
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)Hyojun Jeon
 
Tiki.vn - How we scale as a tech startup
Tiki.vn - How we scale as a tech startupTiki.vn - How we scale as a tech startup
Tiki.vn - How we scale as a tech startupTung Ns
 
REST & API Management with the WSO2 ESB
REST & API Management with the WSO2 ESBREST & API Management with the WSO2 ESB
REST & API Management with the WSO2 ESBWSO2
 
Event Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQEvent Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQAraf Karsh Hamid
 
What Companies Look for When Hiring PMs by Spotify Product Lead
What Companies Look for When Hiring PMs by Spotify Product LeadWhat Companies Look for When Hiring PMs by Spotify Product Lead
What Companies Look for When Hiring PMs by Spotify Product LeadProduct School
 
Grokking Techtalk #37: Data intensive problem
 Grokking Techtalk #37: Data intensive problem Grokking Techtalk #37: Data intensive problem
Grokking Techtalk #37: Data intensive problemGrokking VN
 
Scaling a Core Banking Engine Using Apache Kafka | Peter Dudbridge, Thought M...
Scaling a Core Banking Engine Using Apache Kafka | Peter Dudbridge, Thought M...Scaling a Core Banking Engine Using Apache Kafka | Peter Dudbridge, Thought M...
Scaling a Core Banking Engine Using Apache Kafka | Peter Dudbridge, Thought M...HostedbyConfluent
 
글쓰는 개발자 모임, 글또
글쓰는 개발자 모임, 글또글쓰는 개발자 모임, 글또
글쓰는 개발자 모임, 글또Seongyun Byeon
 
Real World Event Sourcing and CQRS
Real World Event Sourcing and CQRSReal World Event Sourcing and CQRS
Real World Event Sourcing and CQRSMatthew Hawkins
 
Distributed Transaction in Microservice
Distributed Transaction in MicroserviceDistributed Transaction in Microservice
Distributed Transaction in MicroserviceNghia Minh
 
Flink Forward San Francisco 2019: Building Financial Identity Platform using ...
Flink Forward San Francisco 2019: Building Financial Identity Platform using ...Flink Forward San Francisco 2019: Building Financial Identity Platform using ...
Flink Forward San Francisco 2019: Building Financial Identity Platform using ...Flink Forward
 
Node.js BFFs - our way to the better/micro frontends
Node.js BFFs - our way to the better/micro frontendsNode.js BFFs - our way to the better/micro frontends
Node.js BFFs - our way to the better/micro frontendsEugene Fidelin
 
Power automate a workflow automation platform
Power automate a  workflow automation platform Power automate a  workflow automation platform
Power automate a workflow automation platform Amit Kumawat
 

Mais procurados (20)

[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
 
Data Product Management at Nubank
Data Product Management at NubankData Product Management at Nubank
Data Product Management at Nubank
 
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
 
Grokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKI
 
Disaster Recovery Plans for Apache Kafka
Disaster Recovery Plans for Apache KafkaDisaster Recovery Plans for Apache Kafka
Disaster Recovery Plans for Apache Kafka
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
 
Tiki.vn - How we scale as a tech startup
Tiki.vn - How we scale as a tech startupTiki.vn - How we scale as a tech startup
Tiki.vn - How we scale as a tech startup
 
REST & API Management with the WSO2 ESB
REST & API Management with the WSO2 ESBREST & API Management with the WSO2 ESB
REST & API Management with the WSO2 ESB
 
Event Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQEvent Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQ
 
What Companies Look for When Hiring PMs by Spotify Product Lead
What Companies Look for When Hiring PMs by Spotify Product LeadWhat Companies Look for When Hiring PMs by Spotify Product Lead
What Companies Look for When Hiring PMs by Spotify Product Lead
 
Grokking Techtalk #37: Data intensive problem
 Grokking Techtalk #37: Data intensive problem Grokking Techtalk #37: Data intensive problem
Grokking Techtalk #37: Data intensive problem
 
Scaling a Core Banking Engine Using Apache Kafka | Peter Dudbridge, Thought M...
Scaling a Core Banking Engine Using Apache Kafka | Peter Dudbridge, Thought M...Scaling a Core Banking Engine Using Apache Kafka | Peter Dudbridge, Thought M...
Scaling a Core Banking Engine Using Apache Kafka | Peter Dudbridge, Thought M...
 
글쓰는 개발자 모임, 글또
글쓰는 개발자 모임, 글또글쓰는 개발자 모임, 글또
글쓰는 개발자 모임, 글또
 
Real World Event Sourcing and CQRS
Real World Event Sourcing and CQRSReal World Event Sourcing and CQRS
Real World Event Sourcing and CQRS
 
Microservices-101
Microservices-101Microservices-101
Microservices-101
 
Distributed Transaction in Microservice
Distributed Transaction in MicroserviceDistributed Transaction in Microservice
Distributed Transaction in Microservice
 
Flink Forward San Francisco 2019: Building Financial Identity Platform using ...
Flink Forward San Francisco 2019: Building Financial Identity Platform using ...Flink Forward San Francisco 2019: Building Financial Identity Platform using ...
Flink Forward San Francisco 2019: Building Financial Identity Platform using ...
 
Power Automate
Power AutomatePower Automate
Power Automate
 
Node.js BFFs - our way to the better/micro frontends
Node.js BFFs - our way to the better/micro frontendsNode.js BFFs - our way to the better/micro frontends
Node.js BFFs - our way to the better/micro frontends
 
Power automate a workflow automation platform
Power automate a  workflow automation platform Power automate a  workflow automation platform
Power automate a workflow automation platform
 

Semelhante a Construindo a NuConta

Arquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningArquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningFelipe Santos
 
Aplicações Realtime com PHP
Aplicações Realtime com PHPAplicações Realtime com PHP
Aplicações Realtime com PHPGustavo Castro
 
Desenvolvendo aplicações de comunicação em tempo real com ASP.NET SignalR
Desenvolvendo aplicações de comunicação em tempo real com ASP.NET SignalRDesenvolvendo aplicações de comunicação em tempo real com ASP.NET SignalR
Desenvolvendo aplicações de comunicação em tempo real com ASP.NET SignalRRodrigo Kono
 
Splunklive! Universo Online
Splunklive! Universo OnlineSplunklive! Universo Online
Splunklive! Universo OnlineSplunk
 
Arquitetando uma instituição financeira moderna
Arquitetando uma instituição financeira modernaArquitetando uma instituição financeira moderna
Arquitetando uma instituição financeira modernaLucas Cavalcanti dos Santos
 
Escalonamento horizontal de servicos web
Escalonamento horizontal de servicos webEscalonamento horizontal de servicos web
Escalonamento horizontal de servicos webFabio Janiszevski
 
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...Rodrigo Peleias
 
IBM - Curso Node + Angular - Aula 01
IBM - Curso Node + Angular - Aula 01IBM - Curso Node + Angular - Aula 01
IBM - Curso Node + Angular - Aula 01Claudiney Junior
 
QCon SP 2016 - WebAPIs e delivery: Matando a fome de 1 milhão de pedidos men...
QCon SP 2016 -  WebAPIs e delivery: Matando a fome de 1 milhão de pedidos men...QCon SP 2016 -  WebAPIs e delivery: Matando a fome de 1 milhão de pedidos men...
QCon SP 2016 - WebAPIs e delivery: Matando a fome de 1 milhão de pedidos men...Tiago Marchetti Dolphine
 
(4) Alternativas de Governança de processos do Cadastro
(4) Alternativas de Governança de processos do Cadastro(4) Alternativas de Governança de processos do Cadastro
(4) Alternativas de Governança de processos do CadastroPortal KeyConsultas-web
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoComunidade NetPonto
 
Descobrindo APIs REST
Descobrindo APIs RESTDescobrindo APIs REST
Descobrindo APIs RESTGuilherme
 
WSO2 Novo Modelo de Subscrições e Produtos 2017
WSO2 Novo Modelo de Subscrições e Produtos 2017WSO2 Novo Modelo de Subscrições e Produtos 2017
WSO2 Novo Modelo de Subscrições e Produtos 2017Edgar Silva
 
Workshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha BásicaWorkshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha BásicaSensedia
 
Construindo Apps Com SignalR
Construindo Apps Com SignalRConstruindo Apps Com SignalR
Construindo Apps Com SignalRIvan Paulovich
 

Semelhante a Construindo a NuConta (20)

Event-Driven SAGAs com Kafka
Event-Driven SAGAs com Kafka Event-Driven SAGAs com Kafka
Event-Driven SAGAs com Kafka
 
Arquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningArquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine Learning
 
Aplicações Realtime com PHP
Aplicações Realtime com PHPAplicações Realtime com PHP
Aplicações Realtime com PHP
 
Desenvolvendo aplicações de comunicação em tempo real com ASP.NET SignalR
Desenvolvendo aplicações de comunicação em tempo real com ASP.NET SignalRDesenvolvendo aplicações de comunicação em tempo real com ASP.NET SignalR
Desenvolvendo aplicações de comunicação em tempo real com ASP.NET SignalR
 
Event source com Kafka em uma Fintech
Event source com Kafka em uma FintechEvent source com Kafka em uma Fintech
Event source com Kafka em uma Fintech
 
Splunklive! Universo Online
Splunklive! Universo OnlineSplunklive! Universo Online
Splunklive! Universo Online
 
Arquitetando uma instituição financeira moderna
Arquitetando uma instituição financeira modernaArquitetando uma instituição financeira moderna
Arquitetando uma instituição financeira moderna
 
Escalonamento horizontal de servicos web
Escalonamento horizontal de servicos webEscalonamento horizontal de servicos web
Escalonamento horizontal de servicos web
 
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
 
Trabalho Web Services
Trabalho Web ServicesTrabalho Web Services
Trabalho Web Services
 
IBM - Curso Node + Angular - Aula 01
IBM - Curso Node + Angular - Aula 01IBM - Curso Node + Angular - Aula 01
IBM - Curso Node + Angular - Aula 01
 
QCon SP 2016 - WebAPIs e delivery: Matando a fome de 1 milhão de pedidos men...
QCon SP 2016 -  WebAPIs e delivery: Matando a fome de 1 milhão de pedidos men...QCon SP 2016 -  WebAPIs e delivery: Matando a fome de 1 milhão de pedidos men...
QCon SP 2016 - WebAPIs e delivery: Matando a fome de 1 milhão de pedidos men...
 
(4) Alternativas de Governança de processos do Cadastro
(4) Alternativas de Governança de processos do Cadastro(4) Alternativas de Governança de processos do Cadastro
(4) Alternativas de Governança de processos do Cadastro
 
Alternativas de Governanca de processos do Cadastro
Alternativas de Governanca de processos do CadastroAlternativas de Governanca de processos do Cadastro
Alternativas de Governanca de processos do Cadastro
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis Paulino
 
Descobrindo APIs REST
Descobrindo APIs RESTDescobrindo APIs REST
Descobrindo APIs REST
 
WSO2 Novo Modelo de Subscrições e Produtos 2017
WSO2 Novo Modelo de Subscrições e Produtos 2017WSO2 Novo Modelo de Subscrições e Produtos 2017
WSO2 Novo Modelo de Subscrições e Produtos 2017
 
Workshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha BásicaWorkshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha Básica
 
Reverse Ajax Dwr
Reverse Ajax DwrReverse Ajax Dwr
Reverse Ajax Dwr
 
Construindo Apps Com SignalR
Construindo Apps Com SignalRConstruindo Apps Com SignalR
Construindo Apps Com SignalR
 

Construindo a NuConta

  • 2. 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
  • 16. Transferindo dinheiro entre NuContas SOUTHEAST BRAZIL REGION FROM SPACE
  • 17. Transferindo dinheiro entre NuContas Pedido de envio Envio Recebimentos Recebimento Envios Liquidação Saldos Depósito
  • 18. Transferindo dinheiro entre NuContas Pedido de envio RecebimentosEnvios Saldos Pedido Envio Solicitado
  • 19. Transferindo dinheiro entre NuContas Pedido de envio RecebimentosEnvios Saldos Pedido Envio Solicitado Liquidação Liquidação efetuada
  • 20. Transferindo dinheiro entre NuContas Pedido de envio RecebimentosEnvios Saldos Pedido Envio Solicitado Liquidação Envio Liquidação efetuada Dinheiro enviado para NuConta
  • 21. 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
  • 22. 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
  • 23. 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
  • 25. 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?
  • 26. 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
  • 27. 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?
  • 28. 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
  • 29. 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?
  • 30. 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
  • 32. 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
  • 33. Consistência em sistemas distribuídos
  • 34. 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
  • 35. 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ósito Liquidação Pedido
  • 36. Primeiro requisito: Processamento at-least-once Todo evento publicado é recebido e processado completamente pelos consumidores pelo menos uma vez
  • 37. Primeiro requisito: Processamento at-least-once MSG OK! :) MSG MSG MSG
  • 38. 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
  • 39. 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
  • 40. 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 Liquidacao ID: 78 Origem: PedidoDeEnvio:32 PedidoDeEnvio ID: 32
  • 41. Segundo requisito: Idempotência Liquidacao ID: 78 Origem: PedidoDeEnvio:32 PedidoDeEnvio ID: 32 Envio ID: 44 Origem: Liquidacao:78 Recebimento ID: 156 Origem: Envio:44 Deposito ID: 377 Origem: Recebimento:156
  • 42. E quando um serviço cair? Envios Saldos Pedido de envio Envio Solicitado Liquidação Pedido
  • 43. E quando um serviço cair? Envios Saldos Pedido de envio Liquidação Envio Solicitado Pedido
  • 44. E se rolar um bug ou mensagem inválida? Envio Saldos Deadletters 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
  • 45. E se rolar um bug ou mensagem inválida? Envio Saldos Deadletters 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
  • 47.
  • 48. Dados distribuídos = muitos requests Envios Pedido de envio Envio Recebimentos Recebimento Saldos Depósito Liquidação
  • 49. Evento de envio no feed ● Valor ● Data ● Status: pendente | falha | sucesso Modelo do backend != visão do cliente Liquidação Envio 404 | 404 404 Envios Pedido de envio Envio Saldos Liquidação
  • 50. ● 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
  • 51. Backend For Frontend BFF Envios Pedido de envio Envio Recebimentos Recebimento Saldos Depósito Liquidação
  • 52. "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/)
  • 53. 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 } Envios Pedido de envio Envio Recebimentos Recebimento Saldos Depósito Liquidação
  • 54. 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
  • 55. 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
  • 56. Recapitulando ● Event-sourcing ● Comunicação assíncrona via Kafka ● Backend for Frontend com GraphQL