大话程序猿眼里的高并发

jonathan
2016-05-18 / 0 评论

大话程序猿眼里的高并发

简单理解高并发

高并发指的是在同一时间点,有很多用户同时访问某个URL地址。例如淘宝的双11、双12活动,贴吧的爆吧事件(恶意的高并发请求,即DDOS攻击)。简单来说,就像玩游戏中被ADC暴击了一样,伤害巨大。

高并发带来的后果

  • 服务端:站点服务器/DB服务器资源被占满崩溃,数据存储和更新结果与理想设计不一致(如重复的数据记录,多次添加用户积分等)。
  • 用户角度:页面卡顿,用户体验差,可能导致用户流失。
  • 我的经历:在开发公司产品网站时,经常会有类似抽奖、签到、积分竞拍等功能需求。如果未考虑高并发下的数据处理,可能会导致数据异常,影响用户体验。

实例分析

并发下的数据处理

通过表设计(如记录表添加唯一约束)、使用事务防止并发下的数据错乱问题,以及通过服务端锁进程防止并发下的数据错乱问题。

例子1:签到功能

需求:一天一个用户只能签到一次,签到成功后用户获取一个积分。

已知表:用户表,包含积分字段。

设计

  1. 添加一张签到记录表,并将用户唯一标识字段(ID, Token)和签到日期字段设为唯一约束或索引。
  2. 在代码逻辑中,先执行签到数据的添加,再进行积分的添加。
  3. 所有操作写在一个SQL事务里,确保数据一致性。

例子2:抽奖功能

需求:抽奖一次消耗一个积分,抽奖中奖后编辑剩余奖品总数。当剩余奖品总数为0或用户积分为0时无法进行抽奖。

已知表:用户表(包含积分字段),奖品表(包含奖品剩余数量字段)。

设计

  1. 在事务中,通过WITH (UPDLOCK)锁住商品表,或更新表的奖品剩余数量和最后编辑时间字段来锁定数据行。
  2. 进行用户积分的消耗,完成后提交事务,失败则回滚。

例子3:缓存数据到Cache

需求:当缓存不存在时从数据库获取并保存到缓存中;每天10点必须更新一次,其他时间点缓存两小时更新一次。

问题:10点时有很多并发请求同时过来,导致大量SQL查询操作,增加服务器压力。

解决:C#通过lock机制,在从数据库读取到缓存的代码前加上锁,确保只有一个请求是从数据库获取数据,其他都从缓存中获取。

访问量大的数据统计接口

需求:用户行为数据统计接口,记录商品展示次数等。

问题:大量用户同时在线访问页面会导致大量请求,给服务器带来巨大压力。

解决:通过Node.js写一个数据处理接口,把统计数据先存到Redis的list里,然后再同步到MySQL数据库中。这样可以减少数据库压力,加快响应速度。

高并发下的服务器压力均衡

  1. 服务器代理Nginx:做服务器的负载均衡,分散压力到多台服务器。
  2. 集群部署:MySQL数据库、Redis服务器或MongoDB服务器,常用查询数据保存到NoSQL DB中,减少数据库压力。
  3. 数据缓存:使用Cache。
  4. 编程语言选择:使用具有高并发能力的语言(如Node.js)开发Web接口。
  5. 服务器部署:图片服务器分离,静态文件走CDN。
  6. 数据库优化:优化查询条件和索引。
  7. 消息队列:将数据添加到信息队列(如Redis list)中,再写工具入库。
  8. 脚本控制请求:防止用户重复点击导致多余的AJAX请求。

并发测试神器推荐

  1. Apache JMeter
  2. Microsoft Web Application Stress Tool
  3. Visual Studio 性能负载

文章来源

评论

博主关闭了当前页面的评论