2. Qu’est-ce que Kafka ?
Les concepts et l’architecture
Structure et distribution des messages
La tolérance à la panne
La consommation des messages
Les nouvelles APIs
Kafka Connect et Kafka Streams
(PIZZAS)
Comment développer avec les APIs Clients ?
API Producer
API Consumer
4. Kafka est un projet créé à l’origine chez
Open-source en 2011
Broker
Broker
Broker
Producer
Producer
Producer
Consumer
Consumer
Consumer
Publish Subscribe
Cluster
Distribué
Hautement scalable
Durable
Tolérant à la panne
Un simple système de messages
5. Spécification
3 machines : « commodity hardware »
Intel Xeon 2.5 GHz processor with six cores
Six 7200 RPM SATA drives (JBOD)
32GB of RAM
1Gb Ethernet
Scenario (message = 100 octets)
Three producers, 3x async replication
2,024,032 records/sec (193.0 MB/sec)
O(1)
6. Fast Writes
Toutes les écritures sont mises dans le page-cache (c.à.d RAM)
Zero-Copy
Evite les copies redondantes de données entre des buffers intermédiaires
Réduit les context-swithes entre Kernel et Application.
API Java NIO (java.nio.channels.FileChannel)
transferTo() transfert des données depuis un fichier vers une socket
Unix – sendfile()
7. Construction de data pipelines à très faible latence
Log delivery, collection processing
Data integration
Activity stream, Data pipeline
Real-Time monitoring / Event Tracking
8. Kafka Core
Le système de messagerie distribué
Kafka Client
API Clients pour publier / consommer des messages (Java, C++, Go, etc)
Kafka Connect
API pour connecter des systèmes à Kafka en tant que Source ou Sink
Kafka Stream
Framework pour développer des applications data-driven / realtime stream processing
11. • Un Producer produit des messages vers un Topic
• Un ou plusieurs Consumers s’abonnent à un topic pour lire les messages
Nouveaux messagesAnciens messages Temps
Producer
Consumer Consumer
Append-Only
K1
V1
K2
V2
null
V4
K1
V5
null
V7
K5
V8
K2
V10
Clé
Valeur
K2
V10
K1
V3
K5
V9
Write-ahead Log
22. Broker 1 Broker 2 Broker 3
P0
R1
P0
R2
P0
R3
ISR (in-sync replicas) = [1, 2, 3]
Producer
Acknowledgment
request.required.acks
0 : Le Producer n’attend aucun acquittement
de la part du leader.
? ? ?
23. Broker 1 Broker 2 Broker 3
P0
R1
P0
R2
P0
R3
ISR (in-sync replicas) = [1, 2, 3]
Producer
Acknowledgment
request.required.acks
1 : Le leader garantit avoir écrit le message
? ?
24. Broker 1 Broker 2 Broker 3
P0
R1
P0
R2
P0
R3
ISR (in-sync replicas) = [1, 2]
Producer
Acknowledgment
request.required.acks
all : Le leader attend d’avoir reçu un acquittement
de la part de tous les in-sync réplicas.
1
2
3 Out-of-Sync
Down
?
25. min.insync.replicas
Nombre minimum de réplicas qui doivent acquitter un message lorsque
request.required.acks = -1 (all)
Compromis entre
Disponibilité et Consistance
Configuration possible
replication_factor = 3; request.required.acks = all; min.insync.replicas=2
27. Apache ZooKeeper
Métadonnées sur les Leaders et réplicas
In-sync replicas: réplicas éligiblent à devenir leader
Controller
Détecte les erreurs au niveau broker
Sélectionne les leaders pour toutes les partitions
29. Topic : User_Activity
Partition 0
Partition 1
Partition 2
0 1 3 4
Consumer 10 1 2 4
0 2 3 4
5 6
5
Consumer 1
Consumer 2
2
3
1
• Un offset est un identifiant unique et incrémental par partition
• Un message est identifié par le triplet : Topic / Partition / Offset
30. • Les offsets des consumers sont stockés dans un topic système
• Si aucune position, 2 stratégies possibles : Earliest ou Latest
0 1 2 3 4 42 44 45 4643
Current Position
Last Committed Offset High Watermark
Log End Offset
Producer
Append-Only
31. Topic : User_Activity
Partition 0
Partition 1
Partition 2
0 1 3 4
Consumer 10 1 2 4
0 2 3
5 6
5
2
3
1
Consumer 1
Consumer 2
Consumer 3
Consumer 1
Consumer 2
Consumer Group Vert
Consumer Group Bleu
• Une partition est assignée automatiquement à un unique consumer au sein d’un groupe
• Plusieurs groupes peuvent souscrire à un même topic
4
32. Topic : User_Activity
Partition 0
Partition 1
Partition 2
0 1 3 4
Consumer 10 1 2 4
0 2 3
5 6
5
2
3
1
Consumer 1
Consumer 2
Consumer Group Vert
Consumer 3
• Les consumers se coordonnent automatiquement pour se distribuer les partitions.
• Le nombre de partitions définit le niveau de parallélisme maximum pour consommer un topic
• Il n’est pas possible de définir plus de consumers que de partitions
4
34. Topic : User_Activity
Partition 0
Partition 1
Partition 2
0 1 3 4
Consumer 10 1 2 4
0 2 3
5 6
5
2
3
1
Consumer 1
Consumer 2
Consumer Group Vert
Consumer 3
La partition est automatiquement
réassignée à l’un des consumers4
35. Topic : User_Activity
Partition 0
Partition 1
Partition 2
0 1 3 4
Consumer 10 1 2 4
0 2 3
5 6
5
2
3
1
Consumer 1
Consumer 2
Consumer Group Vert
Consumer 3
Partition 3 0 2 3 4 51
• La nouvelle partition est assignée à un
des consumers
4
36. • Les messages sont stockés dans l’ordre dans lequel ils sont produits
• L’ordre de lecture des messages est garanti uniquement par partition
• En cas de panne, certains messages peuvent-être produits ou
consommés plusieurs fois (At-Least Once)
0 2 3 4
Consumer v1
Last Committed Offset
Consomme et commit le message à l’Offset 1
1
37. • Les messages sont stockés dans l’ordre dans lequel ils sont produits
• L’ordre de lecture des messages est garanti uniquement par partition
• En cas de panne, certains messages peuvent-être produits ou
consommés plusieurs fois (At-Least Once)
0 1 3 4
Consumer v1
Last Committed Offset
Se déplace à l’offset 2
2
38. • Les messages sont stockés dans l’ordre dans lequel ils sont produits
• L’ordre de lecture des messages est garanti uniquement par partition
• En cas de panne, certains messages peuvent-être produits ou
consommés plusieurs fois (At-Least Once)
0 1 3 4
Consumer v1
Last Committed Offset
Crash
2
39. • Les messages sont stockés dans l’ordre dans lequel ils sont produit
• L’ordre de lecture des messages est garanti uniquement par partition
• En cas de panne, certains messages peuvent-être produits ou
consommés plusieurs fois (At-Least Once)
0 3 4
Consumer v2
Last Committed Offset
21
Re-consomme le message à l’Offset 2 (doublon)