《隔离十四天》系列 -第五天 -关于消息中间件RabbitMQ的详解

前言

隔离第五天,依然是努力满满(渴望出去)的一天,今天的体温36度还是没有任何问题,感觉自己能吃下一头猪。当然了不管怎样学习还是不能停的,毕竟昨天又被面试官给虐了,真是惨不忍睹的面试。
在这里插入图片描述
好了,言归正传,昨天说到了Redis,我在看Redis这部分内容的时候尤其是我最近正在练习的一个项目涉及到了秒杀系统,而对于秒杀系统中用消息中间件来处理发送的请求给Redis,所以今天就说一下消息中间件,而我接触最多的就是RabiitMQ,所以就以RabbitMQ来说。下面进入正题。
在这里插入图片描述

1、简单队列模式

对于简单队列模式,该模式中只有一个生产者和一个消费者以及一个消息队列,生产者生产的消息存入队列中,消费者通过监听这个队列来进行消费消息。该模式的构造图如下:
在这里插入图片描述
这样的模式无法解决生产者生产消息过多,消费者消费太慢的问题,因此需要工作模式。

2、工作模式

在工作模式中,对于消息队列中的多个消息可以通过多消费者来消费这些消息,一个消费者消息一条消息。比如秒杀系统,当大量用的请求发送过来时,一台Redis去消费时会存在压力,此时通过设定Redis集群可以来减少一台Redis服务器的压力,从而加快消息的消费,构造图如下:
在这里插入图片描述
在此模式中RabbitMQ默认是轮询的方式进行分发服务,在分发服务时不会考虑消费者是否繁忙,或是否空闲的问题,这样就可能会导致效率高的消费者快速消费完消息,而效率慢的则一直还在处理中,导致产能过剩的问题,因此为了解决此问题,我们可以使用RabbitMQ中的basicQos( prefetchCount = 1)来解决,该方式是限制RabbitMQ只发送不超过一条的消息给同一个消费者,当这个消费者处理完成之后才会发送第二条。

但是对于一条消息需要告知多个服务的时候,此模式无法实现,比如在商城项目中,项目中存在ELK搜索服务以及前台页面服务,此时用户请求查询一个商品,那么我的商品微服务需要把这个商品的消息告知ELK微服务以及前台页面微服务,从而实现数据的搜索以及页面的展示,这样就需要订阅者模式。

3、订阅者模式

在订阅者模式中,生产者生产的同一条消息可以被多个消费者消费,从而可以解决一个消息告知多个服务的问题。此模式是通过一个交换机来实现,功能类似于我们网络中的交换机同样是做一个分发的功能,网络中的交换机分发ip,而RabbitMQ中的交换机是分发消息到队列,构造图如下:
在这里插入图片描述
在此模式中我们的消息最终存储是存储在消息队列中,而交换机知识作为一个分发工具。该模式中消息队列需要绑定交换机,两者绑定成功之后生产者生产的消息才能最终分发到消息队列中供消费者消费。

该模式中交换机分发消息知识无脑的分发,会把得到的消息都分发到各个消息队列中,但是实际中可能只有一个消息队列需要这条消息,而其它消息队列是用不到该消息的,这样就会存在一个消息过滤的问题,通过过滤消息来分发给指定的消息队列,使消息队列不会存在无用的消息,从而合理利用资源。

4、路由模式

对于分发指定消息到指定消息队列的问题,通过路由模式可以很好的解决,在路由模式中,会通过一个RoutingKey来设定一个key值,通过匹配这个key值来分发到指定的消息队列中,比如我们绑定两个消息队列到交换机中,其中一个消息队列的RoutingKeyupdate,另一个的RoutingKeyinsert,这样当生产者生产了一条insert的消息到交换机中,那么该消息就会被分发到insert的消息队列中,而不会分发到update队列中,构造图如下:
在这里插入图片描述
但是该模式中存在一个问题,如我有多中类型的消息。insertupdatedelete等等,那么就需要多个消息队列,而当我们的消息类型特别多时,绑定多个消息队列也会造成影响,所以我们是否可以通过一个消息队列绑定多个RoutingKey,这样实现多个类型共享一个消息队列。

5、主题模式

对于一个消息队列绑定多个RoutingKey的问题,这就需要主题模式来实现。在主题模式中同样也是绑定RoutingKey,但绑定时可以绑定多个,这样就实现了一个消息队列有多种消息类型。构造图如下:
在这里插入图片描述

6、消息确认机制

消费者消费消息时,若此时发生异常,导致消息没有成功消费,但此时服务器并不知道,因此还是继续执行。为了解决此问题,我们可以开启RabbitMQ中的确认机制ACK,设定自动确认为false,实现手动确认,这样消费者获取消息之后,服务器会将此消息设为不可用,然后等待消费者的反馈,反馈成功才认为成功消费。

7、消息持久化机制

生产者生产的消息存在于消息队列中,但若是RabbitMQ宕机,那么消息就会丢失,从而出现问题,那么对于这种问题,RabbitMQ中存在一个durable参数,通过设定durable来开启RabbitMQ的持久化,保存队列中的消息到磁盘中,从而实现数据的保存。

在这里插入图片描述

好了,写到这里感觉说了好多废话,此时有人会说不贴代码真垃圾,不是不贴,是贴了真的太长了你们根本看不下去,所以还是单独放在GitHub上吧,想看的自己下载看各种模式的demo。

以上关于RabbitMQ也是自己学习SpringCloud的一些积累,有理解错误或者技术上的问题欢迎指正共同进步。一个小菜鸡的知识整理而已,不标准多多指正。最后也祝各位找到高薪的工作。2020都要。。,好了还是不说了。

在这里插入图片描述

发布了92 篇原创文章 · 获赞 7 · 访问量 7538

猜你喜欢

转载自blog.csdn.net/qq_40126996/article/details/104348576