VT2018 Kafka

=Auteur=
 * Nom : Timothée depriester
 * Sujet : Kafka

=Résumé=

Apache Kafka est une plateforme de streaming distribuée. Cette technologie permet de servir de tampon dans un système d'envoi et réception de messages, de sauvegarder ces informations de façon durable et de pouvoir les traiter à la volée.

C'est une technologie à haute performance et permettant une distribution horizontale très élevé.

L'utilisation d'un système tel que Kafka permettra d'avoir un système de message plus cohérent, fiable et évoluable.

=Abstract=

Apache Kafka is a distributed streaming platform. This technology manage to publish and subscrib to stream of records, to keep this records safe and substainable, and to compute them on the fly.

It's a powerfull technology allowing high horizontal scalability.

Usage of a technology such as Kafka will allow you to keep your system more relaible and adaptable.

=Synthèse=

Kafka est utilisé par des entreprises à très grande échelle avec des niveaux de performance très élevé. Par exemple, des entreprises tels que Linkedin ou Netflix y font transiter plus d'un trillion de messages par jour.

Il permet de centraliser tous les envois de messages à travers un seul système, cela permet une plus grande modularité et c'est primordial pour un système d'information de grande envergure. Kafka est différent de ses concurrents tel que RabbitMQ puisqu'il permet de stocker les messages pour une grande période de temps: que vous manipuliez 50kB ou 50 Tb, les performances seront les mêmes alors que RabbitMQ (ou autres) auront du mal si les données ne sont pas gérées en temps réel. C'est d'ailleurs pour cela que Kafka peut être utilisé comme une base de données. On peut citer par exemple l'offre DBAAS de OVH reposant sur la technologie Kafka.

APIs


Kafka nous fournis 4 APIs majeurs:

Les APIs Productor et Consommator qui permettent de fournir et consulter les données dans le système Kafka.

L'API Connector permettant de relier le système Kafka à d'autres services tel que des base de données.

L'API Stream permettant de traiter certaines informations envoyées dans le système Kafka (Agrégation, filtrage, calcul, ...).

Ces API sont utilisables dans une majorité des langages les plus courants (Java, Scala, Go, Python, ...)

Système de topic


Les données dans Kafka sont sauvegardé dans ce que l'on appelle des topics. C'est une représentation abstraite de comment est sauvegarder la donnée. Cette donnée est ensuite partitionné (de 1 à n partitions) ce qui permet de paralléliser les écritures sur un topic et de découper les données. Un topic peut être éparpillé sur plusieurs machines (logique ou physique), la seule contrainte est qu'une partition ne doit pas être découpé. Ensuite c'est l'une des machines qui devient leader sur cette partition et qui s'occupe de gérer les demandes d'écritures, les autres sont des followers.

Lors de l'insertion d'un nouveau record (d'une donnée), Kafka y ajoute des métadonnées (offset: numéro dans la file, temps, persistance, ...) et est ajouter à l'un des partitions du topic selon un pattern spécifié (algorithme basique de round robin ou trié selon la donnée).

Le fait que Kafka persiste les données et ajoute un offset n'oblige pas à travailler en temps réel (bien que Kafka soit aussi très adapté au temps réel) et permet aussi de pouvoir totalement rejouer les états d'une application grace à la sauvegarde de toutes les opérations.

Garantie
Kafka permet une réplication configurable de toutes les données.

Kafka permet de prendre en compte la géo-localisation pour optimiser les temps d'accès.

Kafka garantie un ordre, c'est à dire que si un producteur P1 envoi un message M1 sur le topic T1 et qu'ensuite il envoit un message M2 sur le même topic, l'offset du message M1 sera strictement inférieur à celui du message M2.

Démonstation
On va utiliser le quickstart proposé par Kafka qui est très bien réalisé.

https://kafka.apache.org/quickstart

Références
https://cwiki.apache.org/confluence/display/KAFKA/Kafka+papers+and+presentations

https://kafka.apache.org

https://github.com/apache/kafka/blob/2.1/streams/examples/src/main/java/org/apache/kafka/streams/examples/wordcount/WordCountDemo.java

http://confluent.io/product/

https://hackernoon.com/distributed-log-analytics-using-apache-kafka-kafka-connect-and-fluentd-303330e478af