Working with Spring Boot and Apache Kafka
12 mars 2025
7 min de lecture

La première fois que j'ai branché Kafka sur un service Spring Boot, j'ai perdu une demi-journée sur un problème de sérialisation Avro qui n'avait rien à voir avec Kafka lui-même. Voici ce que j'aurais aimé savoir avant de commencer.
Configurer le producer
@Bean
public ProducerFactory<String, OrderEvent> producerFactory() {
Map<String, Object> config = new HashMap<>();
config.put(BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
config.put(KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
config.put(VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
return new DefaultKafkaProducerFactory<>(config);
}Rien de spécial ici. Le vrai sujet arrive côté consumer, quand plusieurs instances du service tournent en parallèle.
Le piège des consumer groups
Si deux instances de ton service partagent le même group.id, Kafka répartit les partitions entre elles. C'est voulu pour scaler horizontalement, mais ça casse silencieusement l'ordre de traitement si ton use case en dépend.
- Un seul consumer par partition à un instant donné dans un même groupe
- L'ordre n'est garanti qu'à l'intérieur d'une partition, jamais entre partitions
- Choisis ta clé de partitionnement en fonction de ce qui doit rester ordonné (ex: orderId)
Si tu as besoin d'un ordre global strict, Kafka n'est probablement pas le bon outil pour cette partie du flux.