仅供个人学习,如有抄袭请包容cry....
理解消息通信
一、 消息通信的概念--消费者、生产者和代理
生产者创建消息,消费者接受这些消息。你的应用程序可以作为生产者,向其他应用程序发送消息,或者作为一个消费者,接收消息。也可以在两者之间进行切换。不过在此之前,它必须先建立一条信道(channel)。不论你是发布消息、订阅队列或是接受消息都是通过信道完成。
二、 AMQP元素--交换器、队列和绑定
从概念上讲,AMQP消息路由必须有三部分:交换器、队列和绑定。生产者把消息发布到交换器上;消息最终到达队列,并被消费者接受;绑定决定了消息如何从路由器路由到特定的队列。在研究交换器和绑定之前,需要先理解队列的概念和工作原理。如下图:
消费者通过以下两种方式从特定队列中接收消息:
(1) 通过AMQP的base.consumer命令订阅。这样做会将信道置为接收模式,直到取消对队列的订阅为止。
(2) 有些时候,你只想从队列中获取单条消息而不是持续订阅。向队列请求单条消息是通过AMQP的base.get命令实现的。大致上讲,base.get命令会订阅消息,获取单条消息,然后取消订阅。消费者理应始终使用base.consumer来实现高吞吐量。
A: 当有多个消费者订阅到同一个队列上是,消息是如何发布的:
Q: 队列收到的消息将以循环(round-robin)的方式发送给消费者,每条消息只会发送给一个消费者。消息确认接收机制:消费者必须通过AMQP的base.ask命令显式的向RabbitMQ发送一个确认消息,或者在订阅到队列的时候就将base.ask参数设置成true。消费者对消息的确认和告诉生产者消息已经被接收这两件事毫不相关。
如何创建队列。生产者和消费者都能使用AMQP的base.declare命令创建队列。如果消费者在同一条信道上订阅了另一条对列的话,就无法再声明队列了。则必须先取消队列,将信道置为“传输”模式。
队列设置了一些有用的参数:
1.exlusion--将参数设置成true后队列将变为私有,限制一个队列中只能有一个消费者。
2.auto-delete--将参数设置为true后,最后一个消费者取消订阅之后队列将自动移除。
联合:交换器和绑定。
Q: 消息是如何到达队列的呢?
A: 路由键规则来指定消息从路由器到哪个队列。
Q: 那它是如何处理投递到多个队列的情况呢?
A: 协议中定义的不同类型交换器发挥了作用。一共四种类型:direct、fanout、topic和header。
direct:如果路由键匹配的话,消息就被投递到对应的队列。
base_publish($msg,'默认交换器','队列名称');
fanout:当你发送一条消息到fanout路由器时,他会把消息投递给所有附加在此交换器上的队列。可以轻而易举地添加应用程序的功能。
base_publish($msg,'logs-exchange','error.msg-inbox');
topic:跟direct比较相像,有一些通配规则。单个“.”把路由分成几部分,“*”匹配特定位置的任意文本,“#”匹配所有规则。
queue_bind('msg-inbox-errors','logs-exchange','error.msg-inbox');
queue_bind('msg-inbox-errors','logs-exchange','*.msg-inbox');
queue_bind('all-logs','logs-exchange','#');