一、常见的原则
1、高并发原则
无状态
如以前使用session机制,现在转变为使用jwt或者token机制
拆分
如应用服务的拆分
服务化
消息队列
数据异构
如:将数据同步到es,使用es提高模糊搜索的效率等
缓存银弹
如:将常用的数据进行缓存。
并发化
对一些可以并行处理的逻辑,进行并发化的处理。
2、高可用原则
降级、限流、切流量、可回滚
3、业务设计原则
防重设计
幂等设计
流程可定义
状态与状态机
后台系统操作可反馈
后台系统审批化
二、高可用工具
2.0、资源的可用性
一切皆资源。
当客户访问某个页面的时候,其从客户端的网络、网络带宽、CDN、服务器、应用、再到存储;整条链路上其实涉及到很多的服务,只有每个节点都能够正常的提供服务,才能保证客户使用到正常的业务,这条链路上的服务,我都统称为资源。
可见对于一个业务的高可用,其实涉及到很多层次的内容。怎么保障资源的高可用,一般来说的策略就是资源冗余(负载均衡)、资源隔离、资源监控(故障检测)、自我修复(弹性伸缩)、自我保护(限流熔断)。
资源的冗余,主要是涉及到资源的拆分(如服务拆分、数据库拆分)、资源的备份(如集群);资源冗余之后就需要有负载均衡去进行寻址和路由。
2.1、负载均衡
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,主要是涉及到网络通讯调用(也包含了微服务之间的调用)的时候。
根据网络层的定位:有4层负载如LVS/F5/NGINX,也有7层负载如NGINX。
根据负载的类型分:客户端负载均衡(如微服务的调用)与服务端负载均衡(如nginx)
负载均衡必须要考虑的问题:路由策略、超时处理、心跳检测、失败重试。
线上有CDN对GET的超时处理会进行重发,如果重发的请求对服务器的消耗比较大,比如是报表查询;则可能因为重发而导致服务器的崩溃。
2.2、隔离术
隔离技术主要是对被访问的资源进行分类,同类的资源可以有类似的表现。避免资源间的互相影响,能有更稳定的表现。
线程隔离
在使用的时候会将请求分类,交给不同的线程池处理。避免故障扩散到其他线程池。(主要是对线程资源)
进程/集群/机房隔离
这些其实从服务拆分或者应用部署方面去看
动静隔离
主要是前后端分离,可以将静态资源放在CDN,加快访问速度,也避免占用后端资源的带宽
读写隔离
redis、mysql,mq等。对于存储来说,读操作和写操作的表现不一样,很多时候会将读写进行分离。大多数采用master-slave的架构。
热点隔离
比如抢购或者秒杀活动,这个时候会给系统带来压力。对于读热点,一般使用多级缓存进行处理。对于写热点,一般通过缓存+队列的方式削峰填谷。
资源隔离
主要指服务器资源的隔离,如果是容器一般使用cgroup可以做到cpu和内存的隔离;其他如果采用虚拟机的方式进行资源隔离(但相对比较重);
线上较多可能对不同的服务器进行分类,是磁盘io密集型的,还是网络io密集型的,还是cpu密集型的。尽量将容易产生资源竞争的应用分开部署。
不同的中间件对系统的重要性也不一样,比如日志服务(elk+kafka)和注册中心(zk);日志服务的重要性明显不比注册中心,当kafka的压力上来,可能会导致cpu飚高,引起zk的处理变慢,这个时候应该对这两种类型的服务分开部署。
2.3、限流
限流算法
- 令牌桶算法
- 漏桶算法
限流策略
总并发、总链接
单接口的请求数
2.4、降级
降级预案
三、高并发工具
3.1、缓存的设计
流程节点 | 缓存技术 |
客户端 | 使用浏览器缓存 |
客户端应用缓存 | |
客户端网络 | 代理服务器开启缓存(较少见) |
广域网 | 使用代理服务器(如CDN) |
使用镜像服务器 | |
使用P2P技术 | |
源站及源站网络 | 使用接入层提供的缓存机制(nginx) |
使用应用层提供的缓存机制 | |
使用分布式缓存(如redis) | |
静态化、伪静态化(预处理) | |
使用服务器操作系统提供的缓存机制 |
3.2、应用级缓存
3.3、HTTP缓存
3.4、多级缓存
3.5、异步并发
3.6、存储扩容
3.7、队列技术
缓冲队列
任务队列
消息队列
请求队列
四、案例分析