Skip to content

axelberardino/mykafka

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

98 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MyKafka - Kafka broker C++ clone

mykafka est un équivalent en C++ d'un broker Kafka. Il permet l'écriture et
la lecture de data. Ce composant gère:
  * Le commit log (écriture par segment/index).
  * La suppression automatique de segment par taille de partition ou par ttl.
  * La création et la suppression de topic et de partitions.
  * L'envoi et la réception de données via rpc.


DÉPENDANCES

Un compilateur compatible c++11
Grpc 1.3.x
Protobuf 3
Boost 1.55
Doxygen, LaTeX (pour la génération de la documentation uniquement)

Le script install-deps.sh peut aider à l'installation de des composants
nécessaires. (Attention "texlive-full" est très gros et n'est nécessaire
que pour la génération de doc)


BUILD

Pour construire le projet, un simple:

$ make


TEST

Des tests unitaires peuvent être joués via:

$ make test

Certains tests peuvent échouer si le nombre autorisé de fichier ouvert
est trop faible !

$ sudo ulimit -n 65535


BENCH

Quelques benchmarks sont disponibles via:

$ make bench


DEMO

Une démo de différents scénarii peut être lancée via:

$ make demo


DOCUMENTATION

Le code est documenté au format doxygen. Celle-ci peut être générée via:

$ make doc


BINAIRES

mykafka-broker: Le serveur de r"ception.
mykafka-ctl: Un outil pour administrer un broker.
mykafka-producer: Permet d'envoyer des messages vers un broker.
mykafka-consumer: Permet de réceptionner des messages depuis un broker.


API

SendMessage
  Permet d'envoyer un message vers un broker.
  Entrée:
    * Le topic
    * La partition
    * Le contenu du message
  Réception:
    * Un code erreur + message
    * L'offset où a été écrit le message

GetMessage
  Permet de recevoir un message depuis un broker.
  Entrée:
    * Le topic
    * La partition
    * L'offset où commencer à lire
  Réception:
    * Un code erreur + message
    * Un message binaire

GetOffsets
  Permet de recevoir des informations sur les offsets d'une partition.
  Entrée:
    * Le topic
    * La partition
  Réception:
    * Un code erreur + message
    * Le premier offset de la partition
    * Le dernier offset valide (commit)
    * Le dernier offset de la partition
À noter que le commit offset est toujours égale au dernier offset (il
n'y pas de réplication)

CreatePartition
  Créer un partition.
  Entrée:
    * Le topic
    * La partition
    * [Optionnel] La taille d'un segment (par défaut 4 Ko)
    * [Optionnel] La taille maximal d'une partition
    * [Optionnel] Le ttl d'un segment
  Réception:
    * Un code erreur + message

DeletePartition
  Supprimer une partition existante.
  Entrée:
    * Le topic
    * La partition
  Réception:
    * Un code erreur + message

DeleteTopic
  Supprimer un topic entier.
  Entrée:
    * Le topic
  Réception:
    * Un code erreur + message

BrokerInfo
  Récupère des informations sur un broker (liste
  des partitions, configurations, offsets, ...)
  Entrée:
    Pas d'entrée
  Réception:
    * Un code erreur + message
    * Un message textuel pré-formaté


EXPLICATION TECHNIQUE

CommitLog - Segment.

Un segment est l'association de deux fichiers: un index et un fichier binaire
de log.

L'index est constitué d'une suite d'offset + position. L'offset représente
l'identifiant d'une entrée, et la position représente sa position physique
dans le fichier de log. Ce fichier de log est mmap'é (et pré-alloué à 10 Mo),
ce qui permet de faire des recherches rapides (notamment une recherche par
dichotomie).

Le fichier de log est un fichier binaire classique contenant une suite
d'entrées sous la forme: offset, position, taille du message, message.

Exemple d'un segment:
     001.index                       001.log
 offset, position        offset, position, size, payload
      0,        0             0,        0,    5, "first"
      1,        5             1,        5,    4, "test"
      2,        9             2,        9,   20, "{my_payload:content}"
      3,       29             3,       29,    2, "xx"

Les fichiers sont nommés de la façon suivante:
  * <nombre de 20 chiffres>.index
  * <nombre de 20 chiffres>.log


Partition

Physiquement, une partition est un dossier contenant des segments. Le nom des
fichiers contiennent leur premier offset, ce qui permet de retrouver les
données à partir d'un offset donné.
Une partition possède un "active segment", c'est-à-dire un pointeur vers le
dernier segment disponible. Lorsqu'un segment devient trop gros, on en créer
un nouveau. Les anciens segments sont supprimés uniquement si une taille
maximale de partition, où une durée de vie ont été précisés lors de la création
de celle-ci.


Topic

Un topic est simplement un prefix accolé au numéro de partition.

Exemple:
  events-0
  library-34

Une suppression de topic consiste à supprimer toutes les partitions préfixées
par le nom du topic.


Broker

Le broker possède une liste de partitions auquel il associe des fichiers de
configurations.

Une partition est associée à un fichier de configuration binaire. Celui-ci
est mmap'é et fait exactement 32 octets (4 * int64). Ce fichier de
configuration possède: la taille d'un segment, la taille maximale d'une
partition, le ttl d'un segment, et le dernier offset valide de la partition.

Exemple:
Topic:bookstore
        partition 0:
            max_segment_size: 4096
            max_partition_size: 0
            segment_ttl: 0
            first_offset: 500
            next_offset: 456672
            commit_offset: 456652
        partition 1:
            max_segment_size: 1024
            max_partition_size: 4096
            segment_ttl: 2 // sec
            first_offset: 600
            next_offset: 456542
            commit_offset: 456438
Topic:events
  etc...

Ce broker échange des données via grpc.

About

Kafka broker C++ clone

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published