互联网高并发问题
一般的互联网应用,访问量非常大,最常见的是高并发问题。这是很多程序员都头疼的问题,但是问题终究要解决,所以我们一起看看吧。
高并发要解决的问题
- 同步
- 服务器能够接受请求能力
- 响应时间
- 防止单点故障和扩展
同步
说起同步,就是要加锁,而锁又分为先三种
- 代码层次上的,如java中的同步锁,典型的就是同步关键字synchronized(这里不讲,因为不适合分布式系统)
- 数据库层次上的,这些是分布式锁,如数据库的悲观锁、乐观锁;redis的分布式锁机制
- 第三方框架层次上的,如zookeeper
悲观锁
/* 本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。 */ select * from account where name=”Erica” for update
悲观锁的实现,往往依靠数据库提供的锁机制,如果是InnoDB,就会是行锁(也只有数据库层提供的锁机制才能 真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系 统不会修改数据)。
优点:实现分布式锁。
缺点:在事务执行过程中,锁住对应记录,如果事务执行时间比较长,这样锁住资源太久,太浪费了。
乐观锁
乐观锁主要是为了解决悲观锁的问题,不会在事务中锁住数据,只要加一个version,在update数据的时候version +1,然后保存到数据库。这样程序执行第二次update的方法时会返回false,因为version变了。
例如:
- 假设数据库中帐户信息表中有一个 version 字段,当前值为 1 ;而当前帐户余额字段( balance )为 $100 。
- 操作员 A 此时将其读出( version=1 ),并从其帐户余额中扣除 $50( $100-$50 )。
- 在操作员 A 操作的过程中,操作员 B 也读入此用户信息( version=1 ),并 从其帐户余额中扣除 $20 ( $100-$20 )。
- 操作员 A 完成了修改工作,将数据版本号加一( version=2 ),连同帐户扣除后余额( balance=$50 ),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 。
- 操作员 B 完成了操作,也将版本号加一( version=2 )试图向数据库提交数据( balance=$80 ),但此时比对数据库记录版本时发现,操作员 B 提交的数据版本号为 2 ,数据库记录当前版本也为 2 ,要求现在保存数据的版本必须大于数据库现在版本,因此,操作员 B 的提交被驳回。
- 这样,就避免了操作员 B 用基于version=1 的旧数据修改的结果覆盖操作 员 A 的操作结果的可能。
优点:乐观锁机制避免了长事务中的数据库加锁开销(操作员 A和操作员 B 操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系 统整体性能表现。
缺点:需要注意的是,乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一定的局 限性,如在上例中,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户 余额更新操作不受我们系统的控制,因此可能会造成脏数据被更新到数据库中。在 系统设计阶段,我们应该充分考虑到这些情况出现的可能性。
优化方案:将乐观锁策略在数据库存储过程中实现,对外只开放基于此存储过程的数据更新途 径,而不是将数据库表直接对外公开。
注意
Hibernate中同时实现了悲观锁和乐观锁。
//Hibernate悲观锁实现 String hqlStr ="from TUser as user where user.name='Erica'"; Query query = session.createQuery(hqlStr); query.setLockMode("user",LockMode.UPGRADE); // 加锁 List userList = query.list();// 执行查询,获取数据
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.xiaohao.test"> <!--乐观锁就靠optimistic-lock这个配置,并且表中有version这个字段--> <class name="User" table="user" optimistic-lock="version" > <id name="id"> <generator class="native" /> </id> <!--version标签必须跟在id标签后面--> <version column="version" name="version" /> <property name="userName"/> <property name="password"/> </class> </hibernate-mapping>
服务器能够承受请求的能力
首先,每个服务器能够承受的请求个数是有限的,太多的时候,服务器会出来不过来,一般单台服务器,能够承受400的并发量,但是这远远满足不了需求。
解决方法:
- 能使用静态页面的地方尽量使用
- 负载均衡
- 控制关键请求同时触发的量
使用静态页面代替动态页面
- 尽量减少动态页面(jsp、asp)的使用:这种方法就是减少jsp的使用,减少服务器对动态页面的解析,也减少启动服务时,占用jvm的内存。
相关推荐
互联网高并发解决方案互联网高并发解决方案互联网高并发解决方案
"互联网高并发技术架构图" 描述了如何构建一个能够应对高并发的复杂系统,涉及到多个关键领域和组件。 1. **生产环境**:生产环境是实际部署应用和服务的地方,它需要能够承受大量并发请求,同时保持高可用性和稳定...
随着互联网技术的快速发展,高并发系统已经成为处理大规模用户请求的标准配置。《实战Java高并发程序设计》这本书正是一本专注于这一主题的资源,它旨在帮助读者深入理解如何在Java环境中构建可扩展、高效且稳定的高...
但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。 上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张...
Java高并发编程是Java开发中的重要领域,尤其在大规模分布式系统和互联网应用中,对高并发处理能力的要求日益提升。本资源包含了一套完整的Java高并发视频教学,以及相关的实战项目和面试题目,旨在帮助开发者深入...
### 互联网高并发+高可用+海量用户架构实践 #### 一、单点系统可用性架构与优化方向 **互联网架构师的任务**:确保架构设计紧密贴合业务需求,任何脱离实际业务需求的设计都难以发挥最大价值。 **互联网架构的...
**面试篇**包含了高并发场景下的优化策略和常见问题,比如优化加锁方式可能导致的死锁,缓存穿透、击穿和雪崩的现象及其解决方案,以及Java中synchronized和Lock的区别和使用场景。 **系统架构篇**涉及高并发下的...
针对高并发问题,业界已经发展出了多种有效的解决方案。下面将详细介绍几种常用的优化手段。 ##### 数据库缓存 **数据库缓存**是一种非常有效的方式来缓解数据库的压力,并提高系统的响应速度。通过将经常访问的...
【互联网高并发架构设计】 高并发架构设计是解决大规模用户同时访问系统时,确保系统稳定、高效运行的关键。在互联网领域,特别是在电商、社交等业务中,秒杀、红包领取等场景经常出现高并发,因此设计合理的架构至...
33.第三十三阶段、互联网企业高并发解决方案视频全集,33.第三十三阶段、互联网企业高并发解决方案视频全集,33.第三十三阶段、互联网企业高并发解决方案视频全集,33.第三十三阶段、互联网企业高并发解决方案视频...
## 互联网高并发架构设计的关键点 ### 服务器架构设计 首先,服务器架构的设计是支持高并发的基础。高性能的服务器集群能够合理分配流量,保证服务的稳定性和扩展性。在设计时需充分考虑到以下几点: - **负载...
互联网高并发解决方案-基于Hystrix实现服务隔离与降级互联网高并发解决方案-基于Hystrix实现服务隔离与降级互联网高并发解决方案-基于Hystrix实现服务隔离与降级互联网高并发解决方案-基于Hystrix实现服务隔离与降级...
综上所述,解决高并发问题需要综合运用多种技术和策略,根据具体业务场景选择合适的方法,不断优化和调整,以达到系统性能的最大化。文件"2016"可能包含的是2016年关于高并发解决方案的资料,深入学习这些资料,可以...
企业高并发的成熟解决方案 1 1 整体网站架构分析 1 2 高并发 1 2.1 什么是高并发呢? 1 2.2 高并发原理图 1 2.3 初期解决方案 2 2.3.1 系统或服务器级别的解决方案 2 2.3.2 应用级别的解决方案 2 2.4 能否增加服务器...
总结来说,互联网高并发架构设计涵盖了服务器集群、负载均衡、数据库优化、缓存策略、并发测试、消息队列等多个方面。设计过程中需要不断迭代和优化,以应对日益增长的并发挑战,保证系统的稳定性和用户体验。通过...
《互联网高并发架构设计》 高并发架构设计是互联网领域中的关键挑战,尤其在具有大量活跃用户的业务场景中,如秒杀活动、定时红包领取等。为了确保业务的流畅运行和用户良好的交互体验,我们需要根据业务特点和预期...
在当今互联网行业中,随着用户数量的急剧增长,Web应用必须具备处理高并发请求的能力,才能确保服务的稳定性和用户体验。本资料旨在深入探讨如何设计和实施这种能够应对大规模并发访问的Web架构。 第一部分:基础...
在本书中,C#语言被提及,表明其在处理分布式缓存和高并发问题上的重要性。 4. Azure云计算平台:Azure是微软提供的一个云计算服务平台,它提供了一系列云服务,包括虚拟机、应用服务、数据库服务等。通过使用Azure...
### 互联网高并发架构技术实践 #### 单机时代的架构变迁与挑战 互联网早期,特别是在杭研这样的初创团队中,由于资源有限和技术条件所限,单机架构成为了快速开发产品和上线网站的一种常见选择。这一阶段,应用...