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 frames✅ immediate 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 吧!⭐ 你的支持是我们最大的动力 🚀