RabbitMQ 实战(三)RabbitMQ 中的交换器

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

这篇文章主要讲 RabbitMQ 中的交换器。

我们不是把消息直接发送到队列里面的,而是先发送到了交换器,交换器再根据路由键把我们的消息投递到对应的队列。

交换器的类型

每种交换器定义了不同的路由算法来把消息投递到对应的队列。

RabbitMQ 中交换器主要分为四种类型:direct、fanout、topic 以及 headers,headers 用的比较少,就不讲了。

direct

路由键全文匹配

当你发送一条消息到 direct 交换器时,它会根据路由键全文匹配去寻找绑定到此交换器上的匹配成功的队列,然后投递消息。

RabbitMQ 实战(三)RabbitMQ 中的交换器_第1张图片

如上图,生产者使用路由键 “fruit.apple” 发送消息到 direct 交换器,交换器会根据绑定信息,全文匹配路由键,所以只有 apple 队列符合。

fanout

忽略路由键

当你发送一条消息到 fanout 交换器时,它会把消息投递给所有绑定到此交换器上的队列,而且会忽略路由键

RabbitMQ 实战(三)RabbitMQ 中的交换器_第2张图片

如上图,生产者使用路由键 “fruit.apple” 发送消息到 fanout 交换器,但是交换器会忽略路由键,所以 apple 队列、banana 队列、orange 队列都符合。

topic

路由键通配符匹配

当你发送一条消息到 topic 交换器时,它会根据路由键通配符匹配去寻找绑定到此交换器上的匹配成功的队列,然后投递消息。

RabbitMQ 实战(三)RabbitMQ 中的交换器_第3张图片

如上图,生产者使用路由键 “fruit.apple” 发送消息到 topic 交换器,交换器会根据绑定信息,通配符匹配路由键,所以 apple 队列、banana 队列、orange 队列都符合。

  • 可以使用操作符 “#” 配置所有的规则。
  • “*” 操作符将 “.” 视为分割符。
  • “#” 操作符没有分块的概念,它将任意 “.” 字符均视为关键字的匹配部分。

运行项目

先加入运行参数,因为几个交换器配置都在一个项目里面,会导致 Bean 冲突,所以使用 @Profile("direct")@Profile("fanout")@Profile("topic") 区分了不同环境下的启用不同的配置。

RabbitMQ 实战(三)RabbitMQ 中的交换器_第4张图片

  • 测试 direct 交换器:--spring.profiles.active=direct
  • 测试 fanout 交换器:--spring.profiles.active=fanout
  • 测试 topic 交换器:--spring.profiles.active=topic

RabbitMQ 实战(三)RabbitMQ 中的交换器_第5张图片

运行项目,然后打开浏览器,输入 http://localhost:9999/sendMessage

测试 direct 交换器

RabbitMQ 实战(三)RabbitMQ 中的交换器_第6张图片

测试 fanout 交换器

RabbitMQ 实战(三)RabbitMQ 中的交换器_第7张图片

测试 topic 交换器

RabbitMQ 实战(三)RabbitMQ 中的交换器_第8张图片

源码地址

  • GitHub

参考资料

RabbitMQ for Windows: Exchange Types

结语

由于本人知识和能力有限,文中如有没说清楚的地方,希望大家能在评论区指出,以帮助我将博文写得更好。

转载于:https://my.oschina.net/u/3523423/blog/1618793

你可能感兴趣的:(RabbitMQ 实战(三)RabbitMQ 中的交换器)