说明
通过上篇博文翻译了AMQP协议中有关交换机Exchange的相关介绍,本篇博文将继续翻译AMQP协议中有关队列的内容,通过翻译学习记录AMQP模型中的另一实体Queue。
正文
Queues
AMQP 0-9-1模型中的队列与其他消息任务队列系统中的队列十分相似:它们都存储要被应用程序处理的消息。队列和交换机共享一些属性,同时它还有一些特别的属性:
- Name
- Durable (持久化,若该属性为true,则在服务器重启时队列仍然存在)
- Exclusive(独占性,当所属的连接关闭时,队列将会被删除)
- Auto-delete(当队列的最后一个消费者取消订阅时,队列将会被自动删除)
- Arguments(可选,通常被插件或代理服务器的特定功能使用,比如消息的TTL, 队列的长度限制等等)
在使用一个队列之前,该队列必须是已被声明的。声明一个不存在的队列时,将会创建该队列。如果声明一个已存在的队列,若使用与已存在队列相同的属性,则声明不会对已存在的队列造成任何影响,但属性不一致时,会造成channel-leve(通道级别) 的异常PRECONDITION_FAILED,以code码406表示。
Queue Names
应用程序会选择一个队列名称或者让代理服务器为其生成一个名字。队列名称最多可以是255个字节的utf-8字符,一个AMQP 0-9-1代理服务器可以产生一个唯一表示应用程序的队列名称。为使用此特性,可以设置队列的名称属性为空字符串。产生的名称将会被返回到声明队列的客户端。
以“amq*”开头的队列名称已经被代理服务器保留用于内部使用,当声明队列时使用了该类型的名称时,将会造成通道级别的异常ACCESS_REFUSED,以code码403表示。
Queue Durability
持久化的队列将会被保存到硬盘上,所以他们可以在服务器重启时存活。未被持久化的队列称为瞬时态。并不是所有的使用场景都要求队列持久化。
持久化的队列并不会把发送到该队列的消息进行持久化。如果一个代理服务器宕机后恢复,持久化的队列将会在服务器重启时重新被声明,然而,只有那些被持久化的消息才可以被恢复,其他未被持久化的消息和队列将会丢失。
Bindings
绑定是交换机在路由消息时使用的规则。为了使发送到名为E的交换机的消息可以路由到名为Q的队列,Q必须绑定到E。绑定时有一个可选的属性–routing key,该属性被某些类型的交换机使用。使用路由关键字的目的是在被发送到交换机中的消息中选择一些特定的消息路由到已绑定到该交换机的队列。换句话说,路由关键字就像一个过滤器。
可以做一个类比:
- 队列就好像你的目的地纽约
- 交换机就像JFK机场
- 绑定就是从JFK到纽约的所有路线,可以有零个或多个路线到达
有了这层间接性,就可实现在使用直接发送消息到队列方式时,一些难以实现的路由方案,同时可以大量减少程序开发人员的工作量。
如果AMQP消息不能被路由到任何队列(比如,交换机没有绑定任何队列),在这种情况下消息将被丢弃或返回给发送者,这取决于发送者设置的消息属性。