1。应用场景
春运火车票,微信红包,电商的秒杀,抢购。
2。互联网系统的应用架构基础分析
防火墙:防止网络上的病毒攻击和其他攻击。
负载均衡器:
具体作用a:对业务需求做初步分析,决定是否分发到web服务器。(常见的分发软件有Nginx和 Apache等反向代理服务器)。他可以通过配置禁止一些无效请求,比如封杀作弊的IP地址。
b.提供路由算法, 可以提供实现负载均衡的算法,根据各个服务器的负载能力进行合理分发。降低单个服务器的负载
c.限流,如果请求超过所有服务器的最大承载能力,就要限流,否则可能引起宕机的连锁反应。可以提示用户繁忙,稍后再试,保证系统可用。
高并发系统的设计
真正的系统是为了实现业务而开发的,所以设计时必须先分析实际需求和场景
第一步:区分有效请求和无效请求
有效请求指真实的需求,无效请求是虚假的抢购请求。
无效请求举例: 通过脚本连续刷新网站页面,使用刷票软件连续请求。
无效请求的应对方法: 1。加入验证码。一般首次无验证码,后续的第二/N次加入验证码,验证码种类有图片,文字,等式计算等。图片也可以用倾斜的
2,让用户手动调整图片的位置或者角度和标准进行比对。
3。使用短信服务,把验证码发送到短信平台,然后让用户再输入。
注意,这个应该放在负载均衡器上完成,而不是放在web服务器上完成。这样可以拦截大量的无效请求。
4,通过具体的业务逻辑来限制,比如限制用户在单位时间内的购买量
5,针对一人多账户的情况,提高账户等级,通过银行卡验证,实名制获取证件号码,同一证件号码的认定为一个用户。
6,封IP地址,封MAC地址,主要是用来反爬虫,有可能误伤有效请求。
高并发系统的设计的第二步:系统设计
1。水平分法:按照功能模块进行区分,使得他们相互分离,以降低系统的复杂性。
2。垂直分法:不按照模块划分,每个子系统的功能相同,只是通过算法把大量请求合理分配。
3。大型网站还可以按照水平和垂直结合的方法。首先将业务区分为多个子系统,在每一个子系统下面再分多个服务器,通过子系统的路由器找到对应的子系统服务器提供服务。
秉持的原则:服务器的负载均衡,提高服务器的吞吐能力和性能;业务简化,便于开发。
水平分法的优缺点:
优点:一个服务管理一个业务,提高开发效率。
缺点:因为各个系统业务之间存在关联,需要通过RPC(远程过程调用协议)来处理关联信息。比较流行的RPC框架有Dubbo,Thrift和Hessian。
RPC框架的理念:每一个服务都会暴露一些公共接口给RPC服务,这样任何一个服务器都能够通过RPC服务获取其他服务器对应的接口去调用各个服务器的逻辑来完成功能。接口的相互调用会造成一定程度的缓慢。
垂直分法的缺点:因为每个服务器都包含所有的业务逻辑功能,会造成开发上的业务困难,对DB设计也困难。
关联链接
RPC学习
Dubbo框架简介 https://blog.csdn.net/panyongcsd/article/details/77659769
复杂点的Dubbo详解 http://shiyanjun.cn/archives/325.html
如何实现简单的RPC服务 https://blog.csdn.net/u014418064/article/details/79575041
RPC服务和HTTP服务对比 https://blog.csdn.net/wangyunpeng0319/article/details/78651998
高并发系统的设计的第三步:DB设计
1。使用分表或者分库技术
分表:本来一张表可以保存的数据设计成多张表去保存,比如交易表,订单表,数据过多会造成查询和统计的缓慢,可以按照年份来分为多个表保存,开发者根据查询的年份确定去查询哪个表。
分库:把表数据分配在不同的DB中。首先需要一个路由算法确定数据保存在哪一个DB中,比如可以把用户和对应业务的DB缓存到redis中。这样路由算法可以通过redis读取的数据来确定使用哪个DB进行查询。
2。优化SQL,建立索引
https://blog.csdn.net/jie_liang/article/details/77340905
https://blog.csdn.net/xie_xiansheng/article/details/71077878
SQL优化的主要原则就是应尽量避免全表扫描,应该考虑在where及order by 涉及的列上建立索引。索引对查询有利,对修改不利。(增加维护索引的开销)
技巧1.风格统一。
大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。
技巧2:在更新or复杂查询语句要时刻记住是表锁定还是行锁定
,优先选用主键更新,原因是在musql的运行时,非主键更新会锁表,即不仅锁定更新的数据,而且锁定表的其他数据,从而影响并发,使用主键更新是行锁定
技巧3:使用连接查询来代替子查询(比如用left join 代替 not in)
技巧4,考虑使用“临时表”暂存中间结果,可以避免程序中多次扫描主表
3。读写分离技术
部分主机负责写业务,部分主机负责读业务。
对于分布式DB来说,还有一个很复杂,事务的一致性,目前流行的有2段提交协议,即XA协议,Paxos协议,这个需要专门学习。。。
XA协议
https://www.cnblogs.com/zengkefu/p/5742617.html
Paxos协议
https://blog.csdn.net/malefactor/article/details/51365744
https://blog.csdn.net/dellme99/article/details/14162159
动静分离技术
背景:因为互联网大部分数据都是静态数据,只有少数是动态数据
静态数据:图片,css样式,js脚本,视频等,尤其是图片和视频流量很大。如果都从动态服务器(如tomcat,weblogic)服务器的网络压力很大。这个时候可以用动静分离技术。
※ 静态数据的加速技术:CDN,Nginx
※ 动态数据的加速技术:分层架构,服务器架构,DB/缓存架构
CDN(即content delivery network,内容分发网络)。
CDN允许企业将静态数据缓存到网络CDN的节点中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
※ CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。