`
youyu4
  • 浏览: 440229 次
社区版块
存档分类
最新评论

互联网高并发问题

 
阅读更多

互联网高并发问题

 

 

       一般的互联网应用,访问量非常大,最常见的是高并发问题。这是很多程序员都头疼的问题,但是问题终究要解决,所以我们一起看看吧。

 

 

 

 

高并发要解决的问题

 

  • 同步
  • 服务器能够接受请求能力
  • 响应时间
  • 防止单点故障和扩展

 

 

 

同步

 

说起同步,就是要加锁,而锁又分为先三种

 

  • 代码层次上的,如java中的同步锁,典型的就是同步关键字synchronized(这里不讲,因为不适合分布式系统)
  • 数据库层次上的,这些是分布式锁,如数据库的悲观锁、乐观锁;redis的分布式锁机制
  • 第三方框架层次上的,如zookeeper

 

 

悲观锁

 

/*
本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。 
*/
select * from account where name=”Erica” for update

 

        悲观锁的实现,往往依靠数据库提供的锁机制,如果是InnoDB,就会是行锁(也只有数据库层提供的锁机制才能 真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系 统不会修改数据)。

 

优点:实现分布式锁。

 

缺点:在事务执行过程中,锁住对应记录,如果事务执行时间比较长,这样锁住资源太久,太浪费了。

 

 

 

乐观锁

 

       乐观锁主要是为了解决悲观锁的问题,不会在事务中锁住数据,只要加一个version,在update数据的时候version +1,然后保存到数据库。这样程序执行第二次update的方法时会返回false,因为version变了。

 

例如:

 

  1. 假设数据库中帐户信息表中有一个 version 字段,当前值为 1 ;而当前帐户余额字段( balance )为 $100 。
  2. 操作员 A 此时将其读出( version=1 ),并从其帐户余额中扣除 $50( $100-$50 )。
  3. 在操作员 A 操作的过程中,操作员 B 也读入此用户信息( version=1 ),并 从其帐户余额中扣除 $20 ( $100-$20 )。
  4. 操作员 A 完成了修改工作,将数据版本号加一( version=2 ),连同帐户扣除后余额( balance=$50 ),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 。
  5. 操作员 B 完成了操作,也将版本号加一( version=2 )试图向数据库提交数据( balance=$80 ),但此时比对数据库记录版本时发现,操作员 B 提交的数据版本号为 2 ,数据库记录当前版本也为 2 ,要求现在保存数据的版本必须大于数据库现在版本,因此,操作员 B 的提交被驳回。
  6. 这样,就避免了操作员 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的内存。
  • 用Nginx做动静分离:当请求访问的是静态数据就跳转到文件服务器(NFS),当请求访问的是动态数据就跳转到Tomcat。

 

 

负载均衡

 

       这是最常见的扩展方法,如果一台服务器能够接受的并发量是400,那提升到四台服务器,就是1600,是最直接有效的提升并发量的方式。

 

  • 硬件负载均衡:LVS
  • 软件负载均衡:Nginx
  • 第三方平台负载均衡:AWS、Azure

 

 

控制关键请求同时触发的量

 

       这是防止服务器挂掉的最后手段,一般对消耗资源比较大的API使用,思路如下:在请求API中,给API设置信号量,例如信号量只有20个,能够拿到的请求就执行,拿不到的就返回异常,那四台服务器,总共对于这个API的请求就是同时处理80个。这样虽然会出一些异常,但是最起码保证了服务器不会因为请求量过大而挂掉。

 

 

 

 

响应时间

 

    响应时间是互联网应用很重要的一点,我们应该想尽办法让服务器更快返回信息。

 

解决方法:

 

  • 数据库优化
  • 缓存的使用
  • JVM优化
  • NoSQL分布式数据引擎及MapReduce:Hadoop(不熟悉,以后学习)
  • CDN镜像(不熟悉,以后学习)
  • 带宽,网速好当然好点(不属于开发内容,这里不讲了)

 

 

数据库优化

 

  • 数据库存储引擎选择
  • 数据库集群
  • 优化数据库结构,多做索引,提高查询效率;分表;读写分离;业务分库。
  • 优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化),重点是保证索引有效,explain一下你的SQL语句。
  • 减少数据库IO次数,不过要看具体情况。
  • 还有个更能绝的方法,用Hbase等其他数据库代替MySQL

 

 

缓存的使用

 

       尽量使用缓存(Redis),是因为缓存速度奇快,而且用途很多,为我们开发和解决方案提供很多便利。

常用用途:
  • 缓存热门数据,如:user session
  • 为业务需求,缓存用户基本信息,查看通讯录好友时候是App用户
  • 分布式锁
  • inc()方法,可以实现全局唯一ID生成
  • 常用的是String、Hash,也可以用队列、set做交集并集、sortedSet做排行榜
 
 
JVM优化
       JVM的优化主要是减少Minor GC 和 Full GC的次数和时间,从而减少系统因为垃圾回收所引起的停顿,我之前的文章有写关于JVM调优的内容。
 

 

 

防止单点故障和扩展

 

       这方面的设计,现有最好的解决方案是使用云平台,因为云平台的冗余量、扩展性、自动部署,都做的非常好,就是钱的问题。

 

解决方案:

 

  • 使用云平台,防止单点故障和实现易扩展
  • 自己做冗余和负载均衡,工作量很大

 

 

 

案例分析

 

 

案例一:订票系统,只有一张机票,1W个人抢,如何解决高并发问题(可扩展到任何高并发网站要考虑的并发读写问题)

 

 

问题关键

 

  1. 在票卖出之前,所有人都应该看到票
  2. 即使再多人进来,也要保证只有一个人能抢到票
  3. 如果1W人同时请求系统,而系统能够接受的并发了又达不到这个数,应该想办法保证系统不会挂掉

 

解决思路

 

  1. 可以把票看作是共享资源,那就要加锁;而这种订票网站,一般是分布式架构,应该用分布式锁。
  2. 订单是对数据库操作,选择使用数据库锁做分布式锁,那要用悲观锁?乐观锁?
  3. 悲观锁锁住资源时间太久,不能接受,选择了用乐观锁。
  4. 是有在提交时,数据库version = 查出来时的version,才保存数据,记住version++。
  5. 使用乐观锁就要加version,这个用什么数据类型,如何设计,设计多大,需要讨论;还有旧数据要设置什么值。
  6. 乐观锁的使用,是用hibernate?还是自己逻辑解决?这要看系统原有架构
  7. 控制服务器可进入的请求量,可以用信号量,例如一台server有20个信号量,那就时同时可以接受20个请求,每进入一个请求拿一个信号量,使用完就释放信号量。保证服务器是在一个不高负载的环境下运行。
  8. 基本写好实现后,还要进行压测,试试效果,加多些log,保证方便查询调用时情况。

 

 

案例二:多个用户同时使用短信验证码登陆

 

问题关键:

 

  1. 发出请求后,如何加快响应时间
  2. 如何防止同一时间内,多次发送和接受短信
  3. 如果不断请求验证短信,怎么防止攻击

 

解决思路:

 

  1. 想要响应时间更快,后端接收到请求后,用线程池调用发短信API,然后马上返回发送成功。
  2. 想要防止同一时间内多次发短信,首先前端点了发送后,按钮禁用,有一个60s的冷却期
  3. 然后后端用redis来标记,这个时间段内是否发过短信
  4. 大致方法,redis.setex(phonenumber+'SMSSended',60,1);//设置一个60秒的标志位;redis.exists(phonenumber+'SMSSended');//检测是否存在
  5. 防止攻击,可以在发送短信后,保存一条数据在数据库,发短信请求过来时,验证一段时间内连续发送的次数,例如在10分钟内,如果连续发了5次,并且没有使用的,就让用户进入冷却期(在半个小时内,不能再请求发送短信)。
  6. 上面的方法要注意检查两点,一是电话号码,是防止一个人多次请求,占用资源;二是deviceId,是防止有人恶意攻击。

 

 

案例三:一个商家同时收到多个人发来的钱,一个人同时向多个人转钱

 

问题关键:

 

  1. 这种同时执行,实际上就需要排序一个个执行,那是否要用阻塞队列?
  2. 怎么保证一个商家收多个人的钱是有序,一个个执行的

 

解决思路:

 

  1. 这种多个商家可以并发收钱的业务,应该不使用队列,因为有可能要建多个队列,所以使用分布式锁
  2. 在赚钱给商家之间,先用setNx(),key = 商家id,超时删除时间 = 交易超时时间 + 几秒
  3. 然后执行赚钱给商家的业务,在这里面执行的因为有锁,所以保证只能有一笔转钱给商家的交易正在进行。
  4. 交易完成后删除锁。
  5. 如果一笔交易之前拿不到锁,那么就等待几秒再继续拿锁,进行一个轮询,等请求超时就返回给前端。

 

新问题:

 

  1. 在一条交易正在进行时加锁,那如何保证加锁期间,再进来的请求后面是有序进行的?(思考中。。。)

 

 

 

 

携程的高并发应用架构

 

http://geek.csdn.net/news/detail/96708

 

其他学习资料

http://www.iqiyi.com/w_19rshylvpx.html

分享到:
评论

相关推荐

    互联网高并发解决方案

    互联网高并发解决方案互联网高并发解决方案互联网高并发解决方案

    互联网高并发技术架构图

    "互联网高并发技术架构图" 描述了如何构建一个能够应对高并发的复杂系统,涉及到多个关键领域和组件。 1. **生产环境**:生产环境是实际部署应用和服务的地方,它需要能够承受大量并发请求,同时保持高可用性和稳定...

    互联网高并发架构设计说明.pdf

    本文档旨在讨论互联网高并发架构设计的关键点,并提供了一些实践方案来解决高并发问题。高并发经常会发生在有大活跃用户量、用户高聚集的业务场景中,如秒杀活动、定时领取红包等。在电商相关产品开发中,我们需要...

    实战Java高并发程序设计(高清版)

    随着互联网技术的快速发展,高并发系统已经成为处理大规模用户请求的标准配置。《实战Java高并发程序设计》这本书正是一本专注于这一主题的资源,它旨在帮助读者深入理解如何在Java环境中构建可扩展、高效且稳定的高...

    Java系统的高并发解决方法详解

    但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。 上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张...

    Java高并发视频教学,并带实战java高并发程序设计,高并发面试题目

    Java高并发编程是Java开发中的重要领域,尤其在大规模分布式系统和互联网应用中,对高并发处理能力的要求日益提升。本资源包含了一套完整的Java高并发视频教学,以及相关的实战项目和面试题目,旨在帮助开发者深入...

    互联网高并发+高可用+海量用户架构实践

    ### 互联网高并发+高可用+海量用户架构实践 #### 一、单点系统可用性架构与优化方向 **互联网架构师的任务**:确保架构设计紧密贴合业务需求,任何脱离实际业务需求的设计都难以发挥最大价值。 **互联网架构的...

    深入理解高并发编程-核心技术原理

    **面试篇**包含了高并发场景下的优化策略和常见问题,比如优化加锁方式可能导致的死锁,缓存穿透、击穿和雪崩的现象及其解决方案,以及Java中synchronized和Lock的区别和使用场景。 **系统架构篇**涉及高并发下的...

    高并发的常见应对方案

    针对高并发问题,业界已经发展出了多种有效的解决方案。下面将详细介绍几种常用的优化手段。 ##### 数据库缓存 **数据库缓存**是一种非常有效的方式来缓解数据库的压力,并提高系统的响应速度。通过将经常访问的...

    (完整word版)互联网高并发架构设计.doc

    【互联网高并发架构设计】 高并发架构设计是解决大规模用户同时访问系统时,确保系统稳定、高效运行的关键。在互联网领域,特别是在电商、社交等业务中,秒杀、红包领取等场景经常出现高并发,因此设计合理的架构至...

    33.第三十三阶段、互联网企业高并发解决方案视频全集

    33.第三十三阶段、互联网企业高并发解决方案视频全集,33.第三十三阶段、互联网企业高并发解决方案视频全集,33.第三十三阶段、互联网企业高并发解决方案视频全集,33.第三十三阶段、互联网企业高并发解决方案视频...

    互联网高并发解决方案-基于Hystrix实现服务隔离与降级

    互联网高并发解决方案-基于Hystrix实现服务隔离与降级互联网高并发解决方案-基于Hystrix实现服务隔离与降级互联网高并发解决方案-基于Hystrix实现服务隔离与降级互联网高并发解决方案-基于Hystrix实现服务隔离与降级...

    高并发解决方案

    综上所述,解决高并发问题需要综合运用多种技术和策略,根据具体业务场景选择合适的方法,不断优化和调整,以达到系统性能的最大化。文件"2016"可能包含的是2016年关于高并发解决方案的资料,深入学习这些资料,可以...

    互联网高并发解决方法.doc

    企业高并发的成熟解决方案 1 1 整体网站架构分析 1 2 高并发 1 2.1 什么是高并发呢? 1 2.2 高并发原理图 1 2.3 初期解决方案 2 2.3.1 系统或服务器级别的解决方案 2 2.3.2 应用级别的解决方案 2 2.4 能否增加服务器...

    互联网高并发架构设计.docx

    总结来说,互联网高并发架构设计涵盖了服务器集群、负载均衡、数据库优化、缓存策略、并发测试、消息队列等多个方面。设计过程中需要不断迭代和优化,以应对日益增长的并发挑战,保证系统的稳定性和用户体验。通过...

    (完整word版)互联网高并发架构设计.docx

    《互联网高并发架构设计》 高并发架构设计是互联网领域中的关键挑战,尤其在具有大量活跃用户的业务场景中,如秒杀活动、定时红包领取等。为了确保业务的流畅运行和用户良好的交互体验,我们需要根据业务特点和预期...

    高并发web架构完整1

    在当今互联网行业中,随着用户数量的急剧增长,Web应用必须具备处理高并发请求的能力,才能确保服务的稳定性和用户体验。本资料旨在深入探讨如何设计和实施这种能够应对大规模并发访问的Web架构。 第一部分:基础...

    《高并发网站与分布式缓存Redis与开发实战》3.0.pdf

    在本书中,C#语言被提及,表明其在处理分布式缓存和高并发问题上的重要性。 4. Azure云计算平台:Azure是微软提供的一个云计算服务平台,它提供了一系列云服务,包括虚拟机、应用服务、数据库服务等。通过使用Azure...

    互联网高并发架构技术实践

    ### 互联网高并发架构技术实践 #### 单机时代的架构变迁与挑战 互联网早期,特别是在杭研这样的初创团队中,由于资源有限和技术条件所限,单机架构成为了快速开发产品和上线网站的一种常见选择。这一阶段,应用...

Global site tag (gtag.js) - Google Analytics