众所周知,在分布式系统的设计与建立中,其中一个要考虑的问题就是高并发。
简单来说高并发就是指通过设计系统,使之实现可以同时处理多个请求的能力。
现在的高并发系统主要存在有两种实现方式,一种是垂直扩展,一种是水平扩展;平常我们使用较多的通常是水平扩展,但这是到底是为什么呢?
主要是由于垂直扩展就是提升单体计算机的性能,从而达到提升系统的效率和灵活性。
然而,单体计算机的上限是十分有限的,除非再来一个乔布斯型天才选手并创新了硬件层面的技术,否则单体计算机的提升成本真的是远远高于提升系统效率,优化算法灵活度的提升成本。
而且就效果来说,提升整体算法的收益是要远远大于单体计算机的提升的,不仅仅是因为系统更具有抗击风险的能力,更重要的是我们可以避免依赖于单个计算机的计算能力,这样在实际应用的过程中,如果有某个计算机下线无法实现该计算机应该实现的功能时,如果系统构建得当,系统应该会委任其他的计算机代偿实现该台计算机遗留的问题。
而在这时,如果我们保持对于单体计算机计算能力的依赖,那么面对类似的风险时抗击风险和解决问题的能力就会相应地得到不重视。
那么我们最终决定在水平扩展层面继续前进~
其实在水平扩展层面是有很多选择的,比如反向代理层,站点层,服务层或者数据库层。
首先是反向代理层,可以通过DNS轮询来实现。
DNS轮询主要是用于实现多个web服务器之间的负载平衡,每个用户的请求被轮番发给不同的服务器,并且一遍过后又会回到最开始的第一个IP。但是这不是最好的负载均衡方式,因为它只能实现分配的工作,而且会使客户端的缓存难以管理。、
其次是站点层的水平扩展,在这个层面的扩展还是非常有前景的,主要有Nginx,这是一款免费的linux网页服务器,可以用于反向代理和缓存。唯一的问题在于他是一个static的软件,不是dynamic的,这导致了每次处理dynamic的事件时,他都需要把事件传输给PHP然后等待处理的结果,之后在传输给客户,所以效率上存在一点问题。这一步也可以用Apache代替,但是作为一个免费的开源软件来说,Nginx的适用面还是更加广阔的。
再然后是服务层,一般通过服务连接池来扩展。一个程序在连接DB数据库的时候经常需要占用很长时间进行网络上的认证和确认,这占用了很多资源和时间成本,而为了加快效率出里和简化这些流程,优化服务器性能,使用服务连接池就是一个很好的方式。
简单来说就是在遇到新的认证时候先查看数据连接池里是否有已经建立好的数据,如果有就可以节约时间和服务区直接使用,没有就建立一个新的连接放进去;放满了就检查一下已经用的是否已经用过了,用过了就删掉没有用过就留下。
市面上现在常用的连接池有c3p0,dbcp与druid。
最后是数据库层的水平扩展,一般通过数据Hash的方式,时间原因就不再这里展开叙述了。
总结下来,一个共分为四个部分,而市面上的高并发系统大部分都在站点层进行扩展,那么你觉得还有什么地方可以创新一下呢?
欢迎点赞留言,我们来一起探讨~