菜鸟笔记
提升您的技术认知

面试题

实现一个LRU Cache 算法LRU Cache C++三种解法java实现LRU算法及编码实现LRU策略缓存LRU算法常见缓存算法和LRU的c++实现设计循环双端队列(deque)LRU 缓存结构 (c++ 哈希双链表实现)LRU缓存机制删除单链表中的指定节点Linux 内核经典面试题拼多多社招面经:Redis是重点,讲一讲redis的内存模型线程、进程、协程的区别C++经典面试题面试官:我们只想要这样的C++工程师Linux C/C++ 学习路线链表操作汇总C++11的智能指针面试题浏览器中输入url后发生的事情常用的限流算法HTTP协议和HTTPS协议面试题网络编程面试题目总结c++后台面试题目如何实现LRU算法?如何寻找无序数组中的第K大元素?布隆过滤器 - 如何在100个亿URL中快速判断某URL是否存在?如何实现大整数相加?C++面试题及基本知识点总结C++给定出栈序列判定是否合法消息队列面试题要点redis缓存击穿,失效以及热点key解决方案网页在浏览器上的渲染过程几种限流算法lru算法例题C/C++常见面试知识点总结附面试真题----20210529更新引入MQ消息队列的作用及其优缺点MySQL面试篇社招三年后端面试题60道测开面试题,背完直接涨工资二叉树的层序遍历(两种方法实现)Bitmap 海量数据处理字符串倒序输出的五种方法C语言 输入10个数,统计出并输出正数、负数和0的个数字节三面:如何设计一个高并发系统架构,网络 面试36问,DDos攻击原理C++线程池使用 C++11 编写可复用多线程任务池

引入MQ消息队列的作用及其优缺点

阅读 : 1202

一、系统中为什么需要用到消息队列,使用消息队列有什么优点?

      使用消息队列的优点很多,这里就说比较重要的三个优点:解耦、异步、削峰填谷。

      ①、解耦:

      首先引入一个场景:系统A作位一个接口请求方,现在需要向B、C、D三个系统发送请求,这个时候呢A系统不需要发送请求给D系统了,而需要发送请求给E系统,那么在A系统里面就需要修改代码,每一次发送的请求方改变的话,都需要改代码,具有一定的耦合性。如下图:

        那么我们引入消息队列之后呢,A系统把需要发送的请求数据放到队列里即可,不需要关心哪个系统需要A系统的请求数据,如下图所示:

      ②、异步:

       在引入一个场景:用户请求A系统,然后A系统还需同步调用B、C、D系统的接口,我们假设一下再A系统处理自身业务逻辑请求了一个sql的时间是200ms,然后调用B系统等待B系统处理几个sql的时间是300ms,在调用C系统处理业务逻辑200ms,在调用D系统处理业务逻辑200ms,那么一次请求至少等待1秒才会响应。比较耗时,如下图所示:

         那么我们再引入消息队列之后,用户调用A系统花费了200ms,然后A系统发送三条消息到消息队列里面去,总耗时是5ms左右,然后B、C、D系统去消费就行了,总共只花费200ms左右,如下图所示:

       ③、削峰填谷

        当大量的用户(100万)通过浏览器再中午高峰期,同时进行大量的操作,会给数据库造成极大的压力,可能导致mysql宕机,如图所示:

但是中午高峰期过了的话,下午可能也就1万左右的用户在操作了,每秒50个请求左右,对系统没有任何压力,如果高峰期时将5000个请求写到MQ里面的话,系统A最多每秒执行2000个请求,不要超过每秒做大请求数就行,经过了2个小时的中午高峰期,再慢慢消费队列里面的消息,这个是可以接受的。如下图所示:

二、使用消息队列有什么缺点

上面说了引入消息队列的一些场景和优点,那么使用消息队列有什么缺点呢?

系统的可用性降低:比如第一个例子,本来好好的调用三个接口,这个时候接入一个消息队列,凑巧消息队列挂掉了,系统不是直接不能用了,崩溃掉了。

系统的复杂性:加入一个消息队列,若是消息丢失怎么办,消息被重复消费了,消息没有按找既定的顺序消费,都会导致系统出问题。

一致性问题:A系统处理完了直接返回成功了,那么用户就以为成功了,实际上,BC消费成功了,D消费失败了,数据就不一致了。

所以使用消息队列会使系统的复杂程度增加一个级别,但是需要用的时候还是得用,做好综合考量。