RabbitMQ java 运作时序图以及代码分析


在使用前还是要再说一下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做一点代码操作.

猜你喜欢

转载自blog.csdn.net/yexiaomodemo/article/details/80503453