高性能系统设计
系统要做到高性能,一般可以根据具体情况,从以下几个方面着手考虑:
缓存
异步
集群
缓存
在许多应用中对数据的访问都满足“二八”原则,即在 80%的时间里访问 20%的数据。在这种情况下,如果读取原数据比较耗时,采用缓存策略可以有效提高系统效率。
缓存在很多设计中都有体现,如计算机系统,硬盘容量大,但 CPU 访问的速度慢,而内存容量较小,但访问速度快,所以 CPU 会把数据先载入内存,然后再做访问,这时内存就是硬盘数据的缓存;但是内存访问速度还是不够快,对应就有 CPU 一级缓存,二级缓存,三级缓存等,缓存高频率访问数据,提高数据处理效率。
CDN 也是一种缓存设计,将静态资源缓存在距离用户比较近的服务器里,用户可以快速就近获取静态资源,而不用每次都从应用服务器获取,避免访问时间长,同时减轻应用服务的访问压力。
在程序设计上,有内存缓存和分布式缓存。
内存缓存即在直接将数据保留在内存里,随着访问。
Java 开源的内存缓存框架有:
Google Guava Cache
Caffeine
分布式缓存方案有:
memcached
redis
缓存策略有:
通读缓存
客户端连接的是缓存,而不是原始数据;客户端访问缓存没命中,由缓存去获取原始数据,缓存后同时返回给客户端
旁边缓存
客户端连接原始数据,访问是先访问缓存,没命中,则访问原始数据,然后回写缓存
异步
异步和缓存都可用于提高系统效率,但一般缓存用于提升 读 的效率, 而异步提升 写 的效率。
构建异步架构的一个重要组件就是消息队列。
消息队列模型:
点对点模型
消息队列里的每一消息只是处理一次
发布订阅模型
消息队列里的每一消息都会被订阅的消费者处理
但开源的消息队列,如 rocketMQ, Kafka 等,一般都同时支持上面两种模型。
集群
集群是对应用进行横向扩展,可以应用高并发。而集群需要有负载均衡来做服务路由,下面对几种负载均衡模型做个总结:
重定向负载均衡
客户端请求负载均衡服务,负载均衡服务选择一台服务,以重定向的方式将该服务器的 IP 返回给客户端,客户端再向具体的服务器发起请求
缺点:
客户端需要发起两个 HTTP 请求;
应用服务器直接暴露到公网,安全性差;
DNS 负载均衡
一般不会直接 DNS 负载均衡到应用服务器,而是先负载到反向代理
反向代理负载均衡
一般小型网站使用,中大型少用。
缺点:
两级 HTTP 请求,每级都要 HTTP 解析及调制,请求比较重,高并发下代理服务器压力较大;
应用集群规模大时一般不会选择这种模式。
IP 负载均衡
工作在 TCP 层,不需要感知应用层协议,处理压力较小,效率较高。处理能力不会成为瓶颈,但是网络带宽,特别是响应的出口带宽会。
数据链路层负载均衡
通过修改包的 MAC 地址去做上游服务路由
大型互联网应用主要使用的模型
评论