前言 随着互联网的快速发展,很多传统行业都开始将原有的产品互联网化移动化,这其中就涉及到对原有系统的改造,因为之前大部分时间都是在传统银行工作所以对于原先的系统设计我们也有一个套路,类似传统的SSH、LAMP这种,但是随着技术的不断快速发展,互联网高并发的架构设计也有了新的模式,本文就介绍下基本的高并发设计模式。互联网大部分系统的设计采用本文的设计模式都是可以的,但是对于一些超高并发的特殊场景的系统还是需要根据具体业务场景单独去设计的,下面我们就对高并发设计模式进行讲解。
分层 分层设计是企业应用系统中常见的设计模式,为了保证后续系统的可拆分和可复用,一般会将系统拆分为应用层、服务层、数据层,这也是传统的系统分层拆分模式。通过分层,可以更好的将一个庞大的软件系统切分为不同的部分,便于分工合作并行开发和维护。每层都是独立的,互相通过接口进行调用,各层可以根据业务情况的变化独立作出调整,只需要保证接口一致性即可。
分层比较大的挑战就是合理规划和划分每一层的边界和接口,在实施过程中禁止跃层调用。对于分层架构不是一成不变的,一般来说在实际过程中,会根据具体的情况再细化分层,应用层可以分为视图层、业务逻辑层等,服务层也可以细分为数据接口适配层、逻辑处理层等。
分层架构对网站支持高并发分布式的发展方向至关重要,所以在系统刚开始建的时候最好就要采取分层架构,这样后续分层会比较容易。
分割 分层是对系统的横向的切分,分割则是对系统纵向的切分。系统越大,分割的就会越细,例如银行系统我们会切分为核心系统、账户系统、支付系统、现金管理系统、营销系统等等,基本上你在网银或者手机银行上看到的每个功能背后基本都是一个系统去支撑,例如我们常见的手机银行里的账户交易查询,就这么一个简单的交易查询功能,对于有一定规模的银行来说,都会单建一个交易查询系统提供全渠道的查询服务。
按照这样将功能从业务层面分割以后,各个系统承载的压力自然也就下降下来,而且扩展性也会比较好。不过功能分割对于大型网站的分割粒度一般会比较小,对于小规模的公司来说一般没必要上来就分割成很多子系统,随着业务的发展再进行分割就可以。
分布式 分布式由来已久,分布式意味着可以通过增加机器完成同样的功能,机器越多,cpu资源、内存、磁盘都是随着机器的增加而线性增加,机器越多能够处理的并发访问和数据量就越大,从而能为更多的用户提供服务。
分布式架构需要考虑很多问题,并不是简单的加机器就可以了。实施分布式以后需要考虑用户会话如何管理,数据在分布式环境中如何保持数据一致性,分布式事务如何保证一致性,分布式的日志维护等都是需要考虑的问题,所以分布式设计要根据具体情况而来,不要为了分布式而分布式。
分布式方案有以下几种:
1)分布式应用和服务:将分层和分割后的应用分布式部署,这样可以提高网站性能和并发,加快开发和发布速度,还可以让不同应用交叉复用共同的应用,便于功能扩展。
2)分布式静态资源:网站的静态资源独立分布式部署,并采用独立的域名,这就是动静分离。静态资源的分布式部署可以减少应用服务器的压力,使用独立域名可以加快加载速度,也可以降低静态资源服务器的压力。
3)分布式数据和存储:大型网站处理的数据都是P级的,单台服务器无法提供这么大的存储空间,这么大的数据需要分布式存储。除了分布式文件存储,还有关系型数据库和Nosql都有分布式的部署方案。通过分布式能够提供海量的数据存储空间。
4)分布式计算:对于很多后台批量处理的任务都是采用分布式计算方案,常用的有Hadoop和MapReduce分布式计算框架。分布式计算框架内容比较多。
集群 分布式部署的应用和服务部署了很多机器后还需要将其集群化才能对外提供服务,多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务。
当业务量不断增大以后,可以在集群中不断增加服务器就可以满足业务增长了,当一台服务器坏了也不会影响对外的服务提供,只是性能有所下降。
缓存 缓存是高并发系统的杀手锏,在真正有高并发需求的系统一般会设计多级缓存来减少真正的服务计算,而是直接通过缓存提供服务。像微博、朋友圈这些高QPS的系统都是采用了多级缓存的架构方案。
1)CDN:CDN供应商一般都部署在距离用户最近的网络服务商,用户的请求总是先到网络服务商,在这里缓存网站的静态资源,可以就近将静态数据返回给用户。一般来说对于电商、社交应用、新闻门户或者视频网站这些高QPS网站,都建议使用CDN来环节源系统的压力。
2)反向代理:反向代理属于网站前端架构的一部分,部署在网站的前端,当用户请求到达网站的数据中心时,最先访问到的就是反向代理服务器,这里将网站的静态资源缓存起来,这样不需要继续转发应用服务器,直接从反向代理缓存中返回就可以了。
3)本地缓存:对于应用服务器被访问的高热点数据,应用程序可以在服务器内存中缓存这些热点数据,这样就不需要访问服务器磁盘或者数据库了,能够将内存中的热点数据直接返回。
4)分布式缓存:很多系统数据量非常大,光靠本地缓存可能内存空间不够,这时候就可以考虑使用分布式缓存了,常用的分布式缓存有redis、memcache这些key-value分布式缓存,这些分布式缓存一般也都提供了集群版本,能够做到很好的高可用和高性能。
异步 异步也是处理高并发的一把利器,也是处理解耦的手段之一,业务系统之间的消息传递不是同步调用,而是将一个业务操作分为多个阶段,每个阶段之间通过共享数据的方式异步执行。
在单一服务器内部可通过多线程共享队列的方式实现异步,处在业务操作前面的线程将输出的内容写入队列,后面的处理线程从队列中取出数据进行处理;在分布式系统中,多个服务器集群通过分布式消息队列实现异步。
对于简单的异步实现可以通过内存队列来实现,对于需要高可用和高并发的系统一般来说都依靠商用的消息队列中间件产品,Websphere MQ、Rabbit MQ、Rocket MQ等都是比较好的消息中间件产品。
冗余 为了保证系统的高可用,我们一般会对服务器和数据都进行冗余备份,这样可以保证在服务器宕机的情况下系统依然可以保证提供服务。
访问和负载很小的应用服务也必须部署至少两台服务器组成一个集群,就是为了通过冗余来实现高可用。数据库要定期进行全量备份,每天还要进行增量备份,防止数据库服务器出现异常导致数据丢失,对于实时的数据备份可以通过数据库自带的日志来进行恢复。
总结 上面介绍的这些就是常用的一些高并发的设计模式,其中每一条都值得深入的研究,本文只是介绍了高并发设计时需要考虑的设计方案简介,可以通过这些方案缓解压力提高并发性能和高可用。