`

高并发意淫分析

阅读更多

高并发会来带的后果

  • 服务端:

    • 导致站点服务器/DB服务器资源被占满崩溃,数据的存储和更新结果和理想的设计是不一样的,比如:出现重复的数据记录,多次添加了用户积分等。

  • 用户角度:

    • 尼玛,这么卡,老子来参加活动的,刷新了还是这样,垃圾网站,再也不来了。

  • 我的经历:
    在做公司产品网站的过程中,经常会有这样的需求,比如什么搞个活动专题,抽奖,签到,搞个积分竞拍等等,如果没有考虑到高并发下的数据处理,那就Game Over了,很容易导致抽奖被多抽走,签到会发现一个用户有多条记录,签到一次获得了获得了多积分,等等,各种超出正常逻辑的现象,这就是做产品网站必须 考虑的问题,因为这些都是面向大量用户的,而不是像做ERP管理系统,OA系统那样,只是面向员工。

下面我进行实例分析,简单粗暴,动态分析,纯属本人个人经验分享,如有说错,或者有更好的建议或者意见的请留言,大家一起成长。

并发下的数据处理:

通过表设计,如:记录表添加唯一约束,数据处理逻辑使用事物防止并发下的数据错乱问题
通过服务端锁进程防止包并发下的数据错乱问题

这里主要讲述的是在并发请求下的数据逻辑处理的接口,如何保证数据的一致性和完整性,这里的并发可能是大量用户发起的,也可能攻击者通过并发工具发起的并发请求


如例子:通过表设计防止并发导致数据错乱

  • 需求点 
    【签到功能】 一天一个用户只能签到一次,
    签到成功后用户获取到一个积分

  • 已知表 
    用户表,包含积分字段   
    高并发意淫分析(属于开发前的猜测): 
    在高并发的情况下,会导致,一个用户签到记录会有多条,或者用户签到后不止加一积分。

  • 我的设计 
    首先根据需求我会添加一张签到记录表,重点来了,这张表需要把用户唯一标识字段(ID,Token)和签到日期字段添加为唯一约束,或者唯一索引,这样就 可以防止并发的时候插入重复用户的签到记录。然后再程序代码逻辑里,先执行签到数据的添加(这里可以防止并发,添加成功后再进行积分的添加,这样就可以防 止重复的添加积分了。最后我还是建议所有的数据操作都写在一个sql事务里面,  这样在添加失败,或者编辑用户积分失败的时候可以回滚数据。


如例子2(事务+通过更新锁 防止并发导致数据错乱 或者事物+Update的锁表机制)

  • 需求点: 
    【抽奖功能】 抽奖一次消耗一个积分 抽奖中奖后编辑剩余奖品总数 剩余奖品总数为0,或者用户积分为0的时候无法进行抽奖

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

  • 高并发意淫分析(属于开发前的猜测): 
    在高并发的情况下,会导致用户参与抽奖的时候积分被扣除,而奖品实际上已经被抽完了

  • 我的设计: 
    在事物里,通过WITH (UPDLOCK) 锁住商品表,或者Update 表的奖品剩余数量和最后编辑时间字段,来把数据行锁住,然后进行用户积分的消耗,都完成后提交事物,失败就回滚。 这样就可以保证,只有可能存在一个操作在操作这件商品的数量,只有等到这个操作事物提交后,其他的操作这个商品行的事物才会继续执行。


如例子3(通过程序代码防止包并发下的数据错乱问题)

  • 需求点:
    【缓存数据到cache里】, 当缓存不存在的时候,从数据库中获取并保存在cache里,如果存在从cache里获取,每天10点必须更新一次,其他时间点缓存两个小时更新一次 到10点的时候,凡是打开页面的用户会自动刷新页面

  • 问题点:
    这里有个逻辑用户触发缓存的更新,用户刷新页面,当缓存存在的时候,会取到最后一次缓存更新时间,如果当前时间大于十点,并且最后缓存时间是10点前,则 会从数据库中重新获取数据保存到cache中。 还有客户端页面会在10点时候用js发起页面的刷新,就是因为有这样的逻辑,导致10点的时候有很多并发请求同时过来,然后就会导致很多的sql查询操 作,理想的逻辑是,只有一个请求会去数据库获取,其他都是从缓存中获取数据。(因为这个sql查询很耗服务器性能,所以导致在10点的时候,突然间数据库 服务器压力暴增)

  • 解决问题:
    C#通过 (锁)lock,在从数据读取到缓存的那段代码前面加上锁,这样在并发的情况下只会有一个请求是从数据库里获取数据,其他都是从缓存中获取。


访问量大的数据统计接口

  • 需求: 用户行为数据统计接口,用来记录商品展示次数,用户通过点击图片,或者链接,或者其他方式进入到商品详情的行为次数

  • 问题点:
    这接口是给前端ajax使用,访问量会很大,一页面展示的时候就会有几十件商品的展示,滚动条滚到到页面显示商品的时候就会请求接口进行展示数据的统计,每次翻页又会加载几十件

  • 意淫分析:
    设想如果同时有1W个用户同时在线访问页面,一个次拉动滚动条屏幕页面展示10件商品,这样就会有10W个请求过来,服务端需要把请求数据入库。在实际线上环境可能还会超过这个请求量,如果不经过进行高并发设计处理,服务器分分钟给跪了。

  • 解决问题:
    我们通过nodejs写了一个数据处理接口,把统计数据先存到redis的list里。(使用nodejs写接口的好处是,nodejs使用单线程异步事件机制,高并发处理能力强,不会因为数据逻辑处理问题导致服务器资源被占用而导致服务器宕机) 然后再使用nodejs写了一个脚本,脚本功能就是从redis里出列数据保存到mysql数据库中。这个脚本会一直运行,当redis没有数据需要同步到数据库中的时候,sleep,让在进行数据同步操作


高并发的下的服务器压力均衡,合理站点架设,DB部署

以下我所知道的:

  1. 服务器代理nginx,做服务器的均衡负载,把压力均衡到多台服务器

  2. 部署集群 mysql数据库, redis服务器,或者mongodb服务器,把一些常用的查询数据,并且不会经常的变化的数据保存到其他nosql    DB服务器中,来减少数据库服务器的压力,加快数据的响应速度。

  3. 数据缓存,Cache

  4. 在高并发接口的设计

    高并发会来带的后果

    • 服务端:

      • 导致站点服务器/DB服务器资源被占满崩溃,数据的存储和更新结果和理想的设计是不一样的,比如:出现重复的数据记录,多次添加了用户积分等。

    • 用户角度:

      • 尼玛,这么卡,老子来参加活动的,刷新了还是这样,垃圾网站,再也不来了。

    • 我的经历:
      在做公司产品网站的过程中,经常会有这样的需求,比如什么搞个活动专题,抽奖,签到,搞个积分竞拍等等,如果没有考虑到高并发下的数据处理,那就Game Over了,很容易导致抽奖被多抽走,签到会发现一个用户有多条记录,签到一次获得了获得了多积分,等等,各种超出正常逻辑的现象,这就是做产品网站必须 考虑的问题,因为这些都是面向大量用户的,而不是像做ERP管理系统,OA系统那样,只是面向员工。

    下面我进行实例分析,简单粗暴,动态分析,纯属本人个人经验分享,如有说错,或者有更好的建议或者意见的请留言,大家一起成长。

    并发下的数据处理:

    通过表设计,如:记录表添加唯一约束,数据处理逻辑使用事物防止并发下的数据错乱问题
    通过服务端锁进程防止包并发下的数据错乱问题

    这里主要讲述的是在并发请求下的数据逻辑处理的接口,如何保证数据的一致性和完整性,这里的并发可能是大量用户发起的,也可能攻击者通过并发工具发起的并发请求


    如例子:通过表设计防止并发导致数据错乱

    • 需求点 
      【签到功能】 一天一个用户只能签到一次,
      签到成功后用户获取到一个积分

    • 已知表 
      用户表,包含积分字段   
      高并发意淫分析(属于开发前的猜测): 
      在高并发的情况下,会导致,一个用户签到记录会有多条,或者用户签到后不止加一积分。

    • 我的设计 
      首先根据需求我会添加一张签到记录表,重点来了,这张表需要把用户唯一标识字段(ID,Token)和签到日期字段添加为唯一约束,或者唯一索引,这样就 可以防止并发的时候插入重复用户的签到记录。然后再程序代码逻辑里,先执行签到数据的添加(这里可以防止并发,添加成功后再进行积分的添加,这样就可以防 止重复的添加积分了。最后我还是建议所有的数据操作都写在一个sql事务里面,  这样在添加失败,或者编辑用户积分失败的时候可以回滚数据。


    如例子2(事务+通过更新锁 防止并发导致数据错乱 或者事物+Update的锁表机制)

    • 需求点: 
      【抽奖功能】 抽奖一次消耗一个积分 抽奖中奖后编辑剩余奖品总数 剩余奖品总数为0,或者用户积分为0的时候无法进行抽奖

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

    • 高并发意淫分析(属于开发前的猜测): 
      在高并发的情况下,会导致用户参与抽奖的时候积分被扣除,而奖品实际上已经被抽完了

    • 我的设计: 
      在事物里,通过WITH (UPDLOCK) 锁住商品表,或者Update 表的奖品剩余数量和最后编辑时间字段,来把数据行锁住,然后进行用户积分的消耗,都完成后提交事物,失败就回滚。 这样就可以保证,只有可能存在一个操作在操作这件商品的数量,只有等到这个操作事物提交后,其他的操作这个商品行的事物才会继续执行。


    如例子3(通过程序代码防止包并发下的数据错乱问题)

    • 需求点:
      【缓存数据到cache里】, 当缓存不存在的时候,从数据库中获取并保存在cache里,如果存在从cache里获取,每天10点必须更新一次,其他时间点缓存两个小时更新一次 到10点的时候,凡是打开页面的用户会自动刷新页面

    • 问题点:
      这里有个逻辑用户触发缓存的更新,用户刷新页面,当缓存存在的时候,会取到最后一次缓存更新时间,如果当前时间大于十点,并且最后缓存时间是10点前,则 会从数据库中重新获取数据保存到cache中。 还有客户端页面会在10点时候用js发起页面的刷新,就是因为有这样的逻辑,导致10点的时候有很多并发请求同时过来,然后就会导致很多的sql查询操 作,理想的逻辑是,只有一个请求会去数据库获取,其他都是从缓存中获取数据。(因为这个sql查询很耗服务器性能,所以导致在10点的时候,突然间数据库 服务器压力暴增)

    • 解决问题:
      C#通过 (锁)lock,在从数据读取到缓存的那段代码前面加上锁,这样在并发的情况下只会有一个请求是从数据库里获取数据,其他都是从缓存中获取。


    访问量大的数据统计接口

    • 需求: 用户行为数据统计接口,用来记录商品展示次数,用户通过点击图片,或者链接,或者其他方式进入到商品详情的行为次数

    • 问题点:
      这接口是给前端ajax使用,访问量会很大,一页面展示的时候就会有几十件商品的展示,滚动条滚到到页面显示商品的时候就会请求接口进行展示数据的统计,每次翻页又会加载几十件

    • 意淫分析:
      设想如果同时有1W个用户同时在线访问页面,一个次拉动滚动条屏幕页面展示10件商品,这样就会有10W个请求过来,服务端需要把请求数据入库。在实际线上环境可能还会超过这个请求量,如果不经过进行高并发设计处理,服务器分分钟给跪了。

    • 解决问题:
      我们通过nodejs写了一个数据处理接口,把统计数据先存到redis的list里。(使用nodejs写接口的好处是,nodejs使用单线程异步事件机制,高并发处理能力强,不会因为数据逻辑处理问题导致服务器资源被占用而导致服务器宕机) 然后再使用nodejs写了一个脚本,脚本功能就是从redis里出列数据保存到mysql数据库中。这个脚本会一直运行,当redis没有数据需要同步到数据库中的时候,sleep,让在进行数据同步操作


    高并发的下的服务器压力均衡,合理站点架设,DB部署

    以下我所知道的:

    1. 服务器代理nginx,做服务器的均衡负载,把压力均衡到多台服务器

    2. 部署集群 mysql数据库, redis服务器,或者mongodb服务器,把一些常用的查询数据,并且不会经常的变化的数据保存到其他nosql    DB服务器中,来减少数据库服务器的压力,加快数据的响应速度。

    3. 数据缓存,Cache

    4. 在高并发接口的设计中可以使用具有高并发能力的编程语言去开发,如:nodejs 做web接口

    5. 服务器部署,图片服务器分离,静态文件走CDN

    6. DBA数据库的优化查询条件,索引优化

    7. 消息存储机制,将数据添加到信息队列中(redis list),然后再写工具去入库

    8. 脚本合理控制请求,如,防止用户重复点击导致的ajax多余的请求,等等。

    并发测试神器推荐

    1. Apache JMeter

    2. Microsoft Web Application Stress Tool

    3. Visual Studio 性能负载

    中可以使用具有高并发能力的编程语言去开发,如:nodejs 做web接口

  5. 服务器部署,图片服务器分离,静态文件走CDN

  6. DBA数据库的优化查询条件,索引优化

  7. 消息存储机制,将数据添加到信息队列中(redis list),然后再写工具去入库

  8. 脚本合理控制请求,如,防止用户重复点击导致的ajax多余的请求,等等。

并发测试神器推荐

  1. Apache JMeter

  2. Microsoft Web Application Stress Tool

  3. Visual Studio 性能负载

分享到:
评论

相关推荐

    现实不是意淫出来的

    现实不是意淫出来的

    心智激励 情感满足 意淫=精神溢价=电商品牌的未来!.ppt

    心智激励 情感满足 意淫=精神溢价=电商品牌的未来!.ppt

    基于Vue的上传+预览图片(类似于微信的发布动态)

    基本思路就是先写好基本样式(遮罩啊等等...好吧以上是我的意淫。试了以后是有效果。但是不完美,图片放大事件啥的不知道咋弄,后来用了个比较成熟的PhotoSwipe,研究了一番加上自己稍微的小修改做出来了。给它个赞吧。

    C#__Socket编程笔记.doc

    想学好C#吗?没有别的巧办法,多编多想多做笔记吧! 关于C# Socket编程,学好就可以做自己的通讯软件了,再也不用担心QQ和360之间的任何矛盾了,当然这只是小小意淫一下啦!!

    Linux渗透中文文章汇总合集

    pentest_metasploitable-意淫MSF.pdf powerful-sniffing-tool-ettercap-the-using-the-tutorial-i-deceive-rules.pdf sqlmap-gui-automatic-sql-injection-and-database-takeover-tool.pdf sqlmap-to-bypass-sql...

    Be_My_Girlfriend:搜寻女朋友

    我是技术宅,喜欢动漫,喜欢看电影,喜欢在知乎上装B,喜欢写诗,爱幻想(偶尔意淫)。 抖腿小王子,喜欢听纯音乐,不是修电脑的... 在某一瞬间我会变成疯子....比如看见莱纳斯,断网的时候,演讲的时候,发现错误的...

    浅谈php中include文件变量作用域

    比如我前段时间在写一个框架的时候,打算用原生的php作为模板,然后写一个display方法引入模板文件就可以,但是这只是我的意淫而已。 写完后发现在模板中所有的变量都提示未定义。通过各种研究和查找资料,总结了...

    移动端刮刮乐的实现方式(js+HTML5)

    比如电梯,路边的霓虹灯,遥控器,小孩子的玩具等,都统统被程序员“意淫”过。 有时候还会感觉程序员看世界会看的透彻一点…………. 想必大家都玩过刮刮乐,下面就介绍一种刮刮乐的移动端实现方式!用到canvas 1、...

    喂,快给我打一个小程序预览码

    需求 开发小程序的朋友们随时...于是就有了这个需求,要搞个东西让爸爸们自主打码,嗯,应该就是只有一个按钮,点一下就可以出现预览二维码的东西,意淫了一下应该是这样的:     没错!就这样干! 规划一下 干大事就

    yxr-study-in-XDU:记录在XDU的四年生活,目前第二年.

    现在社区有不少个人学习记录的仓库,所以这个仓库和他们的一样,届时文章或代码会通过链接方式贴出.PS:这个仓库会放上我认为自己做的不错的所有项目的链接.end:意淫一下理想的公司:(top不代表数量,排名分先后)TOP1:...

    网页制作程序作业

    有些人便摸准了这种观者的脾性,写一些、画一些、拍一些只代表自己意淫,甚至连意淫都没有的,或者是如支棋者的“哑谜”、反讽富家子之类的垃圾,因为他们深知,这些垃圾一定会被那些观者看出许多连自己都不知道的...

    杜蕾斯安全工具

    杜蕾斯安全工具源码,源码DurexKit,杜蕾斯工具包新鲜出炉,以后再也不用担心闪退了,当然,这纯属意淫。下面看疗效,没有try catch,图中的代码为神马木有crash?原理:使用Category,参数经过判断后才能执行方法,...

Global site tag (gtag.js) - Google Analytics