写点什么

高性能系统设计

用户头像
dapaul
关注
发布于: 2020 年 07 月 08 日

系统要做到高性能,一般可以根据具体情况,从以下几个方面着手考虑:

  • 缓存

  • 异步

  • 集群


缓存

在许多应用中对数据的访问都满足“二八”原则,即在 80%的时间里访问 20%的数据。在这种情况下,如果读取原数据比较耗时,采用缓存策略可以有效提高系统效率。


缓存在很多设计中都有体现,如计算机系统,硬盘容量大,但 CPU 访问的速度慢,而内存容量较小,但访问速度快,所以 CPU 会把数据先载入内存,然后再做访问,这时内存就是硬盘数据的缓存;但是内存访问速度还是不够快,对应就有 CPU 一级缓存,二级缓存,三级缓存等,缓存高频率访问数据,提高数据处理效率。


CDN 也是一种缓存设计,将静态资源缓存在距离用户比较近的服务器里,用户可以快速就近获取静态资源,而不用每次都从应用服务器获取,避免访问时间长,同时减轻应用服务的访问压力。


在程序设计上,有内存缓存和分布式缓存。


内存缓存即在直接将数据保留在内存里,随着访问。

Java 开源的内存缓存框架有:

  • Google Guava Cache

  • Caffeine


分布式缓存方案有:

  • memcached

  • redis


缓存策略有:

  • 通读缓存

客户端连接的是缓存,而不是原始数据;客户端访问缓存没命中,由缓存去获取原始数据,缓存后同时返回给客户端

  • 旁边缓存

客户端连接原始数据,访问是先访问缓存,没命中,则访问原始数据,然后回写缓存

异步

异步和缓存都可用于提高系统效率,但一般缓存用于提升 的效率, 而异步提升 的效率。


构建异步架构的一个重要组件就是消息队列。


消息队列模型:

  • 点对点模型

消息队列里的每一消息只是处理一次

  • 发布订阅模型

消息队列里的每一消息都会被订阅的消费者处理

但开源的消息队列,如 rocketMQ, Kafka 等,一般都同时支持上面两种模型。


集群

集群是对应用进行横向扩展,可以应用高并发。而集群需要有负载均衡来做服务路由,下面对几种负载均衡模型做个总结:

重定向负载均衡


客户端请求负载均衡服务,负载均衡服务选择一台服务,以重定向的方式将该服务器的 IP 返回给客户端,客户端再向具体的服务器发起请求

缺点:

  1. 客户端需要发起两个 HTTP 请求;

  2. 应用服务器直接暴露到公网,安全性差;


DNS 负载均衡

一般不会直接 DNS 负载均衡到应用服务器,而是先负载到反向代理


反向代理负载均衡

一般小型网站使用,中大型少用。

缺点:

  1. 两级 HTTP 请求,每级都要 HTTP 解析及调制,请求比较重,高并发下代理服务器压力较大;

  2. 应用集群规模大时一般不会选择这种模式。


IP 负载均衡

工作在 TCP 层,不需要感知应用层协议,处理压力较小,效率较高。处理能力不会成为瓶颈,但是网络带宽,特别是响应的出口带宽会。


数据链路层负载均衡

通过修改包的 MAC 地址去做上游服务路由

大型互联网应用主要使用的模型


用户头像

dapaul

关注

还未添加个人签名 2018.09.18 加入

还未添加个人简介

评论

发布
暂无评论
高性能系统设计