学习源为B站的学习视频:https://www.bilibili.com/video/BV147411x7p1?p=268
本文为学习总结。如果错误请指正。仅供参考。拓宽思维。
首先由浅入深。高并发的由来都是现有从单机系统演变而来。单机系统无法承载高并发而导致的。
例如一个最简单的单机系统,当他的承载能力不足以应付的时候才需要扩展集群等一系列提升方案。
单机的承载能力由什么决定的? (BS为例)
程序都是靠 多线程 来处理请求的 -- 每个请求消耗的时间
吞吐量: QPS = 线程数/请求秒数 以此为基础可以算出服务器的最大承载用户数
(当超出最大承载数时。请求会等待/阻塞等问题,甚至服务瘫痪)
解决方案(主体思路 1.增加线程数 2.缩短请求数时间 提高吞吐量达到提高承载量的效果):
1. 升级硬件 (简单粗暴,但是有上限)
2. 分布式 (多台服务器一起处理。不过多服务器协同会牺牲一定的通信效率。且分布越多牺牲越多)
分布式 : 多台服务器完成一台服务器做的事,就是分布式。
功能的拆分。部署在不同的服务器上,用网络协议进行请求(有一定的性能损耗,服务器越多损耗越大)。
3. 系统性能的优化 (缓存的使用)
服务端缓存 : 我们可以使用自带的缓存或者redis。进行结果的缓存。(降低数据库压力)
当再有相同的请求。进来时直接在缓存中取。减少数据库压力,提升吞吐量。
(缓存是在内存中的。内存读取速度 > 硬盘,快很多。但是硬件是有上限的。如果本地的缓存不足以支撑。可以配置分布式缓存服务器。用多个服务器的内存来处理。或者使用集群来优化)
当然在程序中还有很多地方可以增加缓存的。例如客户端缓存。等。都可以大大提升效率
但是缓存也有弊端: 1.持久化的问题。 2.缓存的时效性。当数据库数据改变时。缓存数据的实时同步。
4. 集群 (集群的负载均衡)
一般来说在一个项目中。
文件服务器 一般不会是瓶颈。可以通过阿里oss 这种方式托管。
数据库服务器 可能会有瓶颈。不过可以通过读写分离。配置升级等方式优化。
缓存服务器 一般也不会是瓶颈。 可以通过分布或者扩容内存。或者第三方缓存等方式
一般来说 应用服务器 会出现瓶颈。高并发下大数量的请求。会需要应用服务器来处理。
集群就是一种解决思路:
非集群: 应用服务器直接接受请求处理。返回。
集群: 负载均衡服务器接受请求。均衡分发给下面的应用服务器再处理返回。
(我之前总会把集群和分布式弄混淆这里总结下两者的区别:
集群:个人理解相当于一种扩容。用多个服务器。处理单一功能。增加的是体量。多个服务器之间不通信
分布式: 将一个完整的业务流程 例如:应用程序,数据库,文件 拆分为模块。每个模块单独处理单一功能。分布式更像一种解题思路,分步骤的做每一个功能的任务。增加的是步骤,多个服务器之间存在通信
学习视频中说 广义上集群属于分布式,这个就看你怎么理解了。。我感觉不太一样。我认为服务器间是否存在通信是界定的标准)
分布式后续代码 Demo。。后续补充。。。