Synthèse automatique
Cette compétence explique comment mettre en place Apache Kafka et écrire des producteurs et consommateurs pour des architectures événementielles.
Points forts
- Fournit une configuration Docker Compose prête à l'emploi en mode KRaft, sans ZooKeeper.
- Montre des exemples concrets de producteur et de consommateur en Node.js/TypeScript, avec clés de partition et arrêt propre.
- Ajoute un exemple de consommateur Python avec confluent-kafka.
- Rappelle les bonnes pratiques : clés de partition, groupes de consommateurs et idempotence.
Limites
- Les extraits restent squelettiques : certaines fonctions ou variables comme processOrder et events sont supposées définies, et la gestion d'erreurs est minimale.
- Ne couvre pas les sujets de production comme le Schema Registry, la sécurité/TLS, l'exactly-once ou la supervision des topics.
- Utilise l'image bitnami/kafka:latest, qui peut évoluer et casser la configuration au fil du temps.
À utiliser lorsqu'il faut démarrer rapidement un projet Kafka local ou illustrer un flux producteur/consommateur pour du streaming d'événements.
À éviter si l'on cherche une architecture de production complète avec sécurité, schémas et exploitation opérationnelle déjà détaillés.
Analyse de sécurité
PrudenceThe skill is an instructional guide with docker-compose and producer/consumer code snippets. Nothing is destructive or exfiltrating — no curl|sh, no credential handling, no base64 payloads, no safety bypass. The only real risk surface is that an agent may actually run `docker compose up` to pull and start a third-party broker image (tagged `latest`, so unpinned) and expose localhost ports, which is a legitimate but powerful action, hence caution rather than safe.
- •Runs Docker containers and opens a network broker port (9092/9093) via docker-compose, which is legitimate for local Kafka but is a powerful action the agent may execute on the user's machine
- •Uses unpinned image tag `bitnami/kafka:latest`, which makes builds non-reproducible and carries supply-chain drift risk
- •No destructive, exfiltration, or obfuscated commands; all code samples are straightforward producer/consumer logic
Exemples
Set up a local Kafka broker with Docker Compose in KRaft mode and write a Node.js producer that publishes order events keyed by order ID.Write an idempotent Kafka consumer in TypeScript in the order-service group that handles order events and shuts down gracefully on SIGTERM.Show a Python confluent-kafka consumer reading the orders topic from the earliest offset and logging each order.name: kafka description: >- Build event-driven systems with Apache Kafka. Use when a user asks to set up message streaming, implement event sourcing, build pub/sub systems, process real-time data streams, or connect microservices with async messaging. license: Apache-2.0 compatibility: 'Any language (Node.js, Python, Java, Go)' metadata: author: terminal-skills version: 1.0.0 category: data-ai tags: - kafka - streaming - events - messaging - microservices
Apache Kafka
Overview
Kafka is a distributed event streaming platform for high-throughput, fault-tolerant messaging. It's the backbone of event-driven architectures — used for real-time data pipelines, event sourcing, log aggregation, and microservice communication.
Instructions
Step 1: Local Setup
# docker-compose.yml — Kafka with KRaft (no ZooKeeper)
services:
kafka:
image: bitnami/kafka:latest
ports:
- "9092:9092"
environment:
KAFKA_CFG_NODE_ID: 1
KAFKA_CFG_PROCESS_ROLES: broker,controller
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
Step 2: Node.js Producer
// producer.ts — Send events to Kafka
import { Kafka, Partitioners } from 'kafkajs'
const kafka = new Kafka({ brokers: ['localhost:9092'] })
const producer = kafka.producer({ createPartitioner: Partitioners.DefaultPartitioner })
await producer.connect()
// Send single event
await producer.send({
topic: 'orders',
messages: [
{
key: 'order-123', // partition key (orders for same user go to same partition)
value: JSON.stringify({
orderId: 'order-123',
userId: 'user-456',
items: [{ sku: 'WIDGET-1', quantity: 2, price: 29.99 }],
total: 59.98,
createdAt: new Date().toISOString(),
}),
},
],
})
// Batch send
await producer.sendBatch({
topicMessages: [
{ topic: 'orders', messages: events.map(e => ({ key: e.id, value: JSON.stringify(e) })) },
],
})
await producer.disconnect()
Step 3: Consumer
// consumer.ts — Process events from Kafka
const consumer = kafka.consumer({ groupId: 'order-service' })
await consumer.connect()
await consumer.subscribe({ topic: 'orders', fromBeginning: false })
await consumer.run({
eachMessage: async ({ topic, partition, message }) => {
const order = JSON.parse(message.value.toString())
console.log(`Processing order ${order.orderId} from partition ${partition}`)
// Process the order (idempotently — messages can be redelivered)
await processOrder(order)
},
})
// Graceful shutdown
process.on('SIGTERM', async () => {
await consumer.disconnect()
})
Step 4: Python Consumer
# consumer.py — Kafka consumer with confluent-kafka
from confluent_kafka import Consumer
conf = {
'bootstrap.servers': 'localhost:9092',
'group.id': 'analytics-service',
'auto.offset.reset': 'earliest',
}
consumer = Consumer(conf)
consumer.subscribe(['orders'])
while True:
msg = consumer.poll(1.0)
if msg is None:
continue
if msg.error():
print(f"Error: {msg.error()}")
continue
order = json.loads(msg.value().decode('utf-8'))
print(f"Processing: {order['orderId']}")
Guidelines
- Use partition keys to ensure related events go to the same partition (ordering guarantee).
- Consumer groups enable parallel processing — each partition is consumed by one consumer in the group.
- Make consumers idempotent — Kafka guarantees at-least-once delivery by default.
- For managed Kafka: Confluent Cloud, AWS MSK, or Redpanda (Kafka-compatible, simpler).
- KRaft mode (no ZooKeeper) is production-ready since Kafka 3.3+.
Specification Design-to-Dev
Developpement
Traduisez vos maquettes en specifications techniques pour les developpeurs.
Patterns d'exports et fichiers barrel
Developpement
Définit les conventions pour les exports de modules et les fichiers baril : exports nommés uniquement, pas de wildcards plats (sauf `export * as Name` pour les composants composés), commentaires par section, types exportés avec les valeurs, et une ligne d'export par fichier source. Aide à maintenir des exports cohérents et optimisés pour le tree-shaking dans les applications portal utilisant Turbopack ou des bundlers similaires.
Créer une compétence d'agent
Developpement
Guide étape par étape pour créer une compétence d'agent structurée, incluant structure de répertoire, format SKILL.md et principes de conception.