RabbitMQ的几种交换器-----区别和特点

原文链接: https://blog.csdn.net/chendaoqiu/article/details/48440633

简介:

RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储
RabbitMQ提供了四种Exchange:fanout,direct,topic,header
header模式在实际使用中较少,本文只对前三种模式进行比较,除了其匹配规则是匹配header中的参数外,其余的和direct很相似,但是性能相差甚远。

一.Direct Exchange

RabbitMQ的几种交换器-----区别和特点_第1张图片
任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。

  1. 一般情况可以使用rabbitMQ自带的Exchange:””(该Exchange的名字为空字符串,下文称其为default Exchange)。
  2. 这种模式下不需要将Exchange进行任何绑定(binding)操作
  3. 消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
  4. 如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。

一些说明:

  1. 实现 指定类型的消息只能被部分队列消费, 我们可以通过direct的routingkey 在绑定交换机和队列的时候 指定消息传递的路径;
  2. 相较于topic-exchange ,direct-exchange有一个缺点:routingkey 路由 只能完全匹配;

二.Fanout Exchange

RabbitMQ的几种交换器-----区别和特点_第2张图片
任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。

  1. 可以理解为路由表的模式
  2. 这种模式不需要RouteKey
  3. 这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。
  4. 如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。

一些说明:

  1. 可以有多个消费者,但是只有一个消费者可以消费成功;
  2. 扇形交换器,无脑的广播消息给所有与之绑定的队列;
  3. 声明一个交换机,其中俩参数说明:
    (1)durable:是否持久化,如果true,则当前RabbitMQ重启的时候,它依旧存在
    (2)autoDelete:当没有生成者/消费者使用此交换机时,此交换机会被自动删除。
  4. 声明代码:
// 声明一个fanout交换机
channel.exchangeDeclare(EXCHANGE_NAME,BuiltinExchangeType.FANOUT, false, false, null);
// 发送消息
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
  1. 扇形交换机的消息传递是 只要绑定了这个交换机 就可以消费消息,所以Routingkey没有用;

三.Topic Exchange

RabbitMQ的几种交换器-----区别和特点_第3张图片
任何发送到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.#”能与上述两者匹配。

一些说明:

  1. 路由键中特殊匹配字符说明
    (1)*(星号)可以代替一个字。
    (2)#(散列)可以代替零个或多个单词。
  2. 路由键条件:
    (1)必须由英文字符组成,使用“.”号隔开;
    (2)路由键的长度 最长255字节;
5.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息。

版权声明:本文为CSDN博主「道秋adol」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chendaoqiu/article/details/48440633

你可能感兴趣的:(RabbitMQ)