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

Event Source com Kafka em uma Fintech - Moip De...

Event Source com Kafka em uma Fintech - Moip DevDay 2

Diego Irismar da Costa

April 25, 2017
Tweet

More Decks by Diego Irismar da Costa

Other Decks in Programming

Transcript

  1. Microserviços Em uma simples chamada HTTP síncrona … [2] pode

    gerar lentidão em [1] [2] pode derrubar todo sistema [1] não sabe se [2] funcionou ou não [1] precisa “desfazer” se [2] falhou 1 2
  2. Microserviços Autonomia - Sem acesso direto ao modelo de dados

    - Propositalmente, estão encapsulados - Modelo evolui sem dependências externas - Time decide como e quais tecnologias
  3. Eventos ... Comunicação por eventos não é novidade (Event-Driven) Imutáveis

    - Representam mudanças em entidades de domínio - Contam uma história precisa de todo o ciclo de vida dessas entidades
  4. Eventos ... Sem dependência direta entre serviços (async) Consistência eventual

    Plataforma de Eventos é para onde tudo passa processo ‘xyz’ de negócio 2 3 Plataforma de Eventos 1 1 2 3
  5. Eventos Financeiros Mudanças de estado de saldos (balance) - Há

    sempre um evento atrelado - Um Lançamento Financeiro (entry) - Auditável - Rastreável - Traduzidos para uma visão amigável
  6. Eventos Imutáveis - Representam mudanças em entidades de domínio -

    Contam uma história precisa de todo o ciclo de vida dessas entidades
  7. Event Sourcing “Event Sourcing happens when we can entirely derive

    the state of an application by processing the log of Domain Events” Martin Fowler
  8. Event Sourcing “Persistência de cada uma das mudanças sofridas pela

    entidade que comprove seu estado atual. Log da entidade”
  9. Event Sourcing Log da entidade ? PAY-01:PAYMENT attr_1: 01 attr_2:

    02 attr_3: 03 attr_n: 0N PAY-01:PAYMENT_LOG created_at: 01/01 attr_02: 222 attr_03: 333 1 *
  10. Event Sourcing Não há mutação de estado! event_id pay_id created_at

    attr_1 attr_2 attr_3 attr_n 0002 PAY-01 02/01/2017 01 02 03 0N 0001 PAY-01 01/01/2017 01 222 333 0N
  11. Event Sourcing event_id pay_id data 0002 PAY-01 { "payment_id": "PAY-01",

    "created_at": “02/01/2017, "attr_1": 01, "attr_2": 02, "attr_3": 03, "attr_n": "0N" } 0001 PAY-01 { "payment_id": "PAY-01", "created_at": “01/01/2017, "attr_1": 01, "attr_2": 222, "attr_3": 333, "attr_n": "0N" }
  12. Kafka “Event sourcing involves maintaining an immutable sequence of events

    that multiple applications can subscribe to. Kafka is a high-performance, low-latency, scalable and durable log” Neha Narkhede
  13. Restrições: ORM, RDBMS, CRUD - Modelo de Domínio não precisa

    ORM (DDD) - Alteração em entidades de domínio geram eventos (event sourcing) - Eventos vão para o Kafka e nele persistidos - O modelo de escrita != leitura
  14. Decifrando Várias visões podem ser derivadas processando o stream: Relacional,

    BI, ElasticSearch, Graph Eventos são a fonte da verdade e fluem pelo Kafka continuamente, um stream
  15. CQRS “The processing of commands and queries is fundamentally asymmetrical,

    and scaling the services symmetrically does not make a lot of sense” Greg Young
  16. CQRS Abordagem para uma nova app muda - Modelo de

    domínio (de verdade) - A leitura é outro modelo - Até mesmo outra app - Outra tecnologia
  17. - Kafka é o log de eventos: durável, resiliente,escalável -

    Única maneira de acesso é consumindo streams - Microserviço é invocado - Cria-se visões especializadas CQRS EventSource EventDriven StreamProcessing
  18. Kafka Connect “Kafka Connect é uma ferramenta para, de forma

    escalável e confiável, fazer streaming de dados entre o Kafka e outros sistemas” confluent inc
  19. Beckenbauer - Stream Process - Joins Dados Transacionais Dados Financeiros

    Movimento Algo comum com stream process: - junção de 2 streams gerando um terceiro
  20. KStreamBuilder builder = new KStreamBuilder(); KStream<String, Authorization> authStream = builder.stream(Serdes.String(),

    authSerde, TOPIC_AUTHORIZATIONS); builder .stream(Serdes.String(), entrySerde, TOPIC_FIN_ENTRIES) .filter(isAuthorization()) .map(reindexKey()) .join(authStream, joinNormalize(), JoinWindows.of(JOIN_WINDOW_TIME), Serdes.String(), entrySerde, authSerde) .to(Serdes.String(), movementSerde, TOPIC_MOVEMENTS);
  21. Resultado do Join (movement) é o input da aplicação das

    regras contábeis Movimento regras contábeis Registro Contábil Beckenbauer - Stream Process
  22. Backenbauer - Stack - Java 8 - Mysql - Kafka

    - Source Connector MySQL: Debezium - Kafka Streams - Spring Boot
  23. Sync de Saldo em Sistema Legado Financial Balance (mysql) Classic

    Moip (mysql) connector mysql (source) New Balance connector mysql (sinky)
  24. Sync Saldos - Stack - Java 8 - Mysql -

    Kafka - Source Connector MySQL: Debezium - Sink Connector: MySQL Sink Connector - Kafka Streams - Spring Boot
  25. Escalabilidade e Resiliência Apps baseadas em Kafka - Escalabilidade Horizontal

    Partições por tópico e consumo em paralelo - Resiliência Todos componentes são clusterizados
  26. topic: balance 1 2 3 partitions consumer 1 consumer 2

    consumer 3 Número de partições de um tópico define o máximo de paralelismo possível no consumo Escalabilidade
  27. topic: balance 1 2 3 partitions consumer 1 consumer 2

    consumer 3 Caso um consumer pare de responder, outro assume de onde parou Resiliência
  28. Futuro Se aprofundar mais nessa abordagem - Não fazer “dual

    writes” - Menos connect de “source” - CQRS - Elastic Search, etc - Stream process stateful - Melhorar infra e operação - Contribuir mais com comunidade
  29. Kafka + - Replication Factory - Partition number - Log

    compaction / Log Retention - Consumer Offsets - Zookeeper - Stateful Stream Process
  30. Pessoas-Chave Gwen Shapira @gwenshap Neha Narkhede @nehanarkhede Jay Kreps @jaykreps

    Martin Kleppmann @martinkl Eno Thereska @enothereska Greg Young http://goodenoughsoftware.net/