高并发设计技术方案
一、负载均衡
对于一些大型系统,一般会采用 DNS+四层负载+七层负载的方式进行多层次负载均衡
-
算法:随机算法、轮询算法、轮询权重算法、一致性哈希算法、最小连接、自适应算法。
-
负载均衡工具:LVS、Nginx、HAProxy
二、分布式微服务
常用微服务框架有:Spring Cloud 、Dubbo 、kubernetes、gRPC、Thrift 等
- 按照业务划分服务,单个服务代码量小,业务单一,容易维护。
- 每个微服务都有自己独立的基础组件,例如数据库。
- 微服务之间的通信是通过HTTP协议或者私有协议,且具有容错能力。
- 微服务有一套服务治理的解决方案,服务之间不耦合,可以随时加入和剔除。
- 单个微服务能够集群化部署,有负载均衡的能力。
- 整个微服务系统应该有完整的安全机制,包括用户验证,权限验证,资源保护。
- 整个微服务系统有链路追踪的能力。
- 有一套完整的实时日志系统。
三、缓存机制
性能不够,缓存来凑。要想快速提升性能,缓存肯定少不了,缓存能够带来性能的大幅提升。以 Memcache 为例,单台 Memcache 服务器简单的 key-value 查询能够达到 TPS 50000 以上,Redis性能数据是10W+ QPS。
- 常见的缓存: 分为本地缓存和分布式缓存,区别在与是否要走网络通讯。
- 常见缓存策略:
- Cache aside,通常会先更新数据库,然后再删除缓存,为了兜底还会设置缓存时间。
- Read/Write through, 一般是由一个 Cache Provider 对外提供读写操作,应用程序不用感知操作的是缓存还是数据库。
- Write behind,延迟写入,Cache Provider 每隔一段时间会批量写入数据库,大大提升写的效率。像操作系统的page cache也是类似机制。
四、分布式关系型数据库
- MySQL数据库采用B+数索引,三层结构,为了保证IO性能,一般建议单表存储 千万 条数据。
- 如果遇到单机数据库性能瓶颈,我们可以考虑分表。分表又可以细分为 垂直分表 和 水平分表 两种形式。
1、垂直分表
数据表垂直拆分就是纵向地把一张表中的列拆分到多个表,表由“宽”变“窄”,简单来讲,就是将大表拆成多张小表,一般会遵循以下几个原则:
- 冷热分离,把常用的列放在一个表,不常用的放在一个表。
- 字段更新、查询频次拆分。
- 大字段列独立存放。
- 关系紧密的列放在一起。
2、水平分表
表结构维持不变,对数据行进行切分,将表中的某些行切分到一张表中,而另外的某些行又切分到其他的表中,也就是说拆分后数据集的并集等于拆分前的数据集.
分库分表技术点:
- SQl组合。因为是逻辑表名,需要按分表键计算对应的物理表编号,根据逻辑重新组装动态的SQL。
- 数据库路由。如果采用分库,需要根据逻辑的分表编号计算数据库的编号。
- 结果合并。如果查询没有传入指定的分表键,会全库执行,此时需要将结果合并再输出。
五、分布式消息队列
六、CDN
CDN 全称 (Content Delivery Network),内容分发网络。目的是在现有的网络中增加一层网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。
CDN = 镜像(Mirror)+缓存(Cache)+整体负载均衡(GSLB)。
CDN都以缓存网站中的静态数据为主,如:CSS、JS、图片和静态页面等数据。用户从主站服务器中请求到动态内容后,再从CDN下载静态数据,从而加速网页数据内容的下载速度。