RabbitMQ java 运作时序图以及代码分析
RabbitMQ java 运作时序图以及代码分析
悟能的师兄 2018-05-29 22:54:22 95980 收藏 2
分类专栏: Rabbit MQ
版权
在使用前还是要再说一下 RabbitMQ 的使用方式很别扭,所以最好使用有使用 activeMQ 的经验或者至少知道 activeMQ 是怎么用的。
activeMQ 有两种队列方式:
p 2 p :生产者生产 ----》队列《-------- 消费者消费(通过队列名称去取)
provider :生产者生产 ----》广播《-------- 所有订阅的消费者都能拿到(发布订阅模式)
RabbitMQ 复杂到天花板,所以花点时间:
生产者生产 -------(vhost 信道)()
vhost 信道:这个简单理解为注册账户后必须绑定一个地址(高并发使用)
Exchange 交换机:direct 、fanout 、topic、handers 四种,每一种定义不一样,这个去百度吧,这里不再说了。使用的时候我们还需要定义个名称。
Routing key 路由键:生产者发送的消息都是通过这个键来找到对应的队列,假如没有这个队列,则消息扔掉。(很重要)
上面这个不友好理解的东西写完后我们开始进入正题:
2、Direct 运作模式
direct :使用方式,direct 交换机类型的 MQ 数据是直连的,因此路由键直接类型 map<key,value>, 加入 value 不存在,则发送至此 key(路由键) 找不到的队列,那么数据将不会存储。(这一点在基础理论上面有)。所以最好的是先穿件队列。或者直接启动 customer 端,因为 customer 里面必定有穿件队列的操作。
时序图:
代码:今天主要使用的是 RabbitMQ 的 direct 交换器,明天将上传 topic 使用以及代码:
GitHub 地址:Maven 工程
https://github.com/itliuxing/rabbitMQweb.git
3、topic 匹配模式
topic 匹配模式就比较简单了,直连交换器,生产者发送不同路由关键字的日志,消费者端通过绑定自己感兴趣的路由关键字来接收消息,进行完善日志系统。如果我想只接收生产者 com.test.rabbitmq.topic 包下的日志,其他包的忽略掉,之前的日志系统处理起来可能就非常麻烦,还好,我们有匹配模式,现在我们将生产者发送过来的消息按照包名来命名,那么消费者端就可以在匹配模式下使用【#.topic.*】这个路由关键字来获得感兴趣的消息。
简单总结,生产者生产一个消息:交换器创建类型:topic 路由键:com.email.info, 生产者发完后,RabbitMQ 通过匹配 *.* 的消费者什么的,然后发送给匹配成功的消费者。
匹配交换器
通过匹配交换器,我们可以配置更灵活的消息系统,你可以在匹配交换器模式下发送这样的路由关键字:
“a.b.c”、“c.d”、“quick.orange.rabbit”
不过一定要记住,路由关键字【routingKey】不能超过 255 个字节(bytes)
匹配交换器的匹配符
*(星号)表示一个单词
#(井号)表示零个或者多个单词
示例说明:
这一章的例子中,我们使用三个段式的路由关键字,有三个单词和两个点组成。第一个词是速度,第二个词是颜色,第三个是动物名称。
我们用三个关键字来绑定,Q1 绑定关键字是【.orange.】,Q2 绑定关键字是【..rabbit】和【lazy.#】,然后分析会发生什么:
Q1 会收到所有 orange 这种颜色相关的消息
Q2 会收到所有 rabbit 这个动物相关的消息和所有速度 lazy 的动物的消息
分析:
生产者发送“quick.orange.rabbit”的消息,两个队列都会收到
生产者发送“lazy.orange.elephant”,两队列也都会收到。
生产者发送 "quick.orange.fox",那么只有 Q1 会收到。
生产者发送 "lazy.brown.fox",那么只会有 Q2 能收到。
生产者发送 "quick.brown.fox",那么这条消息会被丢弃,谁也收不到。
生产者发送 "quick.orange.male.rabbit",这个消息也会被丢弃,谁也收不到。
生产者发送 "lazy.orange.male.rabbit",这个消息会被 Q2 的【lazy.#】规则匹配上,发送到 Q2 队列中。
看下面的流程图就很简单了,嗯灰常简单:
新代码已更新至 GitHub:
4、fanout 广播模式
实在太简单了,fanout 交换机的广播模式,是对全交换机内的队列发送消息。这样就能对全队列进行消息写入了
代码更新至 GitHub:Maven 工程
https://github.com/itliuxing/rabbitMQweb.git
其实看完第一个队列的处理机制,我想后面的两个都很好理解了,就是那个交换机,路由键,队列 混在一起感觉莫名其妙。
本文档写到这里就写完了,随着完档的完结,我自己也收获到了 rabbitmq 的设计思路以及简单使用的方式方法,后面会结合一些真实的业务以及配合 spring 做一点代码操作.
————————————————
版权声明:本文为 CSDN 博主「悟能的师兄」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yexiaomodemo/java/article/details/80503453