AMQP 0-8 to 0-9-1
This is a summary of the semantic differences between AMQP 0-8 and 0-9-1.
The advertised version number is major=0,minor=9,revision=1 rather than major=8,minor=0.
Frame types 4-7 (OOB and trace frames) have been removed, as they were not well specified in AMQP 0-8.
Status code changes:
Removed:
- NOT_DELIVERED 310
Added:
- NO_ROUTE 312 (missing from spec???)
- NO_CONSUMERS 313
- PRECONDITION_FAILED 406
- UNEXPECTED_FRAME 505
Access tickets have been removed. This involves the removal of the Access.Request method, and the deprecation of each and every ticket field in methods that used to require a ticket.
The restrictions on virtual-host names have been removed.
The notions of "known hosts" and of connection redirection have been removed.
The (AMQP-specific) "PLAIN" security mechanism is no longer mentioned.
The meaning of "channel-max" has been clarified: for example, if channel-max is set to 2, then it is illegal to use channels numbered 3 or higher for frames carried by the connection.
The meaning of "frame-max" has been clarified: the maximum frame size is to be interpreted as including the counts for the frame header and end-byte.
A new rule (named "upper-limit") regarding channel-max has been added: if the client asks for channel-max higher than that offered by the server, the connection MUST be closed without attempting a negotiated close.
A similar rule (also named "upper-limit") applies to frame-max: if the client asks for frame-max higher than that offered by the server, the connection MUST be closed without attempting a negotiated close.
The extensibility of the exchange-type mechanism is now explicitly documented.
The rules for equivalence of exchange instances in Exchange.Declare have been more clearly specified, including a specification of how the "arguments" tables are to be compared.
Auto-deletion of exchanges is no longer supported.
The AMQP 0-8 notion of "content classes" has been removed.
- The rules for equivalence of queues in Queue.Declare have been more clearly specified.
The rules regarding deletion of "exclusive" queues have been more tightly specified.
A single Basic.Publish is now defined to never result in multiple copies of a message on any particular queue, even in the presence of multiple independent bindings to the same queue that match the published message.
Durable queues may now bind to transient exchanges. Bindings between a durable queue and an exchange are as durable as the bound exchange is.
If two or more different bindings to a single queue apply to a given publication, only one copy of the published message is placed on the queue. This was intended, but not specified, in 0-8.
- The error code for use of an empty queue name in Queue.Bind (and other methods that use the most-recently-declared-queue mechanism) has been changed.
- The empty string may now be specified in Queue.Bind's "exchange" field; it signifies the default exchange (!).
Basic.Recover has changed: the old behaviour is available via a (deprecated) method Basic.RecoverAsync, which has method ID 100 (which in 0-8 was the ID for Basic.Recover). In 0-9-1, Basic.Recover has ID 110, and now has a required response, Basic.RecoverOk (ID 111). Also, both Basic.Recover and Basic.RecoverAsync are permitted on (Tx-)transacted channels in 0-9-1, which was forbidden in 0-8.
Basic.Ack is now required to signal a channel error immediately upon detecting an invalid deliveryTag, even if the channel is (Tx-)transacted. Also, it is now explicitly forbidden to acknowledge a particular deliveryTag more than once.
- Consumer tags (in Basic.Consume etc) are defined as local to a channel now, not local to a connection.
Message priorities have been clarified: priority 9 is the highest priority level (meaning that messages with priority 9 will be delivered ahead of any lower-priority messages), and priority 0 is the lowest priority level.
If a Channel.Close is received while a peer is waiting for a Channel.CloseOk, a Channel.CloseOk must be sent in response as usual. Previously, in 0-8, such a Channel.Close was required to be ignored.
If a Connection.Close is received while a peer is waiting for a Connection.CloseOk, a Connection.CloseOk must be sent in response as usual. Previously, in 0-8, such a Connection.Close was required to be ignored.
- Channel.Flow is specified to not apply to content carried by Basic.GetOk methods.
- Exchange.Declare's Durable field is no longer ignored in cases when the named exchange already exists at the time of the declaration.
- The server now MUST NOT delete an exchange that has bindings on it if the IfUnused field is true during an Exchange.Delete.
The XML requires an "amq.headers" exchange if the "headers" exchange type is implemented; the PDF requires an "amq.match" exchange if the "headers" exchange type is implemented. This is an error and will be resolved in a future release of the 0-9 series of specifications; the intention is for "amq.headers" to be required. "amq.match" is a legacy name and is now deprecated.
- It is now explicitly specified that Queue.Delete on an AutoDelete queue is permitted and meaningful.
The rules on exclusive queues have changed: exclusivity now applies to all queue operations, not just consuming from the queue. Furthermore, passive declarations of an exclusively-held queue on other connections are now disallowed.
Generally, passive declarations are now specified to ignore most of the parameters given to the declaration other than the name of the declared entity. This was not specified in 0-8.
- The server now MUST NOT delete a queue that has messages in it if the IfEmpty field is true during a Queue.Delete.
- When Queue.Purge is called, sent-but-unacknowledged messages are no longer purged, even if the channel they were sent down is not (Tx-)transacted.
- Class Tx has new language around atomicity and multiple-queue-transactions.
The effects of the "immediate" and "mandatory" flags on Basic.Publish are explicitly declared to be undefined when used within a Tx transaction in 0-9-1.
- Tx.Rollback has been clarified: unacked messages will NOT be redelivered in 0-9-1 upon rollback.
The "no-local" field is specified to prohibit delivery to the connection that published a message in 0-9-1. In 0-8, it was not specified whether the scope of prohibition was the channel or the connection.
It is made clear in section 1.4.1 of the main spec that strings are case-sensitive.
References to "chained bindings", nested message contents ("structured contents"), message selectors, weight, out-of-band frames etc have been removed.
There is new specification around errors detected during connection establishment (see the end of sections 2.2.4).
Section 2.2.9 reiterates the lack of requeuing and redelivering on Tx.Rollback.
Section 2.3.7 explains the changes made to the connection and channel close protocols.
The "Headers" exchange type is now defined (section 3.1.3.4).
The use of UNEXPECTED_FRAME (code 505) is documented in section 4.2.6.
The content body size field has been clarified to mean the sum of the body sizes of the following content body frames.
Heartbeating has been specified (section 4.2.7).
Sections 4.4 (Visibility Guarantee), 4.5 (Channel Closure), 4.6 (Content Synchronisation) and 4.7 (Content Ordering Guarantees) are new, interesting, and important.
Some methods have been removed:
- Connection.Redirect
- Channel.Alert
Some methods have been renumbered:
- Connection.Close 60 -> 50
- Connection.CloseOk 61 -> 51
- Basic.Recover (see explanation above)
Some methods have been added:
- Queue.Unbind, methodId 50
- Queue.UnbindOk, methodId 51
Some methods have new or changed arguments:
Method Type/Name (many methods) short Ticket deprecated Connection.Open shortstr Capabilities deprecated Connection.Open bit Insist deprecated Connection.OpenOk shortstr KnownHosts deprecated Channel.Open shortstr OutOfBand deprecated Channel.OpenOk longstr - added, then deprecated Exchange.Declare bit AutoDelete deprecated Exchange.Declare bit Internal deprecated Basic.GetEmpty shortstr ClusterId deprecated Basic.Consume table Filter added File.Consume table Filter added Stream.Consume table Filter added Some classes have been removed:
- Access
- Dtx
- File
- Stream
- Test
- Tunnel
The Basic class's content properties have been changed:
AppId - shortstr - deprecated
Note: Framing and connection establishment (modulo the removed frame-types and the spec version number advertisement, respectively) are identical.
Getting Help and Providing Feedback
If you have questions about the contents of this guide or any other topic related to RabbitMQ, don't hesitate to ask them using GitHub Discussions or our community Discord server.
Help Us Improve the Docs <3
If you'd like to contribute an improvement to the site, its source is available on GitHub. Simply fork the repository and submit a pull request. Thank you!