RabbitMQ三种Exchange模式

RabbitMQ中,全部生产者提交的消息都由Exchange来接受,而后Exchange按照特定的策略转发到Queue进行存储性能

RabbitMQ提供了四种Exchange:fanout,direct,topic,header。但经常使用的主要是fanout,direct,topic。blog

性能排序:fanout > direct >> topic。比例大约为11:10:6排序

一.Fanout Exchange队列

任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的全部Queue上。路由

1.能够理解为路由表的模式字符串

2.这种模式不须要RouteKeyit

3.这种模式须要提早将Exchange与Queue进行绑定,一个Exchange能够绑定多个Queue,一个Queue能够同多个Exchange进行绑定。im

4.若是接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。error

二.Direct Exchangetop

任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue

1.通常状况可使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下文称其为default Exchange)。

2.这种模式下不须要将Exchange进行任何绑定(binding)操做

3.消息传递时须要一个“RouteKey”,能够简单的理解为要发送到的队列名字。

4.若是vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。

 

三.Topic Exchange

任何发送到Topic Exchange的消息都会被转发到全部关心RouteKey中指定话题的Queue上

1.这种模式较为复杂,简单来讲,就是每一个队列都有其关心的主题,全部的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到全部关注主题能与RouteKey模糊匹配的队列。

2.这种模式须要RouteKey,也许要提早绑定Exchange与Queue。

3.在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心全部涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。

4.“#”表示0个或若干个关键字,“*”表示一个关键字。如“log.*”能与“log.warn”匹配,没法与“log.warn.timeout”匹配;可是“log.#”能与上述二者匹配。

5.一样,若是Exchange没有发现可以与RouteKey匹配的Queue,则会抛弃此消息。