14-day local evaluation

Try KubeMQ with
your Kafka client.

Send a message. Read the same message back.
Use a stock Kafka client to test KubeMQ on your own machine.

See the Kafka test

A fresh standalone evaluation needs no signup. Starting it accepts the evaluation terms and includes required usage reporting.

Your Kafka clientkcat · no KubeMQ SDK
KubeMQKafka wire protocol
The same messageExact payload comparison

Before you start

Use a local test environment with Docker running and Python 3. The commands below use a macOS or Linux shell. The stock kcat client runs in a temporary Docker container, so no separate Kafka client installation is needed.

Ports 19092 and 18080 must be free. Apple Silicon requires x86-64 emulation in Docker. Outbound HTTPS to the KubeMQ image registry, Docker Hub and license.kubemq.io is required.

A real client. A specific result.

Prove the Kafka round trip.

Unique topic. Unique consumer group. One message checked byte for byte.

1

Start an isolated KubeMQ server

Use a fresh named volume and a unique container name. Management stays on 127.0.0.1:18080; the test client connects to 127.0.0.1:19092.

Show the Docker command
macOS / Linux · run in one terminal
export KMQ_DEMO_ID="kmq-kafka-$(python3 -c 'import uuid; print(uuid.uuid4().hex[:10])')"

docker run -d --pull always \
  --platform linux/amd64 \
  --name "$KMQ_DEMO_ID" --hostname kubemq \
  -p 127.0.0.1:18080:8080 \
  -p 127.0.0.1:19092:19092 \
  -e STORE_ENGINE=next \
  -e STORE_NEXT_ACK_POLICY=strict \
  -e STORE_STORE_PATH=/kubemq/store \
  -e API_BIND_ADDRESS=0.0.0.0 \
  -e CONNECTORS_KAFKA_PORT=19092 \
  -e CONNECTORS_KAFKA_ADVERTISED_HOST=127.0.0.1 \
  -e CONNECTORS_KAFKA_ADVERTISED_PORT=19092 \
  -v "$KMQ_DEMO_ID-data:/kubemq/store" \
  europe-docker.pkg.dev/kubemq/images/kubemq-next:v3.6.18

This requests strict acknowledgment and advertises Kafka on port 19092. The test client shares this isolated broker’s network namespace. A single node provides local disk synchronization, not protection through independent replicas.

Wait for the Kafka connector to accept connections before the next step. Keep this terminal open so the evaluation’s container name remains available.

2

Send, receive and compare

The script creates unique topic and group names, sends one message with acks=all, then reads from the beginning. It stops with an error on a timeout, failed command or mismatched payload.

Show the kcat round-trip script
Python 3 runs the stock kcat Docker image
python3 - <<'PYTHON'
import os
import subprocess
import sys
import uuid

container = os.environ.get("KMQ_DEMO_ID")
if not container:
    raise SystemExit("Use the same terminal as the Docker setup step.")
run_id = uuid.uuid4().hex
topic = "kubemq-eval-" + run_id
group = "kubemq-eval-group-" + run_id
message = "hello-kubemq-" + run_id
owned_clients = ["kmq-kafka-client-" + run_id + suffix
                 for suffix in ("-producer", "-consumer")]

def client(name):
    return ["docker", "run", "--rm", "--name", name,
            "--platform", "linux/amd64", "--network", "container:" + container,
            "-i", "edenhill/kcat:1.7.1"]

cleanup_failed = False
try:
    subprocess.run(
        client(owned_clients[0]) + ["-b", "127.0.0.1:19092", "-t", topic,
         "-P", "-q", "-X", "acks=all", "-X", "message.timeout.ms=60000"],
        input=(message + "\n").encode(), check=True, timeout=75)
    received = subprocess.run(
        client(owned_clients[1]) + ["-b", "127.0.0.1:19092", "-q",
         "-X", "auto.offset.reset=earliest", "-X", "enable.auto.commit=false",
         "-f", "%s", "-c", "1", "-G", group, topic],
        capture_output=True, check=True, timeout=45).stdout
    if received != message.encode():
        raise ValueError("The received message does not match.")
except (subprocess.SubprocessError, OSError, ValueError) as error:
    print("Kafka test did not pass:", error, file=sys.stderr)
    sys.exit(1)
finally:
    # A timed-out docker CLI can leave its daemon-side client running.
    # Stop only this run's uniquely named clients; --rm removes them on exit.
    for name in owned_clients:
        try:
            result = subprocess.run(
                ["docker", "stop", "--time", "2", name],
                capture_output=True, text=True, timeout=10)
            if result.returncode and "no such container" not in result.stderr.lower():
                cleanup_failed = True
                print("Check and stop this test client:", name, file=sys.stderr)
        except (subprocess.SubprocessError, OSError):
            cleanup_failed = True
            print("Check and stop this test client:", name, file=sys.stderr)

if cleanup_failed:
    raise SystemExit("Client cleanup could not be confirmed; test is incomplete.")
print("PASS: exact Kafka message round trip")
print("Topic:", topic)
print("Sent and received:", message)
PYTHON
Expected result — illustrativePASS: exact Kafka message round trip
Topic: kubemq-eval-<unique-id>
Sent and received: hello-kubemq-<unique-id>

A successful run prints PASS and exits with status 0. If it fails, check Docker, available ports and the test container’s startup logs before retrying.

3

Keep the test separate from production

When finished, stop this evaluation’s container. Keep its data volume if you want to continue with a trial or paid license.

Stop only this evaluation container
docker stop "${KMQ_DEMO_ID:?Use the terminal from step 1}"

No data-deletion command is included. If startup fails, inspect this container’s logs before retrying; do not reset an existing installation.

Using a client in another container or on another machine?

The supplied test client shares the isolated broker’s network namespace. A native client on this host can use 127.0.0.1:19092. A client in a different container or on another machine needs a reachable advertised host and port; its own 127.0.0.1 will not reach the broker. Review the networking guide before changing these local-only settings.

Read the Kafka networking settings

After the test,
check your workload.

A successful round trip establishes basic connectivity. Evaluate the Kafka features, retention and security settings your applications need before planning a migration.

Talk to KubeMQ

Let’s find your fit.

A little context helps us make this conversation useful.

Step 1 of 2

What would you like to explore?

Prefer email? marketing@kubemq.io

Your privacy choices

Essential services · Always active

Required for hosting, security and remembering your privacy choice. We collect anonymous first-party activity counts unless your browser requests no tracking. Google Analytics is optional and only loads with your permission. No advertising trackers are loaded.

Allow Vimeo videos to load. Vimeo receives your IP address and may use cookies. You can change this choice at any time.

Disabling videos stops them on this page. It cannot undo information already shared or remove Vimeo cookies; manage those in your browser settings.

Google Analytics measures visitors, sessions, traffic sources and known button clicks. Google receives connection information such as your IP address. No form values are sent. You can withdraw consent here; this stops future measurement and removes this site’s Analytics cookies.

Read our privacy notice