Travailler avec Kafka en Go (Golang) avec la bibliothèque segmentio/kafka-go
\n\nApache Kafka est une plateforme distribuée de streaming de données, devenue le standard de facto pour la construction de systèmes d'échange de messages à forte charge. Lors du développement en Go (Golang), l'une des bibliothèques les plus populaires et fiables pour interagir avec Kafka est segmentio/kafka-go. Dans cet article, nous allons détailler comment installer, configurer et utiliser cette bibliothèque pour créer des producteurs et des consommateurs.
\n\nPourquoi segmentio/kafka-go ?
\n\nIl existe plusieurs bibliothèques Go pour Kafka sur le marché (par exemple, Sarama et Confluent Go Client). segmentio/kafka-go se distingue par les avantages suivants :
- \n
- Go pur — ne nécessite pas de dépendances C (contrairement à Confluent), ce qui simplifie la compilation et le déploiement. \n
- Prise en charge du protocole Kafka v2 — compression efficace, traitement par lots et gestion des transactions. \n
- API simple — interfaces intuitives pour les producteurs, les consommateurs et l'administration des topics. \n
- Communauté active — mises à jour régulières et bonne documentation. \n
Installation de la bibliothèque
\n\nPour commencer, ajoutez la bibliothèque à votre projet via go get :
go get github.com/segmentio/kafka-go\n\nAssurez-vous d'avoir une instance Kafka en cours d'exécution (localement ou via Docker). Exemple de configuration minimale avec Docker Compose :
\n\nversion: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n environment:\n ZOOKEEPER_CLIENT_PORT: 2181\n kafka:\n image: confluentinc/cp-kafka:latest\n depends_on:\n - zookeeper\n ports:\n - "9092:9092"\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181\n KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092\n\nCréation d'un producteur (Producer)
\n\nLe producteur envoie des messages dans un topic Kafka. Voici un exemple de base :
\n\npackage main\n\nimport (\n "context"\n "fmt"\n "log"\n "time"\n\n "github.com/segmentio/kafka-go"\n)\n\nfunc main() {\n // Configuration du producteur\n writer := &kafka.Writer{\n Addr: kafka.TCP("localhost:9092"),\n Topic: "test-topic",\n Balancer: &kafka.LeastBytes{}, // Équilibrage basé sur la taille du message\n BatchSize: 10, // Envoyer un lot de 10 messages\n BatchTimeout: 100 * time.Millisecond,\n }\n defer writer.Close()\n\n // Envoi d'un message\n err := writer.WriteMessages(context.Background(),\n kafka.Message{\n Key: []byte("key-1"),\n Value: []byte("Bonjour, Kafka depuis Go!"),\n },\n )\n if err != nil {\n log.Fatal("Erreur d'envoi du message :", err)\n }\n\n fmt.Println("Message envoyé avec succès")\n}\n\nParamètres clés de kafka.Writer :
- \n
Addr— adresse du broker Kafka. \n Topic— nom du topic. \n Balancer— stratégie de répartition des messages entre les partitions (LeastBytes, RoundRobin, Hash). \n BatchSizeetBatchTimeout— optimisation des performances. \n
Création d'un consommateur (Consumer)
\n\nLe consommateur lit les messages d'un topic. Exemple simple avec gestion manuelle des offsets :
\n\npackage main\n\nimport (\n "context"\n "fmt"\n "log"\n\n "github.com/segmentio/kafka-go"\n)\n\nfunc main() {\n // Configuration du lecteur (consommateur)\n reader := kafka.NewReader(kafka.ReaderConfig{\n Brokers: []string{"localhost:9092"},\n Topic: "test-topic",\n GroupID: "my-consumer-group",\n MinBytes: 10, // Taille minimale du lot\n MaxBytes: 10e6, // 10 MB\n StartOffset: kafka.FirstOffset, // Com Aussi dans la bibliothèque
Mise en cache en TypeScript : Redis, Memcached et solutions en mémoire
Ktor pour Kotlin : guide complet avec exemples
Configuration des applications JavaScript (Node.js) : bibliothèques dotenv, convict, nconf