关于高并发下网站高可用性问题的总结

本文是工作中遇到的网站高并发问题及相关解决思路和方法的总结,比较零碎,且会在后续工作过程中不停丰富,有不对之处,请指正。

1、前后端分离

前后端分离后,可以使用更加轻量级的web容器部署静态资源,如nginx等,还可以对静态资源进行cdn加速,同时针对营销或者活动页面,可以使用内容管理平台,实时更改页面,快速迭代。服务端出来后,专注于业务流程,且为后续的服务拆分提供了便利。

2、按照业务领域拆分服务

随着业务量的增加,单体架构不能再满足高并发场景,按照业务领域将服务端拆分为多个独立的服务。服务拆分后,这些服务独立部署,独立扩展,服务之间完全解耦。

拆分后的服务通常是无状态的,会话管理等通常交给网关层,或者统一的sso服务,业务服务省去了复杂的会话管理,服务效率提高;

拆分后的服务支持分布式多实例部署,从而达到按需扩展的目的,在应对突发的流量暴增时,如营销活动等,可以迅速按需扩展,提高站点的可用性。

3、集群部署,负载均衡

拆分后的服务支持分布式部署,可以使用集群部署、负载均衡的方式进一步提升网站可用性。集群部署模式下,多台实例分担流量,并能灵活地增减成员实例;负载均衡机制可以确保某些成员实例失效时,能迅速将流量切换到其他正常成员实例上,从而提高站点的可用性。

负载均衡的方式通常有两种:

  • 硬件负载——F5 7层或者4层网络代理
  • 软件负载——nginx反向代理

负载均衡的算法通常有:轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接数法

可参考:6种负载均衡算法

4、使用缓存提高查询服务性能

在查多写少的场景,非常适用使用缓存来提升查询服务的性能,减轻对数据库的压力。通常使用redis cluster作为缓存服务器,redis cluseter机制能很大程度上保证缓存服务的高可用性,及时缓存服务故障,还能从数据库获取信息。

spring+mybatis+redis做扩展缓存的具体实践后续给出。

5、数据库读写分离,分库分表

业务迅猛到后面,当用户在千万级别时,数据库会成为最后的瓶颈,首先可以根据业务场景分析,考虑做读写分离。写到master库,读salve库。如果读写分离也无法满足高并发要求,需要考虑使用分表分库的思路进行横向扩展。数据库只允许单表操作对于分表分库落地非常友好,因此,在开发前期就约定,业务数据库操作必须单表操作。

读写分离,分库分表的技术手段还没有尝试过,但是现在的系统设计之初就是按照单表操作约定的,因此后续进行横向扩展时会比较便利。

分库分表的实际落地方案是有一定难度和取舍的,其中最关键点需要考虑到sharding数的扩张,有空研究下。

6、数据库尽量少使用事务

一般意义上,大家都会使用数据库级别的事务来保证业务操作的原子性和数据一致性,但是数据库事务的使用会带来性能上的损耗,为此,除非非用不可,其他时候尽量少用。实践下来,这一条是可以做到的。

那么什么时候可以不用呢?简单讲前置数据库操作可以重复进行时,就可以不做事务控制。就是比如用户注册场景,会先insert ‘通行证credential’表,再insert ‘用户user’表,不使用事务控制,我们可以将credential的操作放在user表操作前面,即使credential成功,user插入失败,对数据一致性没有影响,因为用户再次注册会重新生成一个userId,能重新insert credential后,再insert user表。对于用户的影响也和加上事务控制的效果一致。不好的影响在于多生成了一条credential记录。这里的insert ‘通行证credential’表操作就是前置数据库操作,但是非关键数据库操作,因为注册的最终效果是必须在user表中插入一条userId,后续登录时会从user表中获取用户信息进行验证。

什么时候非用不可呢?在订单/支付等业务系统时,同一笔订单不允许重复支持这是底线,因此在订单支付场景,需要加上事务控制,避免订单重复支付发生。

7、异步化非关键业务

非关键业务是指用户不关心的业务环节,比如注册完成后,发送营销短信通知给用户,用户并不关心这个营销短信是否能及时送达。对于此类非关键业务环节,可以在设计上进行异步化处理。

常用的处理方式有:

  • 简单的处理方式——在流业务线程之外,另起线程/线程池来出来这类异步任务;特别需要主要线程池的使用,通常要同时限定thread size和queue size,否则在某些异常情况下,异步线程全部阻塞,导致任务堆积,会影响到主业务线程的执行。
  • 更好的方式——使用queue来作为任务的中转站,有后台job进行任务的离线处理,这样做还能有其他便利之处,比如job作为基础设施存在,能够有效利用计算资源。

异步化需要考虑业务场景是否是关键场景,任务是否可以容忍丢失。如果不容忍丢失,则智能使用queue的方式,且要对消息进行持久化。

8、使用异步IO

tomcat使用NIO提升服务性能,对提高网站的可用性也是有益的。

NIO vs BIO vs AIO 需要重新研究下,后续补上。

TODO......

时间: 2024-08-03 19:08:51

关于高并发下网站高可用性问题的总结的相关文章

1. 网站高并发下的测试指标及优化泛谈

网站高并发下的测试指标: 1. 并发量:可以承接多少次请求. 2. 服务器负载:服务器的cpu/内存消耗. 3. 平均响应时间:处理一次请求花费的时间. 测试高并发时,一般的测试标准是在服务器负载为70%的时候可以处理多少次请求还有每次请求的平均响应时间是多少. 高并发下优化泛谈: 1. 优化服务器计算能力,升级服务器的性能. 2. 优化io时间.主要是优化sql,尽量减少访问硬盘的时间. 3. 优化线程切换.服务器单核cpu在一个时间点只会执行一个线程,不断的在进行线程切换,线程切换会影响服务

java处理高并发高负载类网站的优化方法

一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的是M-M-Slaves方式,2个主Mysql,多个Slaves,需要注意的是,虽然有2个Master,但是同时只有1个是Activ

高并发下的 Nginx 优化与负载均衡

高并发下的 Nginx 优化 英文原文:Optimizing Nginx for High Traffic Loads 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行. 有一些坏消息要告诉你, 你不能像Apache一样优化Nginx.它没有魔术配置来减半负载或是让PHP运行速度加快一倍. 高兴的是, Nginx已经优化的非常好了. 当你决定使用Nginx并用a

高并发下的Nginx优化

高并发下的Nginx优化 2014-08-08 13:30 mood Nginx 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行. AD:2014WOT全球软件技术峰会北京站 课程视频发布 11月21日-22日 与WOT技术大会相约深圳 现在抢票 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache

高并发下linux系统、业务结构性能优化——index(不断更新)

工作中零零散散写了些博客,总结了些知识,当然是从运维的角度.东西一多就乱,闲时突发奇想,这些东西能不能打在一个点上,如果能有一个东西把所有内容串起来并且有一个主题岂不妙哉,也方便查阅和阅读,就像一个网站有了内容后需要一个index主页一样,哈哈,然后就有了这篇置顶博文. 对于主题,我喜欢研究业务架构和大并发相关知识,就定为"高并发下linux系统.业务结构性能优化"了,现有目录结构是根据工作经验进行的梳理,以后会动态修改.我的知识非常有限,不乏有些错误认识,不管怎样抛砖引玉分享出来,希

关于高并发下memcached可能出现的问题

首先,说说memcached的标准用法:memcached使用高效缓存,当有一些内容不是经常变动时,可以写入其中.如果有请求要获取这块数据,则优先从缓存中取出,仅当缓存过期,则从数据库获取实时数据,并再次更新到缓存中. 但如果网站频频出现高并发,比如说,将某块数据写入并设置有效时间为60s,但如果正好在60s后的那个瞬间,假如有10000个请求同时尝试获取这块数据,那么这10000个请求仍然只能通过数据库访问方式去获取,有没有办法缓解这种情况? 考虑利用memcache单个操作的原子性,使得10

高并发下问题随笔

高并发下随笔 随便写写,有什么不对的地方,请多指教. 选NGINX还是APACHE抗并发: 首先常用的架构是LNMP,之前用过LAMP的架构,但发现APACHE在高并发下表现并没有NGINX优异,原因是NGINX是异步非阻塞,APACHE是同步多进程阻塞型,NGINX会占用更少的资源抗并发,可能几千上万个链接依旧使用一个链接,NGINX也很容易组成集群, 给不同配置的服务器分配不同的权重,还包括负载均衡的方式,比如轮询与我们常用的IP_HASH等,所以推荐LNMP的架构. 选择HDD还是SSD硬

高并发高流量的网站架构设计 (转)

Web2.0的兴起,掀起了互联网新一轮的网络创业大潮.以用户为导向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也极大的方便了上网的人们.但Web2.0以用户为导向的理念,使得新生的网站有了新的特点——高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了新的要求. 本文围绕高并发高流量的网站架构设计问题,主要研究讨论了以下内容: 首先在整个网络的高度讨论了使用镜像网站,CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺点比较.然后在局域网层次对第四层交换技

高并发下的 Nginx 优化

英文原文:Optimizing Nginx for High Traffic Loads 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行. 有一些坏消息要告诉你, 你不能像Apache一样优化Nginx.它没有魔术配置来减半负载或是让PHP运行速度加快一倍. 高兴的是, Nginx已经优化的非常好了. 当你决定使用Nginx并用apt-get,yum或是mak