KubeMQ
ConnectorsRabbitMQ (AMQP 0-9-1)Reference

Channel Mapping

The reference for how a RabbitMQ AMQP 0-9-1 queue maps to a KubeMQ Queue channel — the amqp.{vhost}.{queue} grammar, charset, and property/header mapping.

This is the master reference for how the embedded KubeMQ RabbitMQ (AMQP 0-9-1) connector maps an AMQP queue to a KubeMQ Queue channel. Every AMQP queue — regardless of which exchange or routing key delivered to it — is backed by exactly one KubeMQ Queue channel. Exchanges and bindings are virtual connector-side routing; the queue is the only durable object.

Everything is a Queue. The connector mirrors AMQP routing concepts (direct / fanout / topic / headers exchanges, bindings, RPC) on top of the single KubeMQ Queue primitive. See Architecture for the virtual-routing model.

Grammar

Every AMQP queue maps to exactly one KubeMQ Queue channel:

amqp.{vhost}.{queue}
└┬─┘ └──┬──┘ └──┬──┘
 │      │       └─ the AMQP queue name
 │      └─ the vhost segment (AMQP "/" → DefaultVhost, literal "default")
 └─ fixed connector prefix

The mapping is mappedChannelPrefix + vhost + "." + queue.

AMQP queueVhostKubeMQ channel
orders/ (default)amqp.default.orders
hello/amqp.default.hello
probe.q/amqp.default.probe.q
jobsworkersamqp.workers.jobs

Constraints

ConstraintRuleViolation
LengthMax 255 chars (prefix + vhost + queue).406 precondition-failed at queue declaration.
CharsetQueue/vhost names must NOT contain ;, :, *, >, whitespace, or end with ..406 (queue) / 402 (vhost).
Reserved vhostThe literal "default" vhost is reserved and cannot be client-created — reach it via /.402 invalid-path (connector source); a running broker may surface 403 "no access to this vhost" on a direct connect.

Reserved default vhost + name charset (gotcha #8). Connect to vhost / (which maps to the default segment); connecting directly to a vhost literally named default is rejected (402 invalid-path per the connector source; a running broker may surface 403 "no access to this vhost"). Names containing ;, :, *, >, whitespace, or a trailing . are rejected. See Migrating from RabbitMQ for the rename-before-migration checklist.

Cross-protocol interoperability

Because the backing store is a normal KubeMQ Queue channel, a message published over AMQP to amqp.default.orders is consumable by a gRPC/REST queue client on the same channel, and vice-versa. The AMQP queue and the KubeMQ Queue channel are the same object viewed through two protocols.

Property / header ⇄ tag / metadata mapping

AMQP basic properties → KubeMQ tags

Tag namespace amqp.*. An absent property produces no tag.

AMQP propertyKubeMQ TagNotes
content-typeamqp.content-type
content-encodingamqp.content-encoding
delivery-modeamqp.delivery-mode
priorityamqp.prioritycarried as a tag; priority ordering itself is inert
correlation-idamqp.correlation-id
reply-toamqp.reply-torewritten for direct-reply-to
expirationamqp.expirationalso → Policy.ExpirationSeconds
message-idamqp.message-idUUID minted if absent
timestampamqp.timestampUnix seconds
typeamqp.type
user-idamqp.user-idvalidated vs ClientID when auth enabled
app-idamqp.app-id
(routing context)amqp.exchange, amqp.routing-keyalways set on delivery

AMQP headers ⇄ KubeMQ metadata

DirectionBehavior
AMQP → KubeMQHeaders are wrapped as Metadata = {"amqp_headers":{...}} (metadataEnvelopeKey = "amqp_headers"). Always set, even for nil/empty headers ({"amqp_headers":{}}). E.g. header trace=abc-123 → metadata {"amqp_headers":{"trace":"abc-123"}}.
KubeMQ → AMQPNative (non-enveloped) gRPC metadata surfaces as the AMQP header x-kubemq-metadata (headerKubemqMetadata = "x-kubemq-metadata"). E.g. gRPC metadata="native-metadata" → AMQP delivery header x-kubemq-metadata: native-metadata.

Special headers:

  • x-delayPolicy.DelaySeconds (stripped on delivery);
  • x-death trail reconstructed for dead-lettering;
  • expiration moved to x-death[0].original-expiration when dead-lettered.

The {"amqp_headers":{...}} envelope is what a gRPC/REST consumer sees; a pure AMQP→AMQP round-trip surfaces headers natively. Treat the envelope as an interop concern, not a default-path surprise.

Was this page helpful?

On this page