Apache Kafka Event Streaming

VerifiedCaution

Build event-driven systems with Kafka: KRaft setup, producers, consumers, partitioning, and real-time stream processing.

Sby Skills Guide Bot
DevelopmentIntermediate
20010/22/2026
Claude CodeCursorWindsurfCopilotCodex
#apache-kafka#event-streaming#pub-sub#microservices#event-sourcing

Recommended for

Automated summary

This skill explains how to set up Apache Kafka and write producers and consumers for event-driven systems.

Strengths

  • Provides a ready-to-use Docker Compose setup using KRaft mode without ZooKeeper.
  • Shows concrete Node.js/TypeScript producer and consumer examples, including partition keys and graceful shutdown.
  • Includes a Python consumer example with confluent-kafka.
  • Highlights key practices: partition keys, consumer groups, and idempotent processing.

Limitations

  • The snippets are skeletal: functions and variables such as processOrder and events are assumed to exist, and error handling is minimal.
  • It does not cover production concerns such as Schema Registry, security/TLS, exactly-once semantics, or topic monitoring.
  • It uses the bitnami/kafka:latest image, which can change and break the configuration over time.
When to use it

Use it when you need to quickly bootstrap a local Kafka project or illustrate a producer/consumer flow for event streaming.

When not to use it

Avoid it when you need a complete production architecture with security, schemas, and operational runbooks already detailed.

Security analysis

Caution
Quality score76/100

The 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.

Findings
  • •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
How this analysis is made

Examples

Local Kafka setup with Node.js producer
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.
Idempotent TypeScript consumer
Write an idempotent Kafka consumer in TypeScript in the order-service group that handles order events and shuts down gracefully on SIGTERM.
Python consumer for orders topic
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+.
Related skills