RabbitMQ是众多消息中间件中的一种。
为什么使用 RabbitMQ ?
这就不得不说一下RabbitMQ的作用了。
RabbitMQ的作用
直接三大作用: 异步,解耦,削峰。
1、异步
异步, 其实也就类似多线程一样,在我们实际开发中最经常使用的场景就是,我们可能处理完成一个业务,想要发邮件的方式来通知用户。又因为这个发邮件只是通知用户,对实际的业务又没有任何影响,所以我们就可以把发邮件的部分使用RabbitMQ的这种异步方式实现,缩短了程序的应时间。
异步,缩短了响应时间。
2、解耦
因为现在都是微服务架构的模式,每个服务自制的原则,所以解耦就更适用于微服务。解耦使两个服务之间的耦合度直接降低,两个服务互不影响, 服务1不会因为服务2的某个接口的改动而不得已也要修改服务1的对应代码。所以更好的隔离了服务与服务之间的依赖关系。
解耦,两个服务互不影响。
3、削峰(流量控制)
在高并发场景下,服务器可能不能承受一时间的巨大压力,这时候就可以使用消息队列来解决,我们的瞬时并发全部都写入到消息队列中,我们实际的耗时较长的业务服务,可以再后台慢慢的去一个一个获取消息队列中的消息,一个个去消费,这就缓解了服务的压力。
1w用户请求同时下单时,200s 后所有的用户请求就都已经被处理完成接到反馈。,但是处理后续业务逻辑的服务,这时才只执行到第67个用户的下单业务逻辑, 但是这不影响用户的体验,服务器也不会宕机.
RabbitMQ的核心构成
1、Message 消息
消息,它由消息头和消息体组成。而消息头则由一系列的可选属性组成,其中有个最重要的参数是routing-key(路由键)他是用来匹配队列的,其他还有很多参数,我就不介绍了,感兴趣可以查看源代码或者官网文档了解。
2、Publisher 生产者
也就是我们消息的发送者,是我们自己的一个服务。
3、Consumer 消费者
也就是我们消息的消费者,也是我们自己的一个服务。
4、Connection 链接
网络连接,就相当于TCP,消息队列的连接是长连接模式。
5、Channel 信道
信道,一个连接中存在多个信道,每个信道就是一个信息的传输通道。
6、Virtual Host 虚拟主机
一个RabbitMQ中可以有多个虚拟主机,每个虚拟主机之间相互隔离,其实就是类似于java 的 jvm,就是每个虚拟主机是相互独立的,自己去处理自己的一套完整的消息发送接受流程。我们的每一次给消息队列发送消息最后又消费消息都是在一个虚拟主机下完成的。
7、 Broker 服务器实体
意思就是这个RabbitMQ服务器实体。
8、Queue 队列
消息队列,用来保存生产者发给消费者的消息。
9、Exchange 交换机
交换机是重要组成部分,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
就是交换机在把消息发给队列的时候,要去匹配我到底要发给那个队列。这时候就使用我们上边Message中提到的routing-key来匹配队列。 routing-key要和我们Exchange和Queue的binging中的routing-key一模一样才会把消息发送。
fanout :广播
这种模式不在匹配 routing-key 来发送到指定的队列。只要消息发给Exchange,Exchange就会把这个消息发给他绑定的所有Queue。
topic:发布订阅
这个模式与direct略有不同,direct是 routing-key 的匹配必须一模一样。而topic模式其实就是给routing-key 的匹配方式又添加了(#、*)的这种通配符。只要能通配匹配上就发送给对应的Queue。
headers
这个好像不太常用
10、Binding 绑定
绑定,用于交换机和消息队列的绑定关系,一个绑定就是基于 routing-key(路由键)将交换机和队列连接起来的路由规则。
RabbitMQ的简单工作流程
ok,这篇文章介绍RabbitMQ的基本知识,下篇介绍RabbitMQ的实战及如何实现消息可靠投递。
感谢大家观看。