定制化网站开发报价,百度seo网络营销书,山东网站建设xywlcn,网站 外包合同MQ消息队列详解以及MQ重复消费问题 1、解耦2、异步调用3、流量削峰4、MQ重复消费问题#xff0c;以及怎么解决#xff1f;4.1、重复消费产生4.2、解决方法#xff1a; https://blog.csdn.net/qq_44240587/article/details/104630567 核心的就是#xff1a;解耦、异步、削锋… MQ消息队列详解以及MQ重复消费问题 1、解耦2、异步调用3、流量削峰4、MQ重复消费问题以及怎么解决4.1、重复消费产生4.2、解决方法 https://blog.csdn.net/qq_44240587/article/details/104630567 核心的就是解耦、异步、削锋
1、解耦
现有ABCDE五个系统最初的时候BCD三个系统都要调用A系统的接口获取数据一切都很正常但是突然D系统说我不要了你不用给我传数据了A系统无奈只能修改代码将调用D系统的代码删除这时候还没删除呢E系统发送了请求但是A系统这时候还没处理完D系统的请求A系统卒彻底崩溃。看下图↓↓↓↓↓↓↓↓↓↓↓
上述场景中BCDE都需要用到A系统提供的数据A系统跟其他四个系统严重耦合需要时时刻刻考虑其他四个系统要是挂了怎么办需不需要重新发送数据给他们这个时候的A系统内心是崩溃的。但是如果使用了MQ之后 A系统的数据只需要放到MQ里面其他的系统想请求获取数据只需要去MQ里面消费即可如果突然不想请求了就取消对MQ的消费就行了A系统根本不需要考虑给谁去响应这个数据也不需要去维护代码也不用考虑其他系统是否调用成功失败超时等情况。详细看下图↓↓↓↓↓↓↓↓ 总结通过MQ发布订阅消息的模型A系统就成功的跟其他系统解耦了。 面试技巧你需要思考一下在你自己的系统里面有没有类似的情况一个系统或者模块调用了多个系统或者模块它们互相之间的调用非常复杂并且维护起来很麻烦但其实这个调用是不需要直接同步调用接口的如果用MQ给它异步化解耦也是可以的你就需要思考在你的项目里是不是可以用MQ给它进行系统的解耦可以自己组织一下语言回答。
2、异步调用
场景二还是ABCD四个系统A系统收到一个请求需要在自己本地写库还需要往BCD三个系统写库A系统自己写本地库需要3ms往其他系统写库相对较慢B系统200ms C系统350msD系统400ms这样算起来整个功能从请求到响应的时间为3ms200ms350ms400ms953ms接近一秒对于用户来说点个按钮要等这么长时间基本是无法接受的正常来讲互联网行业通常要求是响应时间200ms。详情如下图↓↓↓↓↓↓
一般的互联网企业对于用户请求响应的时间超时了所以上面的现象是不可取的 如果用了MQ用户发送请求到A系统耗时3msA系统发送三条消息到MQ假如耗时5ms用户从发送请求到相应3ms5ms8ms仅用了8ms用户的体验非常好。 3、流量削峰
场景三这次举个实例吧也是近期发生的我们都知道 2020年爆发的这场新冠病毒导致各大线上商城APP里面的口罩被抢购一空在这种情况下JD商城开启了一场每晚八点的抢购3Q口罩的活动每天下午三点进行预约晚上八点抢购从JD商城刚上线这个活动我连续抢了近一个周也算是见证了一个百万并发量系统从出现问题到完善的一个过程最初第一天我抢购的时候一百多万预约到八点抢购估计也能有百万的并发量可是第一天到八点我抢的时候由于并发量太高直接把JD服务器弄崩了直接报了异常可能JD在上线这个活动的时候也没能够想到会有那么高的并发打了一个猝不及防但是这只是在前一两天出现报异常的情况后面却没有再出现异常信息到后来再抢购只是响应的时间变得很慢但是JD系统并没有崩溃这种情况下一般就是用了MQ或者之前用了MQ这次换了个吞吐量级别更高的MQ也正是利用了MQ的三大好处之一——削峰。
JD系统每天0—19点系统风平浪静结果一到八点抢购的时候每秒并发达到百万 假设JD数据库没秒能处理1.5w条并发请求并非实际数据主要为了举例,到八点抢购的时候每秒并发百万这直接导致系统异常但是八点一过可能也就几万用户在线操作每秒的请求可能也就几百条对整个系统毫无压力。 如果使用了MQ每秒百万个请求写入MQ因为JD系统每秒能处理1W的请求JD系统处理完然后再去MQ里面再拉取1W的请求处理每次不要超过自己能处理的最大请求量就ok这样下来等到八点高峰期的时候系统也不会挂掉但是近一个小时内系统处理请求的速度是肯定赶不上用户的并发请求的所以都会积压在MQ中甚至可能积压千万条但是高峰期过后每秒只会有一千多的并发请求进入MQ但是JD系统还是会以每秒1W的速度处理请求所以高峰期一过JD系统会很快消化掉积压在MQ的请求在用户那边可能也就是等的时间长一点但是绝对不会让系统挂掉。
消息队列的缺点 虽然好处挺多但是万一MQ挂掉了呢那样你系统不也就挂掉了 系统复杂程度提高
所以中小型公司技术实力较为一般技术挑战不是特别高用RabbitMQ是不错的选择
4、MQ重复消费问题以及怎么解决
4.1、重复消费产生
1、生产者生产者可能会重复推送一条数据到MQ中比如Colltroller节课被重复调用了两次没有做节课幂等性导致的。
2、MQ在消费者从MQ中获取了数据并准备给响应ACK消息到MQ时这时MQ突然挂掉了导致MQ以为消费者还未消费该数据MQ恢复后再次推送了该条信息导致重复消费。
3、消费者消费者已经消费完信息正准备但是还未响应给MQ信息时此时消费者挂了服务重启后MQ以为消费者还未接收到该消息再次推送了该条消息。 4.2、解决方法
1、使用数据库唯一键约束 缺点局限性很大仅仅只能用在我们数据新增场景并且性能也比较低。
2、生产者发送消息的时候带上一个全局唯一的id,消费者拿到消息后先根据这个id去redis里查一下之前有没消费过没有消费过就处理并且写入这个id到redis如果消费过了则不处理。