Skip to content
Back to skills

Data Kafka Patterns

ASecurity

Patterns Apache Kafka — topics, partitions, consumer groups, exactly-once semantics et Kafka Streams. Se déclenche avec "Kafka", "Apache Kafka", "topic Kafka", "consumer group", "Kafka Streams", "event streaming". Also triggers on "Kafka topics", "exactly-once processing".

  • 27 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 18, 2026
ai-agentsjavabashsqldatabase

Works with

  • cli

Security analysis

A100/100

Scanned October 18, 2026

npx -y skills add khalilbenaz/claude-skills-collection --skill data-kafka-patterns --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Data Kafka Patterns?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Data Kafka Patterns
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/khalilbenaz-data-kafka-patterns/badge)](https://www.skillsdirectory.com/skills/khalilbenaz-data-kafka-patterns)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: data-kafka-patterns
description: Patterns Apache Kafka — topics, partitions, consumer groups, exactly-once semantics et Kafka Streams. Se déclenche avec "Kafka", "Apache Kafka", "topic Kafka", "consumer group", "Kafka Streams", "event streaming". Also triggers on "Kafka topics", "exactly-once processing".
---

# Kafka Patterns

## Workflow

### 1. Concevoir la topologie des topics

- Nommer les topics par domaine + type d'événement : `orders.created`, `payments.processed`, `inventory.updated`
- **Calcul des partitions** : `partitions = débit_cible_MB/s ÷ débit_par_partition_MB/s` (typiquement 10–20 MB/s par partition)
- Règle pratique : commencer avec `max(producteurs_parallèles, consommateurs_parallèles)` partitions
- Rétention selon le cas : time-based (`retention.ms=604800000` = 7j), size-based (`retention.bytes`), ou compaction pour les changelogs (KTable)

```bash
# Créer un topic avec 12 partitions, réplication 3, rétention 7 jours
kafka-topics.sh --bootstrap-server broker:9092 \
  --create --topic orders.created \
  --partitions 12 --replication-factor 3 \
  --config retention.ms=604800000

# Lister / décrire
kafka-topics.sh --bootstrap-server broker:9092 --describe --topic orders.created
```

### 2. Définir le schéma des messages

- Avro (compact, Schema Registry natif) > Protobuf > JSON Schema selon l'éco-système
- Enregistrer dans Confluent Schema Registry avec compatibilité `BACKWARD` par défaut
- Inclure les champs obligatoires : `event_id` (UUID), `event_type`, `occurred_at` (ISO-8601), `source`, `correlation_id`

```json
// Avro schema — orders.created
{
  "type": "record",
  "name": "OrderCreated",
  "namespace": "com.example.orders",
  "fields": [
    {"name": "event_id", "type": "string"},
    {"name": "order_id", "type": "string"},
    {"name": "customer_id", "type": "string"},
    {"name": "amount_cents", "type": "long"},
    {"name": "occurred_at", "type": {"type": "long", "logicalType": "timestamp-millis"}}
  ]
}
```

### 3. Configurer les producers

Choisir les garanties selon le besoin :

| Cas | `acks` | `enable.idempotence` | `transactional.id` |
|-----|--------|----------------------|--------------------|
| Fire-and-forget (logs) | `0` | false | — |
| At-least-once (défaut) | `all` | false | — |
| Exactly-once | `all` | true | `txn-{service}-{instance}` |

```java
// Producer Java — exactly-once
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "broker:9092");
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);
props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "txn-orders-1");
props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "lz4");
props.put(ProducerConfig.LINGER_MS_CONFIG, 5);        // batching
props.put(ProducerConfig.BATCH_SIZE_CONFIG, 65536);   // 64 KB

KafkaProducer<String, OrderCreated> producer = new KafkaProducer<>(props);
producer.initTransactions();

producer.beginTransaction();
producer.send(new ProducerRecord<>("orders.created", order.getId(), event));
producer.commitTransaction();
```

### 4. Concevoir les consumer groups

- Un consumer group par cas d'usage logique (pas par microservice)
- Commit offset **après** traitement réussi, jamais avant
- `max.poll.records` : réduire si le traitement par batch est lent (défaut 500)
- `session.timeout.ms` > temps max de traitement d'un batch

```java
// Consumer Java — commit manuel
props.put(ConsumerConfig.GROUP_ID_CONFIG, "orders-billing-service");
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 100);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");

while (true) {
    ConsumerRecords<String, OrderCreated> records = consumer.poll(Duration.ofMillis(500));
    for (ConsumerRecord<String, OrderCreated> record : records) {
        process(record.value());
    }
    consumer.commitSync(); // après traitement complet
}
```

### 5. Patterns de traitement distribué

**Dead Letter Topic (DLT)** — isoler les messages non traitables :
```
topic-principal → traitement → erreur → topic-principal.DLT
```

**Saga choreography** — chaque service publie des events, les autres réagissent :
```
orders.created → payment-service → payments.processed → inventory-service → inventory.reserved
                                 ↘ payments.failed   → orders.cancelled
```

**CDC avec Debezium** — capturer les changements base de données :
```json
// connector config (Postgres)
{
  "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
  "database.hostname": "postgres",
  "database.dbname": "mydb",
  "table.include.list": "public.orders",
  "topic.prefix": "cdc"
}
```

**Claim Check** — payload > 1 MB : stocker dans S3/Blob, publier seulement la référence :
```json
{"event_id": "...", "payload_ref": "s3://bucket/events/abc123.json"}
```

### 6. Kafka Streams — traitements stateful

```java
StreamsBuilder builder = new StreamsBuilder();

// Comptage par client sur fenêtre de 1h (hopping)
KStream<String, OrderCreated> orders = builder.stream("orders.created");
orders
  .groupByKey()
  .windowedBy(TimeWindows.ofSizeWithNoGrace(Duration.ofHours(1)))
  .count(Materialized.as("orders-per-customer"))
  .toStream()
  .to("orders.count-per-customer-1h");

// Stream-Table join
KTable<String, CustomerProfile> profiles = builder.table("customers.profiles");
orders.join(profiles,
    (order, profile) -> enrich(order, profile),
    Joined.with(Serdes.String(), orderSerde, profileSerde))
  .to("orders.enriched");
```

### 7. Exactly-once semantics (EOS)

Configuration minimale pour EOS dans Kafka Streams :

```java
props.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, StreamsConfig.EXACTLY_ONCE_V2);
props.put(StreamsConfig.REPLICATION_FACTOR_CONFIG, 3);
props.put(StreamsConfig.NUM_STANDBY_REPLICAS_CONFIG, 1);
```

Pour les consumers en boucle read-process-write :
- `isolation.level=read_committed` côté consumer
- Transactions produceur-consumer atomiques avec `sendOffsetsToTransaction()`

### 8. Monitoring & alertes

Métriques critiques à surveiller :

| Métrique | Outil | Seuil d'alerte |
|----------|-------|----------------|
| `kafka.consumer.lag` | JMX / Prometheus | > 10 000 msgs |
| `under-replicated-partitions` | Kafka MBean | > 0 |
| `records-error-rate` | Kafka MBean | > 0 |
| Latence end-to-end | OpenTelemetry | > SLA défini |

```bash
# Consumer lag via CLI
kafka-consumer-groups.sh --bootstrap-server broker:9092 \
  --describe --group orders-billing-service

# Reset offset en cas d'incident (dry-run)
kafka-consumer-groups.sh --bootstrap-server broker:9092 \
  --group orders-billing-service --topic orders.created \
  --reset-offsets --to-earliest --dry-run
```

## Critères de décision

| Besoin | Choix |
|--------|-------|
| Traitement stateless simple | Consumer KafkaConsumer |
| Aggregation / join / windowing | Kafka Streams ou ksqlDB |
| SQL déclaratif sur streams | ksqlDB |
| CDC depuis base relationnelle | Debezium + Kafka Connect |
| Garantie exactement-une-fois | EOS (`EXACTLY_ONCE_V2`) |
| Payload volumineux (> 1 MB) | Claim Check pattern |

## Garde-fous / Anti-patterns / Pièges

- **Ne pas réduire les partitions** : impossible sans recréer le topic ; sur-provisionner légèrement au départ.
- **Auto-commit activé + traitement lent** : risque de perte de messages si le consumer crash après commit mais avant traitement. Toujours `enable.auto.commit=false`.
- **Un seul topic pour tout** : casse l'isolation, le scaling et la rétention différenciée. Un topic par type d'événement.
- **Consumer group partagé entre envs** (dev/prod sur le même cluster) : les offsets se mélangent. Utiliser des clusters ou des `group.id` stricts par environnement.
- **Pas de DLT** : un message poison bloque tout le consumer group indéfiniment. Toujours prévoir `topic.DLT`.
- **Rebalancing fréquent** : souvent dû à `max.poll.interval.ms` trop court ou traitement trop lent. Augmenter `max.poll.interval.ms` ou réduire `max.poll.records`.
- **Schema sans compatibilité** : un changement de schéma casse les consumers existants. Toujours tester avec `kafka-schema-registry-test-compatibility`.
- **`acks=1` sur topics critiques** : perte de données si le leader crashe avant réplication. Utiliser `acks=all` + `min.insync.replicas=2`.


## Communication Rules — MANDATORY

- Ultra-concise. No filler, no preamble, no pleasantries.
- Never say "happy to help", "sure!", "great question", "let me", or similar.
- Tool first, talk second. Act before explaining.
- Result first. Lead with outcome, not process.
- Stop when done. No summary, no recap, no trailing commentary.
- No politeness wrappers. Direct and blunt.
- Minimum words. If one word works, do not use ten.
- No unsolicited explanations.
- No emoji unless asked.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.