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.
| Ecosystem | KubeMQ connector | Default port(s) | Canonical client (this suite) |
|---|---|---|---|
| JMS | AMQP 1.0 | 5672 / 5671 | Apache Qpid JMS |
| ActiveMQ | AMQP 1.0 (Java/JMS); STOMP & MQTT for non-Java | 5672 / 5671, 61613 / 61614, 1883 / 8883 | Apache Qpid JMS (+ STOMP / MQTT clients) |
| RabbitMQ | RabbitMQ (AMQP 0-9-1) | 5672 / 5671 | pika (Python) |
| AMQP 1.0 | AMQP 1.0 | 5672 / 5671 | go-amqp (canonical; AMQP.NET Lite alt) |
| AWS SQS/SNS | AWS | 4566 (HTTP) | AWS SDK (boto3) |
| STOMP | STOMP | 61613 / 61614 | stomp.py |
| GCP Pub/Sub | Google Cloud Pub/Sub | 8085 (gRPC) | google-cloud-pubsub |
| MQTT | MQTT | 1883 / 8883 / 8083 | Eclipse Paho |
| Kafka | Kafka | 9092 / 9093 | kcat |
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.
| Axis | JMS | ActiveMQ | RabbitMQ | AMQP 1.0 | AWS SQS/SNS | STOMP | GCP Pub/Sub | MQTT | Kafka |
|---|---|---|---|---|---|---|---|---|---|
| Drop-in level | client-swap | client-swap / endpoint | endpoint-only | endpoint / client | endpoint-only | endpoint-only | endpoint-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-to | N/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/A | N/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-only | N/A (no broker-side filter) |
| Auth model | PLAIN(JWT)/EXTERNAL | PLAIN(JWT) | SASL PLAIN/AMQPLAIN (JWT or users) + EXTERNAL (opt-in) | PLAIN/EXTERNAL | SigV4 / accept-any | JWT (CONNECT) | KubeMQ token when authentication is on; no Google IAM | JWT (password) | SASL PLAIN/SCRAM/OAUTHBEARER + mTLS |
| TLS / mTLS | ✅ 5671 | ✅ | ✅ 5671 | ✅ 5671 | ❌ connector (proxy) | ✅ 61614 | ❌ none (emulator) | ✅ 8883 / wss 8083 | ✅ 9093 |
| Top unsupported | JMS transactions/XA; durable-unsub node-local | OpenWire protocol; transactions; selectors on STOMP path | federation/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 type | transactions; durable-unsub node-local | SNS email/SMS/Lambda/push; queue/topic IAM policies; TLS at connector | transactions; selectors | no TLS; Google IAM stubs; BigQuery/GCS export subs; ordering/exactly-once node-local; no 24h default retention | MQTT 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
ConnectionFactoryto 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.
| Guide | Drop-in | Connector on by default | One-line summary |
|---|---|---|---|
| Migrating from JMS | client-swap | No | Swap 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 ActiveMQ | client-swap / endpoint | No | Java and JMS apps use Qpid JMS over AMQP 1.0; STOMP and MQTT clients repoint by endpoint; OpenWire is not supported. |
| Migrating from RabbitMQ | endpoint-only | Yes | Swap the AMQP 0-9-1 connection string; exchanges, bindings, DLX, publisher confirms and tx.* transactions work (bounded per transaction). |
| Migrating from AMQP 1.0 | endpoint / client | No | Point 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/SNS | endpoint-only | No | Point 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 STOMP | endpoint-only | No | Change the STOMP broker host; every destination type maps; no transactions or selectors. |
| Migrating from Google Cloud Pub/Sub | endpoint-only | No | Set PUBSUB_EMULATOR_HOST; your existing Pub/Sub client publishes and pulls unmodified; no Google IAM or TLS; ordering is node-local. |
| Migrating from MQTT | endpoint-only | No | Change the broker host; MQTT 3.1.1 and 5.0 clients connect unchanged; retained messages and MQTT 3.1 are not supported. |
| Migrate from Kafka | endpoint-only | Yes | Repoint 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?
Shared HTTP Server
One HTTP server on port 9090 fronts every connector — its middleware chain, the enable model, and reserved channel prefixes.
Migrating from ActiveMQ
Move ActiveMQ clients to KubeMQ by client type: Java through Qpid JMS, STOMP and MQTT by endpoint. Quick start included; OpenWire is not supported.