MQ,究竟如何做到削峰填谷? 糖太宗 • 2022年5月15日 下午9:11 • 技术 • 阅读 21 MQ,很多的应用场景,是消息的订阅发布,是系统上下游的解耦,MQ的还有一个典型应用场景是缓冲流量,削峰填谷,本文将简单介绍下,MQ要怎么实现缓冲流量,削峰填谷。 站点与服务上下游之间,一般如何通讯? 有两种常见的方式。 一种是“直接调用”,通过RPC框架,上游直接调用下游。 一种是“MQ推送”,上游将消息发给MQ,MQ将消息推送给下游。 这两种方式,能否缓存流量,能否削峰填谷? 不能。不管采用“直接调用”还是“MQ推送”,都有一个缺点,下游消息接收方无法控制到达自己的流量,如果调用方不限速,很有可能把下游压垮。 举个栗子,秒杀业务: 上游:发起下单操作。 下游:完成秒杀业务逻辑(库存检查,库存冻结,余额检查,余额冻结,订单生成,余额扣减,库存扣减,生成流水,余额解冻,库存解冻)。 上游下单业务简单,每秒发起了10000个请求,下游秒杀业务复杂,每秒只能处理2000个请求,很有可能上游不限速的下单,导致下游系统被压垮,引发雪崩。 如何避免下游被压垮呢? 为了避免雪崩,常见的优化方案有两种: (1)业务上游队列缓冲,限速发送; (2)业务下游队列缓冲,限速执行; 不管哪种方案,都会引入业务的复杂性,有“缓冲流量”需求的系统都需要加入类似的机制,正所谓“通用痛点统一解决”,需要一个通用的机制解决这个问题。 能否通过MQ实现缓冲流量? 可以,但需要简单修改。 MQ要怎么改,能缓冲流量? 由MQ-server推模式,升级为MQ-client拉模式。 MQ-client根据自己的处理能力,每隔一定时间,或者每次拉取若干条消息,实施流控,达到保护自身的效果。并且这是MQ提供的通用功能,无需上下游修改代码。 如果上游发送流量过大,MQ提供拉模式确实可以起到下游自我保护的作用,会不会导致消息在MQ中堆积? 下游MQ-client拉取消息,消息接收方能够批量获取消息,需要下游消息接收方进行优化,方能够提升整体吞吐量,例如:批量写。 结论 (1)MQ-client提供拉模式,定时或者批量拉取,可以起到削平流量,下游自我保护的作用(MQ需要做的); (2)要想提升整体吞吐量,需要下游优化,例如批量处理等方式(消息接收方需要做的); 架构优化要整体考虑,需要通用服务和业务方一起优化升级。 真人出镜,欢迎关注+点赞 发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/6873 MQ 赞 (0) 打赏 微信扫一扫 支付宝扫一扫 糖太宗 0 0 生成海报 为什么古法黄金一直广受欢迎?古法黄金工艺大揭秘 上一篇 2022年5月15日 下午8:48 不用缓存服务,还能怎么缓存数据? 下一篇 2022年5月15日 下午9:13 相关推荐 技术 Redis为什么又引入了多线程?难道作者也逃不过“真香定理”? 相信你一定不止一次见过Redis是单线程模式,不过说实话那只是个老版本,这个问题是一位老哥的大厂面试题,跟我分享了一下。想着自己就知道redis6.0以前一直都是单线程,到了6的版本才加入了多线程,还不是很清楚,在多方打听并且搜索之下总结了这篇文章。 一、问题概述 Redis 6.0 之后的版本抛弃了单线程模型这一设计,原本使用单线程运行的 Redis 也开... 糖太宗 2022年4月1日 17000 proxychains_error 在使用proxychains代理时,报了个错误 1 2 ProxyChains-3.1 (http://proxychains.sf.net) ERROR: ld.so: object 'libproxychains.so.3' from LD_PRELOAD cannot be preloaded (cannot open shared object fi... 常山赵子龙 技术 2022年6月13日 30000 技术 我C,一个库里Curry几百个表,这谁受得了? 随着业务越来越复杂,数据量越来越大,并发量越来越大,数据库的性能越来越低。好不容易找运维申请了两台机器,让DBA部署了几个实例,想把一些业务库拆分出来,却发现一个库里几百个表,拆不出来,扩不了容,尴尬! 因为数据库强关联在一起,无法通过增加数据库实例扩容,就是一个耦合的典型案例。 什么样的场景会出现这类耦合? 举个栗子。 有一个公共用户数据库DB... 糖太宗 2022年5月11日 11000 token的使用 Token,就是令牌,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来,那么,Token有什么作用?又是什么原理呢? Token一般用在两个地方: 防止表单重复提交 anti csrf攻击(跨站点请求伪造) 两者在原理上都是通过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放... 常山赵子龙 技术 2022年5月27日 18000 java接口测试面试题 如何部署环境? 以docker为例java语言为主: 1、程序员编写完代码之后, 2、然后编写了docker file文件, 3、我通过docker file 构建成镜像之后, 4、运行整个镜像,容器启动之后,我们的环境就部署完毕了 如果程序出错,如何定位到错误日志? 整个分为2种情况 第一种:如果整个程序是使用docker容器来部署的,运行整个程序的 ,那... 糖太宗 技术 2022年5月21日 25000 发表回复 您的电子邮箱地址不会被公开。 必填项已用*标注*昵称: *邮箱: 网址: 记住昵称、邮箱和网址,下次评论免输入 提交