在电商系统的设计中高并发是很重要的一环,随着618 818 1111等这些互联网电商的大促节点的设置,流量呈现突发陡增的现象,如果设计不好,你的系统很容易垮掉,就如同洪水猛兽一般。那么高并发的设计在整个开发设计过程中就十分的重要,那么高并发的设计思想通常有哪些方面呢?
我们讲主要由以下几个方面:无状态设计、缓存设计、服务化设计、队列设计、并发设计、数据异构
1、无状态设计
什么叫无状态设计?
目的 :无状态应用,便于水平扩展
例如 : 用户session数据,存储在redis集群中,业务系统不存储session数据。
无状态设计
2、并发设计
请求合并,降低请求的链路,
目的:减少整体请求的时间
看下面一个例子,一个用户请求需要三个环节,如果是串行,分别是10,12,20 那么就是42
串行
那么如果并发请求呢?那么就是最长一个 就是20 前提是这三个没有相互依赖关系
并发请求
3、服务化设计
当系统扛不住,业务需求变化比较频繁的时候,那么这个时候我们就需要去拆我们的服务,拆到更小,更细的服务,就是做微服务。
比如一个实时交易系统,一开始没有什么流量我们用一个系统就够了,但是当流量上来,业务规则变化比较大,这个时候我们会把一个系统拆分成几个,甚至十几个服务,什么查询服务,支付服务,订单服务,商品服务,库存服务等等
服务化设计主要解决了哪些问题
4、缓存设计
在说缓存的时候我们要先给大家普及一个概念,CPU缓存,是介于CPU和内存之间的一个临时存储设备,它用来解决CPU运算速度与内存读写速度不同的问题,缓存的容量非常小,一般就几兆或者十几兆,因为缓存的读写速度要比内存的频率更高,所以CPU减少了大量与内存之间的数据传输,所以大大提高了CPU的运输能力。
一级缓存其实还分为一级数据缓存( Data Cache,D-Cache,L1d)和一级指今缓存(Instruction Cache,I-CacheL1i),分别用于存放数据及执行数据的指令解码,两者可同时被CPU访问,减少了CPU多核心、多线程争用缓存造成的冲突,提高了处理器的效能
缓存的分类
所以大家在做开发设计的时候要多考虑增加缓存,可以大大减少请求量和提升请求效率。但是在做缓存的时候也会遇到二个问题
第一个就是缓存穿透的问题 缓存穿透主要只查询缓存时候,缓存里没有,然后再去数据库里查询。如果是恶意请求,在瞬间请求流量非常大的时候,缓存里都没有,所有请求都会穿透到数据库,这样会导致数据库瞬间压力会非常大
应对方案一:缓存空对象,这样就不会去查DB,但是需要考虑业务的影响
应对方案二:用一个定时任务不断的刷新缓存里的值
第二个就是缓存热点的问题 比如在查询某一个活动信息的时候 某一个存在Redis的Key在短时间内被查询了1亿次,这样会导致所有请求在瞬间都会请求到同一台Redis上,导致单台Redis压力过大,整体服务不可用,那么怎么去解决。也是两个方案
1、根据hash值分散存储
2、数据打散,采用多级缓存的策略
所以大家在做缓存设计的时候要注意上面的这两个点,很重要 很重要 很重要
5、队列设计
队列主要使用场景:异步处理、系统解耦数据同步、流量削峰、扩展性、缓冲等。
比如 削峰处理 :瞬间流量过大,数据排队处理
例如 : 发券系统能力有限,瞬间流量太大直接打到发券服务,可能会导致发券服务压力过大,服务不可用
6、数据异构
异构数据主要存储数据之间的关系,然后通过查询源库,查询实际数据。不过,有时可以通过数据冗余存储来减少源库查询量或者提升查询性能。
例如 : 评价数据,商品和评价的数据关系用Solr存储,用户和评价的数据关系用数据库存储,最后元数据采用Hbase存储。
总结:高并发的六大核心设计思想希望大家好好的学习,有任何不懂或者不理解的私聊老R 为你一一解答