Slide 1

Slide 1 text

Event Source com Kafka em uma Fintech Diego Irismar, moip @diegoicosta

Slide 2

Slide 2 text

O Mal-Estar nos Microserviços

Slide 3

Slide 3 text

Microserviços - Autonomia - Coesão - Escalabilidade - Bla bla bla ...

Slide 4

Slide 4 text

processo ‘xyz’ de negócio Microserviços 1 Sempre consistente ? 0ms 2 3 150ms 350ms

Slide 5

Slide 5 text

Consistência é Sempre Eventual

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Síncrono NÃO é ser mais Simples Consistência é Sempre Eventual

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Dados não estão Integrados Consistência é Sempre Eventual Síncrono NÃO é ser mais Simples

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

EVENTOS

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Eventos Sistemas Financeiros

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Eventos Imutáveis - Representam mudanças em entidades de domínio - Contam uma história precisa de todo o ciclo de vida dessas entidades

Slide 17

Slide 17 text

Event Sourcing “Event Sourcing happens when we can entirely derive the state of an application by processing the log of Domain Events” Martin Fowler

Slide 18

Slide 18 text

Event Sourcing “Persistência de cada uma das mudanças sofridas pela entidade que comprove seu estado atual. Log da entidade”

Slide 19

Slide 19 text

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 *

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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" }

Slide 22

Slide 22 text

Event Sourcing yes[] no[x] Banco Relacional yes[] no[x] ORM yes[] no[x] CRUD

Slide 23

Slide 23 text

A Resposta Kafka

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Kafka 1 4 2 3

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

CQRS (Command Query Responsibility Segregation)

Slide 29

Slide 29 text

CQRS “The processing of commands and queries is fundamentally asymmetrical, and scaling the services symmetrically does not make a lot of sense” Greg Young

Slide 30

Slide 30 text

CQRS Abordagem para uma nova app muda - Modelo de domínio (de verdade) - A leitura é outro modelo - Até mesmo outra app - Outra tecnologia

Slide 31

Slide 31 text

- 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

Slide 32

Slide 32 text

Tudo isso e o Moip CQRS EventSource EventDriven StreamProcessing Kafka

Slide 33

Slide 33 text

Moip use cases - Contabilidade - Sincronismo de Saldos entre Sistemas

Slide 34

Slide 34 text

Contabilidade Dados Transacionais Dados Financeiros Movimento regras contábeis Registro Contábil Beckenbauer

Slide 35

Slide 35 text

Moip - Beckenbauer Lançamentos Financeiros passam pelo Kafka Dados Transacionais Não

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

base (mysql) transacional connect mysql Microserviço Financeiro (Stream Process) Contabilidade tem todo input para acontecer

Slide 38

Slide 38 text

Beckenbauer - Stream Process - Joins Dados Transacionais Dados Financeiros Movimento Algo comum com stream process: - junção de 2 streams gerando um terceiro

Slide 39

Slide 39 text

Beckenbauer - Stream Process - Há várias possibilidades Flink, Spark, Storm, Samza, Kafka Streams

Slide 40

Slide 40 text

KStreamBuilder builder = new KStreamBuilder(); KStream 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);

Slide 41

Slide 41 text

base (mysql) transacional connect mysql Microserviço Financeiro Beckenbauer Join: Financial +Authorization movement

Slide 42

Slide 42 text

Resultado do Join (movement) é o input da aplicação das regras contábeis Movimento regras contábeis Registro Contábil Beckenbauer - Stream Process

Slide 43

Slide 43 text

KStreamBuilder builder= new KStreamBuilder(); builder .stream(Serdes.String(), movementSerde,TOPIC_MOVEMENTS) .transform(() -> new MovementTransformer()) .to(Serdes.String(), bookingSerde, TOPIC_BOOKINGS);

Slide 44

Slide 44 text

base (mysql) transacional connect mysql Microserviço Financeiro Beckenbauer Join: Financial +Authorization movement Accounting Rules movement

Slide 45

Slide 45 text

Backenbauer - Stack - Java 8 - Mysql - Kafka - Source Connector MySQL: Debezium - Kafka Streams - Spring Boot

Slide 46

Slide 46 text

Sincronismo de saldos Captura modificações Normaliza Atualiza saldo Financial Balance (mysql) Classic Moip (mysql) New Balance

Slide 47

Slide 47 text

Sync de Saldo em Sistema Legado Financial Balance (mysql) Classic Moip (mysql) connector mysql (source) New Balance connector mysql (sinky)

Slide 48

Slide 48 text

KStreamBuilder builder= new KStreamBuilder(); builder .stream(keySerde, debeziumDeserializer, BALANCE_db.getTopic()) .transform(() -> balanceTransformer) .to(keySerde, balanceSerde, BALANCE_FINANCIAL.getTopic());

Slide 49

Slide 49 text

Sync Saldos - Stack - Java 8 - Mysql - Kafka - Source Connector MySQL: Debezium - Sink Connector: MySQL Sink Connector - Kafka Streams - Spring Boot

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

Kafka + - Replication Factory - Partition number - Log compaction / Log Retention - Consumer Offsets - Zookeeper - Stateful Stream Process

Slide 55

Slide 55 text

Rodrigo Montanha Gabriel Queiroz Lucas França William Souza Allan Pires Guilherme Sipoloni time moip

Slide 56

Slide 56 text

Pessoas-Chave Gwen Shapira @gwenshap Neha Narkhede @nehanarkhede Jay Kreps @jaykreps Martin Kleppmann @martinkl Eno Thereska @enothereska Greg Young http://goodenoughsoftware.net/

Slide 57

Slide 57 text

Referências https://www.confluent.io/blog/hello-world-kafka-connect-kafka-streams/ https://www.confluent.io/blog/distributed-real-time-joins-and-aggregations-on-user-activity-events-us ing-kafka-streams/ https://www.confluent.io/blog/turning-the-database-inside-out-with-apache-samza/ https://www.confluent.io/blog/making-sense-of-stream-processing/ https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf https://martinfowler.com/eaaDev/EventNarrative.html https://www.confluent.io/blog/event-sourcing-cqrs-stream-processing-apache-kafka-whats-connection/ https://www.confluent.io/blog/data-dichotomy-rethinking-the-way-we-treat-data-and-services/

Slide 58

Slide 58 text

Perguntas Diego Irismar - @diegoicosta - github.com/diegoicosta - linkedin.com/in/diegoicosta