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 里面必定有穿件队列的操作。

 

时序图:

null

 

代码:今天主要使用的是 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