最近用到了一些RabbitMQ的东西,看了官方的Get Started,以此为模板总结一下。json
(1)生产者(发送方)发送消息到ExChange(含参:routingkey),ExChange经过bindingkey肯定消息传入哪个Queue,消费者(接收方)经过监听Queue来获取消息。服务器
其中须要注意的是:生产者(Producer)永远不会向队列(Queue)直接发送消息。app
(2)ExChange经过BindKey来和Queue进行关联保定的,Binding表示一种Exchange服务器和Queue之间的关系,或者说Queue对Exchange服务器中的内容感兴趣。函数
(3)经过上面能够知道,生产者是将消息发送给ExChange服务器的,可是ExChange服务器是怎么知道如何处理这些Message呢,是经过ExChange Type,ExChange Type主要有四类:fetch
(4)其常见的消息分发模型以下:ui
1.简易的一对一的生产者消费者模型spa
2.一对多的工厂模型,其主要须要注意的点是默认为公平分配,即C一、C2两个消费者拿到的东西是同样多的,其须要设置prefetch_count来改变这种状况。 code
3.订阅/发布模式,其采用一种广播模式进行对已知的队列进行消息发送。orm
3.direct这种肯定值的路由状态,即routingkey为orange的消息,只会发送到与Exchange的Bindingkey为orange的队列中,而,在fanout广播下会忽略这些值(orange,black等)。blog
即:其若是routingkey都一致,都是black,那么Exchange收到的全部routingkey为black的消息都会发送给Q一、Q2两个队列。这样就已经不具有Direct肯定路由的特性了,这种状况就和fanout广播的原理同样了,以下:
4.还有这种通配符模型(TOPIC),以及其相似的指定模型(DIRECT),topic模型是最具备变换性质的模型,其经过“*”和“#”两种配置符号进行EXCHANGE和QUEUE的绑定,可以经过特定的routingkey绑定方式实现DIRECT和FANOUTS类型。
(1)topic模式下的routingkey,必须由一系列的单词组成,单词之间以“.”间隔,好比:stock.usd.nyse;
(2)topic有两种通配符: * 标示一个单词,# 标示零个或多个单词 (Y.X.Z,单词是以.来肯定的,Y、X、Z即为三个单词)
好比这种状况下:
消息的RoutingKey | 会接收消息的通道编号 |
quick.orange.rabbit | Q一、Q2 |
lazy.orange.fox | Q一、Q2 |
lazy.orange.male.rabbit | Q2 |
须要注意的是,若是routingkey匹配了该通道的多条bindingkey,消息也不会屡次发送,另外:
5.还有一种RPC,远程服务型,其可以实现消息回调,即客户端经过RabbitMQ访问服务端,服务端接收到消息后,再返回信息给客户端,其由函数ConvertSendandReceive()实现,具体过程以下:
能够看到其发送的消息有一些参数:
如上图:其客户端发送了reply_to=amqp.gen-x a2... 那么服务端回复的通道就是amqp.gen-xa2....
客户端接收到了服务端发回来的coorelation_id,与本身发出的进行匹配,成功则标示消息已经被消费。