Skip to content

RobustMQ AMQP Protocol Support

This document lists RobustMQ's actual support status, per AMQP 0-9-1 Class/Method, as an AMQP broker. Status uses three levels:

  • Fully supported: the protocol semantics are correctly implemented.
  • 🟡 Partially supported: the handshake/interface works, but the behavior is a simplified implementation or has a known limitation — see the note.
  • Not supported: the method itself errors out or has no real semantics.

References:

See Compatibility & Limitations for the reasoning and impact behind each item.


Protocol Basics

AMQP 0-9-1 runs over TCP and transmits data as frames. Each frame consists of a type, channel number, length, payload, and a frame-end marker (0xCE).

  • Connection-related img

  • Publish/consume-related

img

  • Broker-internal logic img

Frame Types

Frame typeIDDescription
Method Frame1Control commands (all Class/Method)
Content Header Frame2Message properties (content-type, delivery-mode, headers, etc.)
Content Body Frame3Message body payload (may be split across frames)
Heartbeat Frame8Keepalive

Both publishing and delivery are completed via the Method + Content Header + Content Body frame combination.


1. Connection Class

Class.MethodIDDirectionDescriptionStatus
connection.start10.10S→CBroker initiates the handshake, advertising supported SASL mechanisms and locale
connection.start-ok10.11C→SClient selects a SASL mechanism and sends the auth response✅ PLAIN only
connection.secure10.20S→CBroker sends a SASL challenge (multi-round auth)🟡 Unused (not needed for PLAIN)
connection.secure-ok10.21C→SClient responds to the SASL challenge🟡 Ack-only stub
connection.tune10.30S→CBroker proposes channel-max, frame-max, heartbeat
connection.tune-ok10.31C→SClient confirms connection parameters✅ Server takes the smaller of the client's negotiated values and its own proposal
connection.open10.40C→SClient opens a virtual host (mapped to a tenant)
connection.open-ok10.41S→CBroker confirms the vhost connection succeeded
connection.close10.50BothEither side initiates connection close (carries an error code)
connection.close-ok10.51BothConfirms close
connection.blocked10.60S→CConnection-level flow-control warning🟡 Unused (no active throttling)
connection.unblocked10.61S→CClears the flow-control warning🟡 Unused
connection.update-secret10.70C→SUpdates auth credentials on an established connection🟡 Ack-only stub, no real credential rotation
connection.update-secret-ok10.71S→CConfirms the update🟡

2. Channel Class

Class.MethodIDDirectionDescriptionStatus
channel.open20.10C→SClient opens a channel
channel.open-ok20.11S→CBroker confirms the channel is open
channel.flow20.20BothPause/resume the message flow (backpressure)🟡 Only takes effect for push delivery on the local node — see Compatibility & Limitations
channel.flow-ok20.21BothConfirms the flow command
channel.close20.40BothCloses the channel (carries an error code)
channel.close-ok20.41BothConfirms close

3. Exchange Class

Exchanges are the core of message routing, with all four standard types supported: direct, fanout, topic, headers.

Class.MethodIDDirectionDescriptionStatus
exchange.declare40.10C→SCreate or verify an exchange (type/passive/durable/no-wait)✅ Including passive semantics (404 if it doesn't exist)
exchange.declare-ok40.11S→CConfirms creation
exchange.delete40.20C→SDelete an exchange (if-unused option)
exchange.delete-ok40.21S→CConfirms deletion
exchange.bind40.30C→SExchange-to-exchange binding (RabbitMQ extension)✅ Supports chained routing, with cycle protection
exchange.bind-ok40.31S→CConfirms the binding
exchange.unbind40.40C→SRemove an exchange-to-exchange binding
exchange.unbind-ok40.51S→CConfirms the unbind

4. Queue Class

Class.MethodIDDirectionDescriptionStatus
queue.declare50.10C→SCreate or verify a queue (passive/durable/exclusive/auto-delete)✅ Including passive semantics
queue.declare-ok50.11S→CConfirms creation; returns queue name, message count, consumer count✅ Real counts (based on current storage offsets and shared consume-group member count)
queue.bind50.20C→SBind a queue to an exchange (with a routing-key)
queue.bind-ok50.21S→CConfirms the binding
queue.unbind50.50C→SRemove the binding between a queue and an exchange
queue.unbind-ok50.51S→CConfirms the unbind
queue.purge50.30C→SPurge all messages from a queue
queue.purge-ok50.31S→CConfirms the purge; returns the number of purged messages
queue.delete50.40C→SDelete a queue (if-unused / if-empty options)
queue.delete-ok50.41S→CConfirms deletion; returns the number of deleted messages

5. Basic Class

The Basic class is the heart of AMQP 0-9-1, covering all message publish, delivery, and acknowledgement logic.

5.1 Consumer Management

Class.MethodIDDirectionDescriptionStatus
basic.qos60.10C→SSet prefetch (prefetch-size, prefetch-count, global)🟡 Enforced when the consumer is co-located with the queue leader; best-effort across nodes; prefetch-size has no effect
basic.qos-ok60.11S→CConfirms the QoS setting
basic.consume60.20C→SRegister a consumer, start push-mode delivery (no-local/no-ack/exclusive)exclusive is enforced; no-local has no effect (matches RabbitMQ classic queues)
basic.consume-ok60.21S→CReturns the consumer-tag✅ Broker generates one if the client leaves it blank
basic.cancel60.30C→SCancel a consumer
basic.cancel-ok60.31S→CConfirms the cancellation

5.2 Publishing

Class.MethodIDDirectionDescriptionStatus
basic.publish60.40C→SPublish a message (exchange, routing-key, mandatory, immediate), followed by Content Header + Body framesimmediate is a deprecated flag and gets no special handling (matches modern RabbitMQ)
basic.return60.50S→CReturn an unroutable message (triggered by the mandatory flag)

5.3 Delivery

Class.MethodIDDirectionDescriptionStatus
basic.deliver60.60S→CBroker pushes a message to a consumer (push mode), followed by Content Header + Body frames
basic.get60.70C→SSynchronously pull one message (pull mode)✅ Auto-forwarded across nodes to the queue leader
basic.get-ok60.71S→CReturns the message, followed by Content Header + Body frames
basic.get-empty60.72S→CResponse when the queue is empty

5.4 Acknowledgement

Class.MethodIDDirectionDescriptionStatus
basic.ack60.80C→SAcknowledge a message as processed (supports batch ack via multiple)
basic.reject60.90C→SReject a message (requeue=true puts it back, false discards it)
basic.recover-async60.100C→SAsk the broker to redeliver all unacked messages (fire-and-forget)
basic.recover60.110C→SAsk the broker to redeliver all unacked messages
basic.recover-ok60.111S→CConfirms the recover
basic.nack60.120C→SBatch-reject messages (RabbitMQ extension)

6. Tx Class (No Real Semantics)

Class.MethodIDDirectionDescriptionStatus
tx.select90.10C→SEnter transaction mode🟡 Handshake only, replies select-ok
tx.select-ok90.11S→CConfirms transaction mode is on🟡
tx.commit90.20C→SCommit a transaction (publish + ack take effect atomically)🟡 Replies commit-ok only, no real atomic commit
tx.commit-ok90.21S→CConfirms the commit🟡
tx.rollback90.30C→SRoll back a transaction🟡 Replies rollback-ok only, no real rollback
tx.rollback-ok90.31S→CConfirms the rollback🟡

After Tx.Select, publishes and acks still take effect immediately — they are not buffered until commit, and there is no rollback undo. For reliable publishing, use Publisher Confirms instead.


7. Confirm Class (Publisher Confirms, RabbitMQ Extension)

Class.MethodIDDirectionDescriptionStatus
confirm.select85.10C→SEnable Publisher Confirm mode
confirm.select-ok85.11S→CConfirms it's enabled

Once enabled, every basic.publish on that channel receives a matching basic.ack (success) or basic.nack (failure) once the message is durably written — see Publisher Confirms.


Broker Core Business Logic

About half of AMQP 0-9-1's methods are *-ok acknowledgements the broker can construct directly. The real business logic lives in:

Core capabilityMethods involvedStatus
Authenticationconnection.start / start-ok✅ SASL PLAIN
Routingexchange.declare + queue.bind + basic.publish✅ direct/fanout/topic/headers + exchange-chain bindings
Shared queues / push deliverybasic.consume + basic.deliver✅ Driven by the shared consume group's leader — see Shared Queue Group
Acknowledgementbasic.ack / reject / nack / recover✅ Drives message state transitions (unacked → acked / requeued)
Reliable publishingconfirm.select + basic.ack/nack✅ See Publisher Confirms
Prefetch flow controlbasic.qos🟡 Enforced locally, best-effort across nodes
Transactionstx.select / commit / rollback🟡 Handshake only, no real semantics

Further Reading

🎉 既然都登录了 GitHub,不如顺手给我们点个 Star 吧!⭐ 你的支持是我们最大的动力 🚀