目录
高并发系统的分析与设计
1、有效请求与无效请求
2、系统设计
3、数据库设计
4、动静分离设计
5、锁和高并发
6、缓存的使用
有效请求与无效请求:
无效请求很多种类,比如通过脚本刷新网站首页,使网站频繁访问数据库和其他资源,造成性功的持续下降,还有一些为了得到抢购商品,使用刷票软件连续请求的行为。分析哪些是有效请求和无效请求的场景,已应对不法请求,
首先一个账号连续请求,甚至在1秒内请求上百上千次,应对其方法较多。
对于有组织的请求,比如肉鸡多人账号来访问
解决方案:a:加入验证码。(但是也会被图片识别作弊软件攻破)
b:使用短信服务,把验证码发到短信
c:限制用户在单位时间的访问次数以压制其请求量
d:对于多人账号请求,采用僵尸账号排除法,是指对那些平时没有任何交易的账号,根据这些账号排除一些请求
系统设计
高并发系统往往需要分布式的系统分摊请求的压力,即负载均衡。系统也可以按照业务来划分,比如当前的购买分为产品维护、交易维护、资金维护、报表统计和用户维护模块,按照功能模块进行区分,使得他们相互隔离,互不干扰,降低数据的复杂性,按业务划分也可称为水平划分。由于各个模块有联系,还要通过RPC远程过程调用协议来处理之间的信息,目前比较流行的开源:Dubbo、Thrift、Hessian等
有了水平划分,也会有垂直拆分系统,所谓的垂直拆分系统是将一个很大的请求量,不按照子系统划分,而是将它们按照互不相干的几个同样的系统分摊下去,比如一台服务器的最大负荷为每秒1W请求,而测得的系统高峰期为每秒2W个请求,按照垂直拆分到4台同样的服务器,部署同样的代码,那么4台服务器平均5千个请求。即垂直拆分
对于大型网站有更细的划分,将水平与垂直相结合,如下
数据库设计
对于数据库设计而言,可以使用分库分表技术,从而提高性能,提高系统响应能力。阿里的开源中间件(mycat)能够很好的实现分库分表处理的很好。
还需要考虑优化SQL,适当的建立索引,提高数据库性能,在更新数据的时候,一定要记住是表锁还是行级锁(innodb支持),行级锁是建立在索引之上的,,所以,如果更新的条件是索引,则是行级锁,反之是表锁。
动静分离技术
目前是互联网的主流技术,对于互联网而言大部分的数据都是静态数据,只有少数使用动态数据,动态数据的数据包很小,不会造成网络瓶颈,而静态的则不一样,静态数据包含图片、CSS、JS、视频等互联网的应用。
对于有条件的企业k可以考虑使用CDN(Content Delivery NetWork ,即内容分发网络)技术,它允许企业将自己的静态数据缓存到最近的网络CDN节点上。先访问CDN的静态数据,如果有则直接返回,无,则回源。
锁和高并发
无论有效请求还是无效请求、水平划分还是垂直划分、数据库的分库分表、动静分离技术等应用,都无法避免动态数据,而在高并发的场景下,又会产生数据一致性问题,加锁,则会影响系统的性能,不加锁则难以保证数据一致性的问题,这就是高并发与锁的矛盾,关于数据一致性的方案,悲观锁、乐观锁(通过版本号CAS原理)、redis+lua(利用其单线程,原子性原理)