-
Notifications
You must be signed in to change notification settings - Fork 1
Kafka broker C++ clone
License
axelberardino/mykafka
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
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 0
No packages published