我们的订单系统的逻辑架构图下:

上述架构存在如下问题:

  • 同步调用问题:用户支付完一笔订单,订单系统就要同步执行一系列接口调用,导致响应慢,用户体验差;

  • 性能问题:瓶颈在数据库,无法应对“促销”之类的活动带来的峰值流量;

  • 耦合问题:积分、促销、通知、物流应当与核心链路解耦;

  • 大数据传输问题:外部系统会从订单数据库里查询订单数据,消耗系统本身的资源;

  • 状态补偿问题:”中间状态“的订单通过批量扫描的方式进行状态补偿,效率非常低。

本章,我们来解决同步调用问题耦合问题性能问题

一、异步

首先,我们分析下整个业务的核心链路。用户支付完成后,最关键的是什么?是更新订单状态以及扣减库存,一旦用户支付成功,只要保证订单状态变为“支付成功”,库存扣减成功,这样核心数据就不会错乱。而诸如物流发货、短信通知、增加积分、促销优惠券之类的操作完全可以异步化:

上图中,我们引入RocketMQ后,当订单系统更新完订单状态和扣减成功库存后,就发送一条“支付成功”消息到MQ中,然后立即返回。而物流、短信、积分、促销系统会订阅MQ中的该类消息,它们收到通知后就会去异步处理。

通过引入MQ,整个系统的响应时间可以大大缩短。比如,订单系统本身操作需要耗费30ms,调用库存系统接口进行库存扣减耗费80ms,增加积分耗费50ms,派发优惠券耗费60ms,发送短信耗费100ms,通知发货耗费500ms。

如果没有引入MQ进行架构改造,每次支付成功后的大量同步接口调用,耗时可能接近1秒钟,而改造后,只需要100ms就可以完成响应。

RocketMQ中的Producer支持三种发送消息的模式:同步、异步回调、单向异步;Consumer支持两种消费消息的模式:Push模式、Pull模式。具体采用哪种模式,需要结合具体的业务场景去分析,我会在后面的章节对生产者和消费者的原理进行介绍。

二、解耦

解耦和异步是同生同源的,我们经过上述的异步化改造后,自然而然的就已经将物流、短信、积分、促销系统解耦出去了。

三、削峰

针对“促销”场景下的高并发访问问题,瓶颈主要在数据库。所以,我们必须限制直接打到数据库上的流量。我们假设“促销”是针对某些商品的秒杀活动,那么可以从以下几个维度进行改造:

  1. 前端页面:设置校验(验证码、答题),阻止作弊器刷单;

  2. 独立出“秒杀系统”,专门负责处理“秒杀”活动的请求,避免对正常的订单系统造成影响;

  3. 库存预先写入Redis,基于Redis做高并发下的库存扣减,一旦库存不足,拒绝掉后续所有秒杀请求;

  4. 扣减库存成功的秒杀请求,先进入MQ,然后由订单系统订阅消息并下单。

3.1 前端控制

前端控制其实很好理解,肯定会有人在秒杀活动开始前不断的刷商品详情页,那么在秒杀活动开始的那一瞬间,就会同时涌入大量请求。如果采用验证码或答题方式,就可以将请求错峰,因为不同人的答题速度肯定不一样,这样就从源头减少了并发请求数。

此外,肯定还会有人写作弊脚本进行秒杀,答题的方式可以有效屏蔽这种作弊请求。

3.2 独立服务

一般针对“秒杀”这种促销活动,需要独立出一套单独的服务进行部署,避免对正常的订单服务造成影响。如上图中,我们对订单系统部署了两个集群,一个集群是秒杀系统集群,一个集群是普通订单系统集群。即使秒杀系统因业务量太大挂了,也不会普通下单请求出现问题。

3.3 库存预热

由于秒杀商品的数量是有限制的,且在业务上一般会提前预告,所以我们可以将秒杀商品的库存提前写到Redis中。因为如果直接让秒杀系统调用库存系统的接口,进行下单,会对库存系统造成非常大的压力,而Redis的性能是非常好,可以轻松扛个上万并发请求。

此外,当Redis中的库存不足后,可以直接拒绝请求,大幅削减后续无效请求对秒杀系统造成的压力。

3.4 MQ排队

接下来我们考虑下,假设1秒钟内秒杀成功了1万件商品,即Redis中库存都扣减成功了,那么如果秒杀系统此时直接去访问数据库创建订单,数据库可能会直接宕掉。

所以秒杀系统此时可以发送一个“秒杀成功”的消息到MQ中,由普通订单系统从MQ中消费秒杀成功的消息,进行常规性的操作即可。因为瞬间上万并发的压力对RocketMQ来说可以轻松扛下,普通订单系统可以根据自己的工作负载,慢慢从MQ中消费消息,然后操作数据库,这样就不会对数据造成很大的压力。

四、总结

本章,我们针对案例系统中存在的部分问题进行了分析,并通过RocketMQ对其进行了改造。消息中间件的核心功能就是异步、解耦、削峰。后续章节,我们会继续解决案例中剩余的几个问题。

另外,引入MQ后其实也会带来整个系统的复杂度上升,比如消息丢失问题、消息有序问题、数据一致性问题等等,后面会一一介绍

用上 RocketMQ,系统性能提升了 10 倍!相关推荐

  1. 面试官:我想用Nginx提升系统10倍性能,你有哪些建议?

    提升Web应用的性能从未像今天这样刻不容缓. 在线经济活动的比例日益提高,就连发展中国家和地区的经济活动都已经有5%以上在线进行了(相关数据请参考本文后面的资源).在这个超级链接.随时在线的现代世界, ...

  2. 百度怎么进行模糊搜索_怎么在百度上准确搜索,提高10倍效率?

    人生下来就喜欢问为什么 ?小时候爱问父母,父母会直接告诉我们答案:长大后我们就用搜索引擎,百度.谷歌.搜狗等等获取资料知识,但是很难搜索准确的答案.今天小编就来教大家几个实用的(以百度为例)搜索引擎使 ...

  3. 太厉害了!我用 Nginx 提升系统10倍性能

    题图-斗罗大陆-献祭 提升Web应用的性能从未像今天这样刻不容缓. 在线经济活动的比例日益提高,就连发展中国家和地区的经济活动都已经有5%以上在线进行了.在这个超级链接.随时在线的现代世界,用户的期望 ...

  4. 实现分区表性能提升超 10 倍,解密 TDSQL PG 版开源升级特性

    1 月 11 日,腾讯云 TDSQL PG 开源版(开源代号 TBase)再升级:分布区表关联查询性能(join)提升超 10 倍,同时提升了产品在分布式场景下的易用性,增加灵活可用的功能组件. 该升 ...

  5. excel android 公式,两个超实用的Excel万能公式,瞬间提升你10倍工作效率!

    相信大家在平时的工作中,都会经常有用到公式的需要,但是下面这些公式你用过吗,今天小编就带大家一起看看吧! 1. SUM函数 这个函数不仅在我们学习的过程中会用到,即便到了工作后,也经常需要对各种数据进 ...

  6. cron表达式 每天0点10分和30分_“提前2小时下班”:学会这10个函数,办公效率提升了10倍!...

    ✎ 大家好,我是雅客. 今天给大家分享10个非常好用的函数,这几个函数都是我们精挑细选出来的,掌握这些函数,可以帮你提升10倍的工作效率,从此下班提前2个小时不是梦想! 01 VLOOKUP函数 根据 ...

  7. 在Firefox 58中,WebAssembly组件性能提升了10倍

    Mozilla在Firefox 58中为WebAssembly(WASM)组件推出了一套双层编译系统,号称解析和编译WASM代码的速度达到30-60MB/s,足够在有线网络中实现实时编译.基准测试表明 ...

  8. XSKY发布XMotion纳管热迁移技术,OpenStack集群迁移效率提升超10倍

    随着企业引入OpenStack平台以后,从边缘应用需求逐步进入到准核心,甚至是核心业务的需求和趋势,私有云运营团队常常需要面对多样化的虚拟机迁移问题和需求(包括计划内和计划外). 例如,物理服务器进行 ...

  9. java项目中用了Disruptor之后,性能提升了10倍

    缓存行与伪共享 缓存中的数据并不是独立的进行存储的,它的最小存储单位是缓存行,缓存行的大小是2的整数幂个字节,最常见的缓存行大小是 64 字节.CPU 为了执行的高效,会在读取某个对象时,从内存上加载 ...

最新文章

  1. 科大讯飞董事长:AI创业,做平台已没有机会
  2. 跨境电商未来应该怎么走?
  3. 专门用于微信公众平台的Javascript API
  4. dotnet不是内部或外部的命令,也不是可运行的程序或批处理文件
  5. 项目管理(1):管理过程
  6. CSS中height:100%和height:inherit的异同
  7. 荒野行动系统推荐观战榜_荒野行动如何进行观战 荒野行动观战系统使用详解...
  8. 串结构练习--字符串匹配
  9. 《MYSQL必知必会》—1.了解SQL
  10. OO CSS的个人理解
  11. HR website
  12. 【转】欧盟物联网研究战略路线图(3)
  13. OLLYDBG使用笔记
  14. python能做界面吗_如何使用pyQT做pythonGUI界面|
  15. opencv的基本数据类型CvPoint,CvSize,CvRect和CvScalar
  16. 深度学习中的tf.nn.softmax(logits, axis=1)以及tf.argmax(prob, axis=1)两个函数的参数以及用法
  17. 9000多的电脑matlab卡,2017 MSI/微星热销6000-9000笔记本型号,使用点评
  18. html的背景图片设置
  19. Java添加水印(图片水印,文字水印)
  20. android+qq+4.6.2,AndroidQQ通讯录4.6闪亮登场 让你领略“超快感”

热门文章

  1. Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现
  2. 在Github上搭建Jekyll博客和创建主题
  3. 【Hisi音频】Hi3520D音频输出调试
  4. 回首向来萧瑟处,也无风雨也无晴~小祁的2018
  5. [转载] 七龙珠第一部——第070话 五人战士大突击
  6. 车道线检测参考学习资料
  7. MATLAB Simulink如何实现S-Function builder功能
  8. Hyperledger Fabric 超级账本 Java 开发区块链环境构建
  9. java图形界面GUI编程
  10. ASIO协程彻底转变你的思维