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

Kafka as your Data Lake - is it Feasible?
Kafka as your Data Lake - is it Feasible?Kafka as your Data Lake - is it Feasible?
Kafka as your Data Lake - is it Feasible?Guido Schmutz
 
Introduction to AMQP Messaging with RabbitMQ
Introduction to AMQP Messaging with RabbitMQIntroduction to AMQP Messaging with RabbitMQ
Introduction to AMQP Messaging with RabbitMQDmitriy Samovskiy
 
Kubernetes Networking in Amazon EKS (CON412) - AWS re:Invent 2018
Kubernetes Networking in Amazon EKS (CON412) - AWS re:Invent 2018Kubernetes Networking in Amazon EKS (CON412) - AWS re:Invent 2018
Kubernetes Networking in Amazon EKS (CON412) - AWS re:Invent 2018Amazon Web Services
 
Testes em uma arquitetura com messageria/streaming (Kafka)
Testes em uma arquitetura com messageria/streaming (Kafka)Testes em uma arquitetura com messageria/streaming (Kafka)
Testes em uma arquitetura com messageria/streaming (Kafka)Robson Agapito Correa
 
Locking down your Kubernetes cluster with Linkerd
Locking down your Kubernetes cluster with LinkerdLocking down your Kubernetes cluster with Linkerd
Locking down your Kubernetes cluster with LinkerdBuoyant
 
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안SANG WON PARK
 
Monitoring Microservices
Monitoring MicroservicesMonitoring Microservices
Monitoring MicroservicesWeaveworks
 
Best Practices for Architecting in the Cloud - Jeff Barr
Best Practices for Architecting in the Cloud - Jeff BarrBest Practices for Architecting in the Cloud - Jeff Barr
Best Practices for Architecting in the Cloud - Jeff BarrAmazon Web Services
 
[AWS & 베스핀글로벌, 바이오∙헬스케어∙제약사를 위한 세미나] AWS 클라우드 보안
[AWS & 베스핀글로벌, 바이오∙헬스케어∙제약사를 위한 세미나] AWS 클라우드 보안[AWS & 베스핀글로벌, 바이오∙헬스케어∙제약사를 위한 세미나] AWS 클라우드 보안
[AWS & 베스핀글로벌, 바이오∙헬스케어∙제약사를 위한 세미나] AWS 클라우드 보안BESPIN GLOBAL
 
Building Event Driven (Micro)services with Apache Kafka
Building Event Driven (Micro)services with Apache KafkaBuilding Event Driven (Micro)services with Apache Kafka
Building Event Driven (Micro)services with Apache KafkaGuido Schmutz
 
Un Voyage dans le Cloud: Qu'est-ce que AWS?
Un Voyage dans le Cloud: Qu'est-ce que AWS?Un Voyage dans le Cloud: Qu'est-ce que AWS?
Un Voyage dans le Cloud: Qu'est-ce que AWS?Amazon Web Services
 
Autorização de transações no Nubank
Autorização de transações no NubankAutorização de transações no Nubank
Autorização de transações no NubankLuiz Alberto Hespanha
 
CERN Data Centre Evolution
CERN Data Centre EvolutionCERN Data Centre Evolution
CERN Data Centre EvolutionGavin McCance
 
Ditching the overhead - Moving Apache Kafka workloads into Amazon MSK - ADB30...
Ditching the overhead - Moving Apache Kafka workloads into Amazon MSK - ADB30...Ditching the overhead - Moving Apache Kafka workloads into Amazon MSK - ADB30...
Ditching the overhead - Moving Apache Kafka workloads into Amazon MSK - ADB30...Amazon Web Services
 
Microservices Meetup San Francisco - August 2017 Talk on NATS
Microservices Meetup San Francisco - August 2017 Talk on NATSMicroservices Meetup San Francisco - August 2017 Talk on NATS
Microservices Meetup San Francisco - August 2017 Talk on NATSNATS
 
Intro to InfluxDB 2.0 and Your First Flux Query by Sonia Gupta
Intro to InfluxDB 2.0 and Your First Flux Query by Sonia GuptaIntro to InfluxDB 2.0 and Your First Flux Query by Sonia Gupta
Intro to InfluxDB 2.0 and Your First Flux Query by Sonia GuptaInfluxData
 
Amazon Timestream 시계열 데이터 전용 DB 소개 :: 변규현 - AWS Community Day 2019
Amazon Timestream 시계열 데이터 전용 DB 소개 :: 변규현 - AWS Community Day 2019Amazon Timestream 시계열 데이터 전용 DB 소개 :: 변규현 - AWS Community Day 2019
Amazon Timestream 시계열 데이터 전용 DB 소개 :: 변규현 - AWS Community Day 2019AWSKRUG - AWS한국사용자모임
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축Ji-Woong Choi
 
Kubernetes at Datadog the very hard way
Kubernetes at Datadog the very hard wayKubernetes at Datadog the very hard way
Kubernetes at Datadog the very hard wayLaurent Bernaille
 

Mais procurados (20)

Kafka as your Data Lake - is it Feasible?
Kafka as your Data Lake - is it Feasible?Kafka as your Data Lake - is it Feasible?
Kafka as your Data Lake - is it Feasible?
 
Introduction to AMQP Messaging with RabbitMQ
Introduction to AMQP Messaging with RabbitMQIntroduction to AMQP Messaging with RabbitMQ
Introduction to AMQP Messaging with RabbitMQ
 
Netflix Data Pipeline With Kafka
Netflix Data Pipeline With KafkaNetflix Data Pipeline With Kafka
Netflix Data Pipeline With Kafka
 
Kubernetes Networking in Amazon EKS (CON412) - AWS re:Invent 2018
Kubernetes Networking in Amazon EKS (CON412) - AWS re:Invent 2018Kubernetes Networking in Amazon EKS (CON412) - AWS re:Invent 2018
Kubernetes Networking in Amazon EKS (CON412) - AWS re:Invent 2018
 
Testes em uma arquitetura com messageria/streaming (Kafka)
Testes em uma arquitetura com messageria/streaming (Kafka)Testes em uma arquitetura com messageria/streaming (Kafka)
Testes em uma arquitetura com messageria/streaming (Kafka)
 
Locking down your Kubernetes cluster with Linkerd
Locking down your Kubernetes cluster with LinkerdLocking down your Kubernetes cluster with Linkerd
Locking down your Kubernetes cluster with Linkerd
 
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
 
Monitoring Microservices
Monitoring MicroservicesMonitoring Microservices
Monitoring Microservices
 
Best Practices for Architecting in the Cloud - Jeff Barr
Best Practices for Architecting in the Cloud - Jeff BarrBest Practices for Architecting in the Cloud - Jeff Barr
Best Practices for Architecting in the Cloud - Jeff Barr
 
[AWS & 베스핀글로벌, 바이오∙헬스케어∙제약사를 위한 세미나] AWS 클라우드 보안
[AWS & 베스핀글로벌, 바이오∙헬스케어∙제약사를 위한 세미나] AWS 클라우드 보안[AWS & 베스핀글로벌, 바이오∙헬스케어∙제약사를 위한 세미나] AWS 클라우드 보안
[AWS & 베스핀글로벌, 바이오∙헬스케어∙제약사를 위한 세미나] AWS 클라우드 보안
 
Building Event Driven (Micro)services with Apache Kafka
Building Event Driven (Micro)services with Apache KafkaBuilding Event Driven (Micro)services with Apache Kafka
Building Event Driven (Micro)services with Apache Kafka
 
Un Voyage dans le Cloud: Qu'est-ce que AWS?
Un Voyage dans le Cloud: Qu'est-ce que AWS?Un Voyage dans le Cloud: Qu'est-ce que AWS?
Un Voyage dans le Cloud: Qu'est-ce que AWS?
 
Autorização de transações no Nubank
Autorização de transações no NubankAutorização de transações no Nubank
Autorização de transações no Nubank
 
CERN Data Centre Evolution
CERN Data Centre EvolutionCERN Data Centre Evolution
CERN Data Centre Evolution
 
Ditching the overhead - Moving Apache Kafka workloads into Amazon MSK - ADB30...
Ditching the overhead - Moving Apache Kafka workloads into Amazon MSK - ADB30...Ditching the overhead - Moving Apache Kafka workloads into Amazon MSK - ADB30...
Ditching the overhead - Moving Apache Kafka workloads into Amazon MSK - ADB30...
 
Microservices Meetup San Francisco - August 2017 Talk on NATS
Microservices Meetup San Francisco - August 2017 Talk on NATSMicroservices Meetup San Francisco - August 2017 Talk on NATS
Microservices Meetup San Francisco - August 2017 Talk on NATS
 
Intro to InfluxDB 2.0 and Your First Flux Query by Sonia Gupta
Intro to InfluxDB 2.0 and Your First Flux Query by Sonia GuptaIntro to InfluxDB 2.0 and Your First Flux Query by Sonia Gupta
Intro to InfluxDB 2.0 and Your First Flux Query by Sonia Gupta
 
Amazon Timestream 시계열 데이터 전용 DB 소개 :: 변규현 - AWS Community Day 2019
Amazon Timestream 시계열 데이터 전용 DB 소개 :: 변규현 - AWS Community Day 2019Amazon Timestream 시계열 데이터 전용 DB 소개 :: 변규현 - AWS Community Day 2019
Amazon Timestream 시계열 데이터 전용 DB 소개 :: 변규현 - AWS Community Day 2019
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
 
Kubernetes at Datadog the very hard way
Kubernetes at Datadog the very hard wayKubernetes at Datadog the very hard way
Kubernetes at Datadog the very hard way
 

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 - Lucas Cavalcanti
Arquitetando uma instituição financeira moderna - Lucas CavalcantiArquitetando uma instituição financeira moderna - Lucas Cavalcanti
Arquitetando uma instituição financeira moderna - Lucas CavalcantiiMasters
 
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 - Lucas Cavalcanti
Arquitetando uma instituição financeira moderna - Lucas CavalcantiArquitetando uma instituição financeira moderna - Lucas Cavalcanti
Arquitetando uma instituição financeira moderna - Lucas Cavalcanti
 
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