KubeMQ
ConnectorsHow-to guidesMigrate from another broker

Migrate from another broker

Migrate to KubeMQ from Kafka, RabbitMQ, SQS/SNS, MQTT, STOMP, Pub/Sub, AMQP 1.0, JMS or ActiveMQ: pick your broker, see the effort, open its guide.

This hub is the entry point for migrating an application from an external messaging ecosystem onto KubeMQ's wire-protocol connectors. Each guide covers what migrates cleanly, what migrates with caveats, and what does not migrate at all — the endpoint/connection change, the concept-to-pattern mapping, a working code example, the security posture, and a copy-pasteable smoke test. Every guide includes a quick start you can run on your laptop.

Important framing: the nine covered ecosystems are ecosystems, not nine connectors. KubeMQ has seven wire-protocol connectors; several ecosystems ride the same connector. For example, JMS, ActiveMQ-Java, and native AMQP 1.0 clients all use the AMQP 1.0 connector on port 5672.

Ecosystem → Connector Map

Each ecosystem maps onto one (or, for ActiveMQ, several) of the seven wire-protocol connectors. Follow the connector link for that protocol's full reference; follow the guide link in the Guides table below for the step-by-step migration.

EcosystemKubeMQ connectorDefault port(s)Canonical client (this suite)
JMSAMQP 1.05672 / 5671Apache Qpid JMS
ActiveMQAMQP 1.0 (Java/JMS); STOMP & MQTT for non-Java5672 / 5671, 61613 / 61614, 1883 / 8883Apache Qpid JMS (+ STOMP / MQTT clients)
RabbitMQRabbitMQ (AMQP 0-9-1)5672 / 5671pika (Python)
AMQP 1.0AMQP 1.05672 / 5671go-amqp (canonical; AMQP.NET Lite alt)
AWS SQS/SNSAWS4566 (HTTP)AWS SDK (boto3)
STOMPSTOMP61613 / 61614stomp.py
GCP Pub/SubGoogle Cloud Pub/Sub8085 (gRPC)google-cloud-pubsub
MQTTMQTT1883 / 8883 / 8083Eclipse Paho
KafkaKafka9092 / 9093kcat

AMQP 0-9-1 (RabbitMQ) and AMQP 1.0 share ports 5672 / 5671 — the server inspects the protocol header and routes each connection to the right connector. Their defaults differ: port 5672 is open on a stock server because AMQP 0-9-1 is on by default, but AMQP 1.0 dispatch on it is still opt-in, so an AMQP 1.0 client connects at the TCP level and then fails protocol negotiation until CONNECTORS_AMQP10_ENABLE=true is set. The AWS connector listens on port 4566, LocalStack's default; change it with CONNECTORS_AWS_PORT.

Cross-Protocol Comparison

The table below is transposed: axes are rows, ecosystems are columns. Each cell uses ✅ full / ⚠️ partial / ❌ none / N/A (inapplicable — a concept that does not exist in that ecosystem). ❌ means the concept exists in the source ecosystem but the KubeMQ connector does not support it.

AxisJMSActiveMQRabbitMQAMQP 1.0AWS SQS/SNSSTOMPGCP Pub/SubMQTTKafka
Drop-in levelclient-swapclient-swap / endpointendpoint-onlyendpoint / clientendpoint-onlyendpoint-onlyendpoint-only⁴endpoint-only⁵endpoint-only
Point-to-point queues✅✅✅✅✅ SQS✅N/A✅ queues/*N/A (topic/partition model)
Pub/sub (non-durable)✅✅✅ exchanges✅✅ SNS✅✅ topic→Events Store✅ events/*, store/*✅ native produce/consume
Durable / persistent subs✅¹✅¹✅ durable queues✅¹✅ (SQS durable)✅ groups + replay✅ sub→Queue⚠️ store/* new-only (no replay)✅ committed offsets (consumer groups)
Request / reply (RPC)✅✅²✅ Direct Reply-To✅N/A (no RPC)✅ reply-toN/A✅ (v5 only)N/A (no protocol-level RPC)
Ordering guarantee⚠️ node-local⚠️ node-local✅ per-queue³⚠️ node-local✅ FIFO⚠️⚠️ keys node-local⚠️ QoS-dependent✅ per-partition
Transactions❌❌✅ tx.* (bounded per transaction)❌N/A❌ (rejected)N/AN/A✅⁷ EOS V1 wire
Dead-letter / redrive❌ no client DLQ⁶❌ no client DLQ⁶✅ DLX + x-death❌ no client DLQ⁶✅ redrive + move-task❌ no client DLQ⁶✅ dead-letter topic❌ no client DLQ⁶N/A (no protocol-level DLQ)
Selectors / filter / wildcards✅ selectors (SQL92 subset)✅ (AMQP 1.0) / ❌ (STOMP)✅ topic/headers routing✅ selectors (SQL92 subset)✅ SNS filter policies❌ no selectors✅ CEL-subset filter⚠️ wildcards Events-onlyN/A (no broker-side filter)
Auth modelPLAIN(JWT)/EXTERNALPLAIN(JWT)SASL PLAIN/AMQPLAIN (JWT or users) + EXTERNAL (opt-in)PLAIN/EXTERNALSigV4 / accept-anyJWT (CONNECT)KubeMQ token when authentication is on; no Google IAMJWT (password)SASL PLAIN/SCRAM/OAUTHBEARER + mTLS
TLS / mTLS✅ 5671✅✅ 5671✅ 5671❌ connector (proxy)✅ 61614❌ none (emulator)✅ 8883 / wss 8083✅ 9093
Top unsupportedJMS transactions/XA; durable-unsub node-localOpenWire protocol; transactions; selectors on STOMP pathfederation/shovel; streams; priority queues; immediate; channel.flow(active=false); x-max-length without x-overflow refused; inert: x-max-length-bytes, x-max-priority, queue typetransactions; durable-unsub node-localSNS email/SMS/Lambda/push; queue/topic IAM policies; TLS at connectortransactions; selectorsno TLS; Google IAM stubs; BigQuery/GCS export subs; ordering/exactly-once node-local; no 24h default retentionMQTT 3.1; retained messages; clients-as-responders; wildcards on non-Events; node-local sessions>256 partitions; RF above the node count; KIP-848 next-gen groups; Kerberos/GSSAPI; delegation tokens; horizontal write scale

Footnotes:

¹ Durable subscription via Events Store; unsubscribe() is node-local (the unsubscribe only takes effect on the node that owns the durable subscription).

² ActiveMQ RPC via the AMQP 1.0 (Qpid JMS) path.

³ Requeued messages re-enter at the queue tail — this is a deviation from RabbitMQ classic queues, which preserve near-head position.

⁴ Set PUBSUB_EMULATOR_HOST=host:8085; Google credentials are not used.

⁵ MQTT 3.1 clients are rejected at CONNECT; use MQTT 3.1.1 (Paho default) or 5.0.

⁶ No client-settable dead-letter queue over this protocol. The AMQP 1.0, STOMP, and MQTT connectors never set a redrive target on published messages, so a poison message exceeding MaxReceiveCount is silently dropped by the broker — it is not delivered to any consumable dead-letter address. Genuine client-facing DLQ exists only for:

  • RabbitMQ — DLX, sets a broker redrive target.
  • AWS — redrive policy, also sets a broker redrive target.
  • GCP — dead-letters at the connector level by re-publishing to the configured dead-letter topic (new message IDs), not via a broker redrive target.

⁷ Kafka transactions / exactly-once semantics (V1 wire surface) are supported at proof-tier T2 — safe for at-least-once delivery plus basic exactly-once semantics — but this is not a KIP-890 soundness guarantee. See the fitness matrix for the full tier breakdown.

Drop-In Levels

Each guide states its drop-in level — how much application change the migration requires:

  • endpoint-only — change the host/port or set an environment variable; your existing client library and code are unchanged.
  • client-swap — swap the client library (for example, switch your JMS ConnectionFactory to Apache Qpid JMS); application code remains mostly unchanged.
  • partial-rewrite — some application-level changes are required beyond the client and the endpoint.

A guide may list a composite level (for example endpoint / client) when the level depends on the client type — the lower level covers simple publish/consume, and the higher level applies only where a specific feature needs it.

Before You Start

The Kafka and RabbitMQ (AMQP 0-9-1) connectors are on by default; the other five — AMQP 1.0, MQTT, STOMP, AWS SQS/SNS and Google Cloud Pub/Sub — are off until you turn them on (see Enabling and disabling a connector). Each guide's quick start turns its connector on in the KubeMQ you started with Try KubeMQ. For a real installation, start at Choose your path.

Guides

The drop-in level in each row tells you, at a glance, how much application change to expect.

"Connector on by default" says whether a stock server already listens for that protocol.

GuideDrop-inConnector on by defaultOne-line summary
Migrating from JMSclient-swapNoSwap your JMS ConnectionFactory to Apache Qpid JMS over the AMQP 1.0 connector; application code is unchanged if you avoid transactions and XA.
Migrating from ActiveMQclient-swap / endpointNoJava and JMS apps use Qpid JMS over AMQP 1.0; STOMP and MQTT clients repoint by endpoint; OpenWire is not supported.
Migrating from RabbitMQendpoint-onlyYesSwap the AMQP 0-9-1 connection string; exchanges, bindings, DLX, publisher confirms and tx.* transactions work (bounded per transaction).
Migrating from AMQP 1.0endpoint / clientNoPoint your existing AMQP 1.0 client (go-amqp and others) at KubeMQ; queues, topics, durable subscriptions and RPC map; no transactions.
Migrating from AWS SQS/SNSendpoint-onlyNoPoint your existing AWS SDK or CLI at KubeMQ's endpoint; SQS, SNS, FIFO and redrive migrate; email, SMS and Lambda subscriptions do not.
Migrating from STOMPendpoint-onlyNoChange the STOMP broker host; every destination type maps; no transactions or selectors.
Migrating from Google Cloud Pub/Subendpoint-onlyNoSet PUBSUB_EMULATOR_HOST; your existing Pub/Sub client publishes and pulls unmodified; no Google IAM or TLS; ordering is node-local.
Migrating from MQTTendpoint-onlyNoChange the broker host; MQTT 3.1.1 and 5.0 clients connect unchanged; retained messages and MQTT 3.1 are not supported.
Migrate from Kafkaendpoint-onlyYesRepoint bootstrap.servers; your existing Kafka clients connect unchanged. Assess fit with kmq assess kafka, then move topics and consumer-group offsets with kmq migrate.

Was this page helpful?

On this page