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 - Processos complexos de negócio se “espalham” por mais de um serviço - Comunicação entre eles via HTTP REST 1 4 2 3 HTTP HTTP HTTP

Slide 5

Slide 5 text

processo ‘xyz’ de negócio Microserviços 1 4 2 3 Sucesso total, mas ... Durante o intervalo de execução, o processo ‘xyz’ esteve sempre em um estado consistente ? duração: 600ms

Slide 6

Slide 6 text

Consistência é Sempre Eventual Microserviços

Slide 7

Slide 7 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] realmente falhou 1 2

Slide 8

Slide 8 text

Síncrono NÃO é ser mais Simples Microserviços

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Microserviços - Não há acesso direto ao modelo de dados - Propositalmente, estão encapsulados - Modelo evolui sem dependências externas - Time decide como ele será e quais tecnologias

Slide 11

Slide 11 text

MICROSERVICES Dados não estão Integrados

Slide 12

Slide 12 text

Recapitulando Consistência Eventual Riscos ao ser Síncrono Não Integração de dados

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Eventos para Salvação

Slide 15

Slide 15 text

Eventos ... Sistemas se comunicarem por meio de eventos não é uma novidade (Event-Driven) - O produtor emite um evento que retrata uma mudança em seu estado - Outro sistema captura esse evento, trata, eventualmente muda seu estado e emite outro evento

Slide 16

Slide 16 text

Eventos ... Eventos são fatos, representam o passado São por definição 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

Eventos ... Sem dependência direta entre serviços (async) Consistência eventual Plataforma de Eventos é para onde tudo flue processo ‘xyz’ de negócio 4 2 3 Plataforma de Eventos 1 1 4 2 3

Slide 18

Slide 18 text

Eventos Sistemas Financeiros

Slide 19

Slide 19 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 20

Slide 20 text

Eventos Eventos são fatos, representam o passado. São por definição Imutáveis - Representam mudanças em entidades de domínio - Contam uma história precisa de todo o ciclo de vida dessas entidades

Slide 21

Slide 21 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 22

Slide 22 text

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

Slide 23

Slide 23 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 24

Slide 24 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 25

Slide 25 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 26

Slide 26 text

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

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

A Resposta Kafka

Slide 29

Slide 29 text

Kafka “Event sourcing and Apache Kafka are related. Here’s how – 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 30

Slide 30 text

kafka Kafka 1 4 2 3

Slide 31

Slide 31 text

Kafka 1 4 2 3

Slide 32

Slide 32 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 33

Slide 33 text

Escrita != Leitura - Modelo onde eventos são persistidos não atende as necessidades de leitura - O modelo de Leitura precisa ser especializado para esta função - Uma visão derivada dos eventos

Slide 34

Slide 34 text

Martin Kleppmann: turning the database inside out with apache-samza

Slide 35

Slide 35 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 36

Slide 36 text

CQRS (Command Query Responsibility Segregation)

Slide 37

Slide 37 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 38

Slide 38 text

CQRS Padrão ao se construir nova app: 1. Criar modelo Relacional 2. Mapear modelo Relacional (ORM) 3. Implementar DAO - Repository 4. Fazer o resto …

Slide 39

Slide 39 text

CQRS problema: A Realidade - novas necessidades de clientes - aumento exponencial de volume “Otimizações”

Slide 40

Slide 40 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 41

Slide 41 text

- Kafka é o log de eventos: durável, resiliente,escalável (event source) - Única maneira de acesso é consumindo streams (stream processing) - Microserviço é invocado (event-driven) - Cria-se visões especializadas (cqrs) CQRS EventSource EventDriven StreamProcessing Kafka

Slide 42

Slide 42 text

Kafka Event Streams Event Processing Event-Driven Event Source CQRS

Slide 43

Slide 43 text

Tudo isso e o Moip CQRS EventSource EventDriven StreamProcessing Kafka

Slide 44

Slide 44 text

Moip - Contabilidade - Atualização de Saldos em sistema legado

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 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 48

Slide 48 text

confluent inc blog :hello world kafka connect kafka streams

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

Beckenbauer - Stream Process - Há várias possibilidades - Kafka Streams

Slide 52

Slide 52 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 53

Slide 53 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 54

Slide 54 text

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

Slide 55

Slide 55 text

Sync de Saldo em Sistema Legado Financial Balance (mysql) Classic Moip (mysql) connect mysql (source) normalizador connect mysql (sinky)

Slide 56

Slide 56 text

Normalizador Registro saldo Original Reformata Breitner

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

New Balance Breitner connect mysql (sinky) Classic Moip (mysql)

Slide 59

Slide 59 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 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 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 64

Slide 64 text

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