Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[QCon 2019] Event Driven Architecture na Creditas

[QCon 2019] Event Driven Architecture na Creditas

Cada vez mais estamos evoluindo para um cenário onde contextos bem definidos do business são representados por serviços independentes que expressam a realidade por trás do código. Tendo em vista que nossa realidade é assíncrona e que muito do que acontece no mundo é visto por nós como "coisas" (ou eventos) que acontecem em diferentes contextos ao nosso redor, o objetivo de modelar software que expresse a realidade também tange a comunicação entre serviços de diferentes contextos, em forma de eventos.

Nessa talk, veremos como uma arquitetura baseada em eventos pode ser uma opção coerente e viável para a comunicação entre serviços, abordando suas vantagens e desvantagens. Apresentaremos um case de como a Creditas, uma fintech de crédito com garantia, aplicou e validou Event Driven Architecture em seu business e entenderemos qual foram as motivações para esta adoção e as lições aprendidas do uso em produção desta arquitetura.

https://qconsp.com/sp2019/presentation/event-driven-architecture-na-creditas

Camila Campos

May 07, 2019
Tweet

More Decks by Camila Campos

Other Decks in Programming

Transcript

  1. @camposmilaa Plataforma online Empréstimo com garantia Juros baixos pra você

    <3 creditas.com.br vagas.creditas.com.br @CreditasBR
  2. @camposmilaa "OOP to me means only messaging, local retention and

    protection and hiding of state-process, and extreme late-binding of all things." Alan Kay
  3. @camposmilaa "The big idea is messaging [...] The key in

    making great and growable systems is much more to design how its modules communicate rather than what their internal properties and behaviors should be" Alan Kay
  4. @camposmilaa ANALISE DE RISCO - data - resultado IMÓVEL -

    endereço - valor CLIENTE - cpf - nome - data de nascimento
  5. @camposmilaa Invasão de contextos Onboarding de devs Deploy lento Tudo

    ou nada Right tool for the job Escalabilidade
  6. @camposmilaa Solicitei um empréstimo Preenchi o cadastro Coloquei a casa

    como garantia Meu crédito foi aprovado 1. 2. 3. 4. 5.
  7. @camposmilaa Solicitei um empréstimo Preenchi o cadastro Coloquei a casa

    como garantia Meu crédito foi aprovado O empréstimo foi concedido 1. 2. 3. 4. 5.
  8. @camposmilaa ANALISE DE RISCO - data - resultado IMÓVEL -

    endereço - valor CLIENTE - cpf - nome
  9. @camposmilaa Modelo tradicional Cliente id cpf nome 1 11122233344 Pedro

    Salomão 2 55566677788 Maria Rita 3 98765432100 Sandy & Junior
  10. @camposmilaa Modelo tradicional Cliente id cpf nome 1 11122233344 Pedro

    Salomão 2 55566677788 Maria Rita 3 98765432100 Sandy
  11. @camposmilaa Event Sourcing Event Store Cliente Cadastrado {nome: Sandy &

    Junior, cpf: 12345678900} Solicitação criada {valor: 50.000, motivo: Reforma} Garantia Adicionada {tipo: Casa, valor: 200.000} Nome Alterado {nome: Sandy}
  12. @camposmilaa Cliente preenche cadastro Cliente adiciona documento Doc removido Doc

    adicionado Solicitação criada Cliente remove documento
  13. @camposmilaa Cliente preenche cadastro Cliente adiciona documento Cliente adiciona documento

    Doc adicionado Doc removido Doc adicionado Solicitação criada Cliente remove documento
  14. @camposmilaa Cliente preenche cadastro Cliente adiciona documento Cliente cadastra garantia

    Cliente adiciona documento Garantia adicionada Doc adicionado Doc removido Doc adicionado Solicitação criada Cliente remove documento
  15. @camposmilaa Cliente preenche cadastro Cliente adiciona documento Cliente cadastra garantia

    Cliente adiciona documento Creditas aprova o crédito Crédito aprovado Garantia adicionada Doc adicionado Doc removido Doc adicionado Solicitação criada Cliente remove documento
  16. @camposmilaa CQRS + Event Sourcing Event Sourcing Banco de leitura

    evento 1, id: 2 evento 2, id: 1 evento 1, id: 1 id: 1, estado 2 id: 2, estado 1
  17. @camposmilaa Adiciona atributo aos dados do veículo app/vehicle_data/get_vehicle_data.rb | 2

    +- spec/infra/get_molicar_versions_spec.rb | 10 ++++++---- spec/use_case/fetch_vehicle_data_spec.rb | 2 +- spec/vehicle_data/get_vehicle_data_spec.rb | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-)
  18. @camposmilaa Saldo disponível Conta Corrente 10.000 Conta Poupança 2.000 Extrato

    Conta Corrente data valor descrição 03/05 +7000 Salário 05/05 +4000 Freela 06/05 -1000 Aluguel
  19. @camposmilaa Tópico 0 1 2 3 4 5 6 0

    1 2 3 4 5 6 7 8 9 10 11 12 0 1 2 3 4 5 6 7 8 9 Partição 1 Partição 2 Partição 3
  20. @camposmilaa Tópico 0 1 2 3 4 5 6 1

    1 2 3 4 5 6 7 8 9 10 11 12 2 1 2 3 4 5 6 7 8 9 Partição 1 Partição 2 Partição 3
  21. @camposmilaa Tópico 0 1 2 3 4 5 6 0

    1 2 3 4 5 6 7 8 9 10 11 12 0 1 2 3 4 5 6 7 8 9 Partição 1 Partição 2 Partição 3
  22. @camposmilaa Tópico 0 1 2 3 4 5 6 0

    1 2 3 4 5 6 7 8 9 10 11 12 0 1 2 3 4 5 6 7 8 9 Partição 1 Partição 2 Partição 3
  23. @camposmilaa Comando { "id": "id-da-solicitacao", "data_da_solicitacao": "2019-05-04 22:28:14 UTC", "valor_solicitado":

    100000, "motivo_do_emprestimo": "pagar dividas", "solicitante": {"nome": "Mariazinha"}, "garantias": [{"type": "house", "value": 200000}], "metadata": { "timestamp": "2019-05-05 10:14:29 UTC", "name": "CriarSolicitacao", "id": "some-id", "user_id": "some-user-id" } } Entrada da aplicação
  24. @camposmilaa command.metadata.name # => CriarSolicitacao Solicitacao.new(command.to_h) class Solicitacao def initialize(data,

    valor, ...) publish_event(SolicitacaoCriada.new(data, valor, ...)) end end Consumo dos comandos
  25. @camposmilaa command.metadata.name # => CriarSolicitacao Solicitacao.new(command.to_h) class Solicitacao def initialize(data,

    valor, ...) publish_event(SolicitacaoCriada.new(data, valor, ...)) end end Consumo dos comandos
  26. @camposmilaa command.metadata.name # => CriarSolicitacao Solicitacao.new(command.to_h) class Solicitacao def initialize(data,

    valor, ...) publish_event(SolicitacaoCriada.new(data, valor, ...)) end end Consumo dos comandos
  27. @camposmilaa class SolicitacaoRepository def save(solicitacao) eventos = solicitacao.pending_events eventos.each do

    |evento| events_table.insert(id: solicitacao.id, event: evento.to_json) events_producer.publish(evento) end ProjecaoEstadoAtual.new.save(solicitacao) end end Persistência + Event Store Projeção + Evento
  28. @camposmilaa class SolicitacaoRepository def save(solicitacao) eventos = solicitacao.pending_events eventos.each do

    |evento| events_table.insert(id: solicitacao.id, event: evento.to_json) events_producer.publish(evento) end ProjecaoEstadoAtual.new.save(solicitacao) end end Persistência + Event Store Projeção + Evento
  29. @camposmilaa class SolicitacaoRepository def save(solicitacao) eventos = solicitacao.pending_events eventos.each do

    |evento| events_table.insert(id: solicitacao.id, event: evento.to_json) events_producer.publish(evento) end ProjecaoEstadoAtual.new.save(solicitacao) end end Persistência + Event Store Projeção + Evento
  30. @camposmilaa class SolicitacaoRepository def save(solicitacao) eventos = solicitacao.pending_events eventos.each do

    |evento| events_table.insert(id: solicitacao.id, event: evento.to_json) events_producer.publish(evento) end ProjecaoEstadoAtual.new.save(solicitacao) end end Persistência + Event Store Projeção + Evento
  31. @camposmilaa class SolicitacaoRepository def save(solicitacao) eventos = solicitacao.pending_events eventos.each do

    |evento| events_table.insert(id: solicitacao.id, event: evento.to_json) events_producer.publish(evento) end ProjecaoEstadoAtual.new.save(solicitacao) end end Persistência + Event Store Projeção + Evento
  32. @camposmilaa Banco de dados Event Store id event 1 Solicitação

    criada {valor: 50.000, motivo: Reforma} Projeção - Estado Atual id estado atual 1 {id: 1, valor: 50.000, motivo: Reforma}
  33. @camposmilaa Event Driven Architecture Não é complicada Auditoria "de graça"

    Serviços autônomos Reflete a realidade Escalável
  34. @camposmilaa Não é complicada Auditoria "de graça" Serviços autônomos Reflete

    a realidade Escalável Análises complexas Event Driven Architecture