DEV Community

Alex Spinov
Alex Spinov

Posted on

Redpanda Has a Free API — Kafka Without the JVM

Redpanda is the Kafka-compatible streaming platform written in C++ — 10x faster, no JVM, no ZooKeeper, single binary deployment. And the free tier handles production workloads.

Why Redpanda Over Kafka?

Kafka requires Java, ZooKeeper (or KRaft), and complex tuning. Redpanda:

  • 10x lower latency — p99 < 10ms vs Kafka's 100ms+
  • No JVM — written in C++, thread-per-core architecture
  • No ZooKeeper — built-in Raft consensus
  • Single binary — one process, no dependencies
  • Kafka API compatible — use your existing Kafka clients
  • Built-in Schema Registry — no separate Confluent service
  • Built-in HTTP Proxy — produce/consume via REST

Quick Start

# Docker (single node)
docker run -d --name redpanda \
  -p 9092:9092 \
  -p 8081:8081 \
  -p 8082:8082 \
  -p 9644:9644 \
  docker.redpanda.com/redpandadata/redpanda:latest \
  redpanda start --smp 1 --memory 1G --overprovisioned

# Create a topic
docker exec -it redpanda rpk topic create events --partitions 3

# List topics
docker exec -it redpanda rpk topic list
Enter fullscreen mode Exit fullscreen mode

Produce Messages (Kafka Client — Works As-Is)

import { Kafka } from "kafkajs";

const kafka = new Kafka({
  clientId: "my-app",
  brokers: ["localhost:9092"], // Redpanda, not Kafka!
});

const producer = kafka.producer();
await producer.connect();

// Send events
await producer.send({
  topic: "user-events",
  messages: [
    {
      key: "user-123",
      value: JSON.stringify({
        type: "page_view",
        page: "/pricing",
        timestamp: Date.now(),
      }),
    },
    {
      key: "user-456",
      value: JSON.stringify({
        type: "signup",
        plan: "pro",
        timestamp: Date.now(),
      }),
    },
  ],
});

console.log("Events sent to Redpanda");
await producer.disconnect();
Enter fullscreen mode Exit fullscreen mode

Consume Messages (Stream Processing)

const consumer = kafka.consumer({ groupId: "analytics-service" });
await consumer.connect();
await consumer.subscribe({ topic: "user-events", fromBeginning: true });

await consumer.run({
  eachMessage: async ({ topic, partition, message }) => {
    const event = JSON.parse(message.value.toString());

    switch (event.type) {
      case "page_view":
        console.log(`User viewed ${event.page}`);
        // Update analytics
        break;
      case "signup":
        console.log(`New signup: ${event.plan} plan`);
        // Trigger welcome email
        break;
      case "purchase":
        console.log(`Purchase: $${event.amount}`);
        // Process payment
        break;
    }
  },
});
Enter fullscreen mode Exit fullscreen mode

HTTP Proxy (No Client Library Needed!)


bash
# Produce via HTTP
curl -s -X POST http://localhost:8082/topics/events \
  -H "Content-Type: application/vnd.kafka.json.v2+json" \
  -d {
Enter fullscreen mode Exit fullscreen mode

Top comments (0)