RabbitMQ之概念介绍(二)

简介:

  MQ全称为Message Queue,消息队列是一种应用程序间的通信方法。

  其是消费者-生产者模型的一个典型代表,一端往消息队列中不断写入消息,另一端不断读取/订阅消息。

简单使用场景举例:

  将项目中无需即时返回且耗时的操作提取出来,进行异步处理,大大降低了服务器的请求响应时间。

  如:打印日志模块无需即时返回,且写磁盘是一种比较慢的行为,可以将其写到MQ中,生产者不需要关心是否立马写到磁盘。

典型应用场景:

  异步处理请求:读写分离

  应用解耦:生产者消费者读写分离

  流量削峰:把流量控制到MQ这一层,不会实际的走到server侧

  负载均衡:同一个Queue上的多个消费者被负载均衡(一条消息只上报给一个人)

  消息订阅:根据订阅信息自动上报消息,类型NIO的处理逻辑

几个重要概念:

Queue

  消息队列,其作用是先进先出,存储来自Producer的消息,上报消息给Consumer,多个Producer可以订阅同一个Queue,但是Queue中的数据之后上报给其中一个人(可以用来做负载均衡),上报完之后数据被丢弃,如果未能上报或者说无Consumer,则该消息一直存在;

       下图是简化版(中间有一层Exchange),C和P一比一,实际有Exchange的存在

     

     下图时一个生产者对应多个消费者,两个消费者C1,C2平均每人处理一条P生产的消息A,B

     

Exchange

  The core idea in the messaging model in RabbitMQ is that the producer never sends any messages directly to a queue.Actually, quite often the producer doesn't even know if a message will be delivered to any queue at all.

  Instead, the producer can only send messages to an exchange. An exchange is a very simple thing. On one side it receives messages from producers and the other side it pushes them to queues. The exchange must know exactly what to do with a message it receives. Should it be appended to a particular queue? Should it be appended to many queues? Or should it get discarded. The rules for that are defined by the exchange type.

   交换机,决定了消息路由规则,但是它不会存储,生产者塞进来数据时,如果没有Queue bind到Exchange的话,它会直接丢弃Producer发送过来的消息;

  上面展示了Queue的大致工作原理,但是实际上P生产的消息不会直接放到Queue中,而是要经过Exchange,Exchange再将消息路由到一个或者多个Queue中,不符合路由规则的直接丢弃。(Exchange怎样确定将消息路由到哪个队列或者丢弃的呢?请看下面讨论Binding key和exchange type)。

  Exchange有四种类型,不同类型有着不同的策略。Exchange Type如下:

  fanout(广播):将发送到该Exchange的消息路由到所有它直接绑定的Queue中(不关心binding key)

    

 

  direct:把消息路由到那些binging key和routing key完全匹配的Queue中。

    如下图:C1订阅的Queue1使用binging key booking绑定Exchange,那么P发送的所有以booking为routing key的消息都会发送到Queue1中,也会上报给C1.(C2也是如此,因为其也绑定了booking)

    

  topic:topic基本同direct,其区别时direct是完全匹配,topic支持模糊匹配。*用于匹配一个单词,#用于匹配多个或0个单词(这里的单词指的是以点号分割的,如my.name对应 my name 两个单词)

    

    

 

Binding

  Binding是Exchange和Queue之间连接的桥梁。在绑定(Binding)Exchange和Queue的同时,一般指定一个Binging Key。Producer将消息发送到Exchange的时候,一般会产生一个Routing Key,当RoutingKey和Binding Key对应上的时候,消息就会发送到对应的Queue中。

Connection

  一个实际的tcp连接,生产者和消费者都是通过tcp连接到MQ中的。

Channel

  虚拟连接,建立在Connection连接的基础上,数据流动都是通过Channel来进行的。

  Bind:

 

posted @ 2018-12-01 15:29  exact  阅读(172)  评论(0编辑  收藏  举报