案例学习——网站高并发处理相关技术

一、前言

随着互联网的发展,人们的衣食住行渐渐的与互联网联系愈加紧密。在这种情况下,与我们生活密切相关的网络服务(微信、支付宝、QQ等)的实时性、稳定性、可靠性就愈加重要。下面我们就来介绍一些用于保证高并发服务的技术方案,从前端页面到后端存储依次介绍。

二、前端页面

通常情况下,用户访问网络服务通过APP(私有协议)、web网页(http/https)这些方式。这里我们就拿常见的http方式访问网络服务举例:用户通过点击某个链接或者浏览器输入相关URL来产生一个http请求,服务端收到请求后需要将相关的内容应答给用户,通常情况下一个完整的网页需要几十次的http请求才能完整的展示。如果一个诸如淘宝(双11)、京东(618)、12306(春运)的这样访问量巨大的网站,会生成大量的http请求,如果每次http请求的内容都去后台查询一遍并返回,这样不仅会造成延时过高,还有可能给后端造成巨大的压力。
  可能的解决方案
  1. 由于网页中的大部分内容都是静态的,所以可以将这些静态内容缓存到CDN,服务器的内存中,并优化http请求,通过合并http请求并将http应答的内容进行简单的gzip压缩,这样可以减少http请求的次数以及服务器I/O操作,同时也降低了网络开销。
  2. 对于绝大部分网站,用户都会有多次访问同一页面的情况,因此可以在用户第一次请求相关资源时,将那些不经常发生变化的内容(js、图片等)缓存到用户本地,以后每次访问这个页面时就只需访问那些变化的内容即可。
  3. 可能的话,尽量减少页面中图片特别是高清图片的使用。

三、网络接入

最简单的网站架构就是用户通过客户端、Web页面直接访问服务器,然后服务器返回给用户请求的内容。但是这种方式在大型网站上没法使用,因为单个服务器无法承受巨大的访问量,服务的可靠性极差。
  可能的解决方案
  1. 将业务拆分,部署到不同的机器上,根据业务的重要性以及调用频次来分配对应数量的资源,避免将压力打到同一台机器上。
  2. 业务服务器前端加一层代理,用来做负载均衡、服务可用性保障(keepalive、LVS、Nginx、一致性哈希等技术)。代理对后端业务服务器进行负载、可用性检查,然后将用户请求分发到负载低的机器上,另外代理也可以对请求进行简单的合法性检查。
  3. 购买或者自建CDN服务,搭建自有的DNS解析服务(避免中间人攻击),将用户请求解析到距离较近且负载较低的CDN节点,由CDN提供大部分的应答。使用CDN可以极大的降低主服务器的压力,而且对于一些DDos攻击也可以在CDN节点处进行相关的处理、清洗;同时也会遇到主服务器与CDN节点的数据同步问题,对于秒杀等场景,需要进行特殊处理。

四、业务处理

后端的业务服务器在拿到代理传过来的http请求数据时,对其进行鉴权、业务处理,然后将结果返回。对于一些峰值流量场景需要考虑(小米抢购、京东淘宝购物节秒杀等场景),这些会在短时间内出现大量请求,但是只有有限的商品供抢购,所以如果保证在超过平时几倍的流量下稳定的提供服务,就需要认证考虑了。
  可能的解决方案
  1. 高并发系统防止崩溃有三大利器:缓存、限流、降级。缓存就是将读写频繁的数据利用memcached、redis等缓存到内存中,然后定期持久化到硬盘;限流通常使用令牌桶算法来降低峰值流量,保证服务的稳定性;降级就是将一些不重要的服务临时下线,将资源提供给核心服务,保证核心服务的稳定。
  2. 对于限量秒杀的,可以采用 令牌桶+内存队列 的方式,按照1:1.2 给出排队或者售罄提示,避免用户反复刷新页面造成的请求量大量增加。
  3. 各个不同业务间通信需要考虑数据的乱序、丢失等问题,通常采用比较成熟的消息队列来进行消息(或数据)的传输,由消息队列来保证数据的顺序、完整以及唯一。

五、数据存储及处理

无论是电子商务网站、社交网站以及一些其他的网站,都需要对产生的数据进行存储。最简单的方式就是直接存储到MySQL、SQL server等这样的小型关系型数据库中,但是如果数据量大的话,关系型数据库就会遇到性能问题成为限制网站进一步发展的瓶颈,而且这些数据都是存储到磁盘上,磁盘的I/O性能也是需要关注的一点。
  可能的解决方案
  1. 对关系型数据库按照业务模型进行分库分表,变成分布式,减小锁的粒度,降低因为锁带来的性能损耗。
  2. 将数据格式转换成k-v形式存储,并采用redis等内存数据库对热点数据进行缓存并定期更新到后端数据库中,减少对后端数据库的访问。另外对于redis此类内存缓存,需要考虑高可用性的问题,避免因为设备异常导致数据丢失。通常采用两地三中心的方式来保证数据可靠性。
  3. 对于采用redis-cluster之类的分布式集群,需要考虑数据一致性问题。对于非核心数据可以采取最终一致性的解决方案,支付等核心数据需要单独隔离然后保障完整一致性。
  4. 对数据进行加密存储。(网易、CSDN等拖库时间血淋漓的教训)

原文地址:https://www.cnblogs.com/sxhlinux/p/7758358.html