rabbitmq学习(一):AMQP协议,AMQP与rabbitmq的关系 (2)

  对于下图而言:当携带routing key为apple.orange.penanut的消息被发送给交换机时,将会被路由到队列Q1中。当lazy.apple.pen被发送到交换机时,将会被路由到队列Q2中。

  

rabbitmq学习(一):AMQP协议,AMQP与rabbitmq的关系

  c.扇形交换机/广播交换机:将交换机和任意多个队列绑定起来,不管绑定上的路由键,当消息被发送到交换机上时,消息将会被拷贝并路由到所有绑定到该交换机上的队列中。

  对下图而言:携带任何routing key的消息被发送到交换机上时,消息都将被拷贝并分发到Q1,Q2,Q3中。

  

rabbitmq学习(一):AMQP协议,AMQP与rabbitmq的关系

  扇形交换机的使用的案例:

大规模多用户在线(MMO)游戏可以使用它来处理排行榜更新等全局事件

体育新闻网站可以用它来近乎实时地将比分更新分发给移动客户端

分发系统使用它来广播各种状态和配置更新

在群聊的时候,它被用来分发消息给参与群聊的用户。(AMQP没有内置presence的概念,因此XMPP可能会是个更好的选择)

  d.头交换机(header exchange):有时消息的路由操作会涉及到多个属性,此时使用消息头就比用路由键更容易表达,头交换机(headers exchange)就是为此而生的。头交换机使用多个消息属性来代替路由键建立路由规则。通过判断消息头的值能否与指定的绑定相匹配来确立路由规则。

  我们可以绑定一个队列到头交换机上,并给他们之间的绑定使用多个用于匹配的头(header)。这个案例中,消息代理得从应用开发者那儿取到更多一段信息,换句话说,它需要考虑某条 消息(message)是需要部分匹配还是全部匹配。上边说的“更多一段消息”就是"x-match"参数。当"x-match"设置为“any”时,消息头的任意一个值被匹配就可以满足条件,而当"x-match"设置为“all”的时候,就需要消息头的所有值都匹配成功。

  头交换机可以视为直连交换机的另一种表现形式。头交换机能够像直连交换机一样工作,不同之处在于头交换机的路由规则是建立在头属性值之上,而不是路由键。路由键必须是一个字符串,而头属性值则没有这个约束,它们甚至可以是整数或者哈希值(字典)等。

  e.默认交换机(default exchange):默认交换机是一种特殊的直连交换机(direct exchange)。它是由消息代理默认声明的,该交换机有一个特性,所有新建的队列都会默认绑定到默认交换机上,并且绑定的routing ke就是队列的名字。

 2.交换机的属性

  除交换机类型外,在声明交换机时还可以附带许多其他的属性,其中最重要的几个分别是: 

Name:交换机名称。

Durable:消息代理重启后,交换机是否还存在。交换机有两个状态,持久(durable)、暂存(transient)。持久化的交换机会在消息代理重启后依旧存在,而暂存的交换机则不会。

Auto-delete :当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它。

Arguments:依赖代理本身。

四、队列 1.队列属性

  除了队列名称,队列也有另外一些属性

Name:队列名,队列名称可以自己声明,也可以由代理来生成。但是自己声明时,不能声明以amp.开头的队列名,因为这是代理内部使用的队列名称格式,如果这样声明,将会抛出异常。

Durable:和交换机一样,消息代理重启后,队列是否还存在

Exclusive:只被一个连接使用,连接关闭后,将立即删除队列。

Auto-delete:当所有的消费者都退订队列后将自动删除该队列

五、消费者 1.消息确认

  消费者在处理消息的时候偶尔会失败或者有时会直接崩溃掉。而且网络原因也有可能引起各种稳日。所以AMQP在什么时候删除消息才是正确的呢?AMQP规范给了两种建议:

当消息代理将消息发送给应用后立即删除,即自动确认机制。

待应用发送一个确认回执(acknowledement)后再删除消息,即显示确认模式。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywswz.html