首页 > 其他分享 >为什么使用消息队列?我这样回答,面试官直说讲得很清楚

为什么使用消息队列?我这样回答,面试官直说讲得很清楚

时间:2023-01-09 11:36:14浏览次数:58  
标签:面试官 请求 队列 直说 系统 高峰期 消息 写库

为什么要使用消息队列,六个字总结:解耦、异步、消峰

1)解耦

传统模式下系统间的耦合性太强。怎么说呢,举个例子:系统 A 通过接口调用发送数据到 B、C、D 三个系统,如果将来 E 系统接入或者 B 系统不需要接入了,那么系统 A 还需要修改代码,非常麻烦。

如果系统 A 产生了一条比较关键的数据,那么它就要时时刻刻考虑 B、C、D、E 四个系统如果挂了该咋办?这条数据它们是否都收到了?显然,系统 A 跟其它系统严重耦合。

而如果我们将数据(消息)写入消息队列,需要消息的系统直接自己从消息队列中消费。这样下来,系统 A 就不需要去考虑要给谁发送数据,不需要去维护这个代码,也不需要考虑其他系统是否调用成功、失败超时等情况,反正我只负责生产,别的我不管。

2)异步

先来看传统同步的情况,举个例子:系统 A 接收一个用户请求,需要进行写库操作,还需要同样的在 B、C、D 三个系统中进行写库操作。如果 A 自己本地写库只要 1ms,而 B、C、D 三个系统写库分别要 100ms、200ms、300ms。最终请求总延时是 1 + 100 + 200 + 300 = 601ms,用户体验大打折扣。

如果使用消息队列,那么系统 A 就只需要发送 3 条消息到消息队列中就行了,假如耗时 5ms,A 系统从接受一个请求到返回响应给用户,总时长是 1 + 5 = 6ms,对于用户而言,体验好感度直接拉满。

3)消峰

如果没有使用缓存或者消息队列,那么系统就是直接基于数据库 MySQL 的,如果有那么一个高峰期,产生了大量的请求涌入 MySQL,毫无疑问,系统将会直接崩溃。

那如果我们使用消息队列,假设 MySQL 每秒钟最多处理 1k 条数据,而高峰期瞬间涌入了 5k 条数据,不过,这 5k 条数据涌入了消息队列。这样,我们的系统就可以从消息队列中根据数据库的能力慢慢的来拉取请求,不要超过自己每秒能处理的最大请求数量就行。

也就是说消息队列每秒钟 5k 个请求进来,1k 个请求出去,假设高峰期 1 个小时,那么这段时间就可能有几十万甚至几百万的请求积压在消息队列中。不过这个短暂的高峰期积压是完全可以的,因为高峰期过了之后,每秒钟就没有那么多的请求进入消息队列了,但是数据库依然会按照每秒 1k 个请求的速度处理。所以只要高峰期一过,系统就会快速的将积压的消息给处理掉。

小伙伴们大家好呀,本文首发于公众号@飞天小牛肉,阿里云 & InfoQ 签约作者,分享大厂面试原创高质量题解、原创技术干货和成长经验。回复春秋招我拉你进求职吹水交流群,回复Echo免费获取社区项目手把手教程)

标签:面试官,请求,队列,直说,系统,高峰期,消息,写库
From: https://www.cnblogs.com/cswiki/p/17036515.html

相关文章

  • 面试官:数据库日期类型字段,需要兼容不同数据库,应该如何选择?
    作者:sp42a来源:https://zhangxin.blog.csdn.net/article/details/124955363当设计一个产品,其中很多地方要把日期类型保存到数据库中,如果产品有兼容不同数据库产品的需求,那......
  • 数组模拟环形队列
    图示:代码:1importjava.util.Scanner;23publicclassRingQueueTest{4publicstaticvoidmain(String[]args){5//创建一个环形队......
  • Python 实现栈与队列
    栈栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:po......
  • 【Java】四种引用和引用队列的概念
    四种引用类型强引用(StrongReference)强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用:Objectobject=newObject();Stringstr=......
  • 优先队列
    头文件#include<queue>定义priority_queue<Type,Container,Functional>Tyoe:数据类型Container:容器类型(内存连续)Functional:比较方式升序队列priority_queue<int,......
  • 【优先队列】LeetCode 23. 合并K个升序链表
    题目链接23.合并K个升序链表思路把全部结点放入优先队列中,然后再依次组成新链表代码classSolution{publicListNodemergeKLists(ListNode[]lists){......
  • 使用ThreadPoolExecutor and schedule进行创建线程池(多线程-定时任务-数据同步-任务队
    使用ThreadPoolExecutorandschedule进行创建线程池(多线程-定时任务-数据同步-任务队列)#使用ThreadPoolExecutorandschedule进行创建线程池(多线程-定时任务-数据同步-......
  • 【优先队列】LeetCode 347. 前 K 个高频元素
    题目链接347.前K个高频元素思路前k大模板题代码classSolution{publicint[]topKFrequent(int[]nums,intk){PriorityQueue<Map.Entry<Integer,......
  • 【优先队列】LeetCode 973. 最接近原点的 K 个点
    题目链接973.最接近原点的K个点思路使用优先队列处理前k大问题代码classSolution{classNode{intx;inty;doubledistance;......
  • 单调队列
    单调队列前言图床在\(Github\)中,如果访问不了\(Github\),则图片无法加载引入原题链接:P1886滑动窗口/【模板】单调队列-洛谷题意简述:有一个长度为\(n\)的数......