Introducción a Apache Kafka

Antón R. Yuste - @antonmry - OptareSolutions & VigoJUG

E ti, ¿de quen ves sendo?

speaker = [
    name: 'Antón R. Yuste',
    company: 'Optare Solutions',
    role: 'Technical Director',
    twitter: '@antonmry',
    github: 'antonmry',
    extraDescription: ['VigoJUG co-organiser',
         '''Misc OSS contribs (Gradle plugins,
            docker images, SIP & WebRTC...)''',
         'surfer wannabe',]
].each{ k, v -> println "${k}:${v}" }

Optare Solutions

Optare

Frontend vs. Backend

Frontend vs. Back-end

Microservices

Microservices

Apache Kafka

Apache Kafka es un proyecto de intermediación de mensajes de código abierto desarrollado por la Apache Software Foundation escrito en Scala.

Fonte: wikipedia

Apache Kafka

El proyecto tiene como objetivo proporcionar una plataforma unificada, de alto rendimiento y de baja latencia para la manipulación en tiempo real de fuentes de datos.

Fonte: wikipedia

Apache Kafka

Puede verse como una cola de mensajes, bajo el patrón publicación-suscripción, masivamente escalable concebida como un registro de transacciones distribuidas, la que la vuelve atractiva para las infraestructuras de aplicaciones empresariales.

Fonte: wikipedia

A miña definición: caixas máxicas

caixons

Uso

Spaguetti Architecture

Separar os servicios

Kafka definition of services

Con Kafka

Architecture with Kafka

Fonte

Arquitectura

Apache Kafka Architecture

Topic

Apache Kafka Topic

Replication

Apache Kafka Replication

Fonte

Rendemento

Apache Kafka Performance

Latencia

Apache Kafka Latencia

Conectores

  • Java

  • C/C++

  • Python

  • Go (AKA golang)

  • Erlang

  • .NET

  • Clojure

  • Ruby

  • Node.js

  • Proxy (HTTP REST, etc)

  • Perl

  • stdin/stdout

  • PHP

  • Rust

  • Alternative Java

  • Storm

  • Scala DSL

  • Clojure

Exemplo: refubot

Refubot con Apache Kafka

¡Funcionou!

Presentacion Refubot

Casos de uso

Algúns exemplos habituais pero é unha ferramenta que soporta moitos usos.

Messaging

  • Permite desaclopar sistemas tradicionais.

  • Tamén para coordinar sistemas distribuidos.

  • Exemplos: refubot, Bluemix, LivePerson.

Website Activity Tracking

  • O volumen de datos xerados polos usuarios é moi alto.

  • Ten moitos usos: estadísticas, monitoreo, seguridade, etc.

  • Nalgún casos é preciso ter acceso a información en tempo real con accións immediatas.

  • Linkedin, Twitter

Métricas

  • O sistema que as recibe pode non ser capaz de procesar todo o tráfico no momento que se produce: precisamos un "buffer".

  • A información tense que persistir, incluso si algún dos servidores do "buffer" se cae.

  • Yahoo, Netflix, Uber, R-Cable Smart Home.

Agregación de Logs

  • Sistema central para almacenar os logs de diferentes fontes antes de ser procesados.

  • Hai ferramentas específicas pero Kafka ten menor latencia, o que nalgúns casos pode ser moi interesantes.

  • Integracións con ELK.

  • Pinterest, Spotify, trivago, cloudfare, graylog2, shopify

Demo

Demo

Posta en marcha e proba

docker run -p 2181:2181 -p 9092:9092 --name kafka --hostname kafka --env ADVERTISED_HOST=kafka --env ADVERTISED_PORT=9092 spotify/kafka

docker exec -it kafka /bin/bash

$KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic example

$KAFKA_HOME/bin/kafka-topics.sh --list --zookeeper localhost:2181

$KAFKA_HOME/bin/kafka-console-producer.sh --broker-list kafka:9092 --topic example

$KAFKA_HOME/bin/kafka-console-consumer.sh --bootstrap-server kafka:9092 --topic example --from-beginning

Cliente Python

apt-get install python3 python3-dev python3-pip vim
pip3 install kafka-python
from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers='kafka:9092')
producer.send('example', b'hello from python')

Kafka Streams

A comunicación tradicional (sistemas acoplados)

Fullfilment

Basada en eventos

Fullfilment Events Based

Fluxo de negocio con streams

Streams with Kafka

Streams

KStream<String,Purchase> purchaseKStream =
kStreamBuilder.stream(stringSerde,purchaseSerde,"orders")
.mapValues(p -> Purchase.builder(p).maskCreditCard().build())
.to(stringSerde, purchasePatternSerde, "shipments");

Fonte

Resumo

  • Apache Kafka é doado e aporta vantaxes dende o primeiro minuto.

  • Kafka Streams habilitan unha nova arquitectura que terá moito éxito.

  • Moi útil para temas de IoT.

¡Gracias!