专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
芋道源码  ·  确保数据安全!使用Spring Boot ... ·  昨天  
芋道源码  ·  为什么王者荣耀不使用微服务架构? ·  昨天  
芋道源码  ·  一直傻傻分不清 count(*) ... ·  2 天前  
芋道源码  ·  Web 实时消息推送的 7 种实现方案 ·  2 天前  
51好读  ›  专栏  ›  ImportNew

大话程序猿眼里的高并发(上)

ImportNew  · 公众号  · Java  · 2016-12-11 20:47

正文

(点击 上方公众号 ,可快速关注)


来源:thankbabe

链接:blog.thankbabe.com/2016/04/01/high-concurrency/


高并发是指在同一个时间点,有很多用户同时的访问URL地址,比如:淘宝的双11,双12,就会产生高并发,如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击,再屌丝点的说法就像玩撸啊撸被ADC暴击了一样,那伤害你懂得(如果你看懂了,这个说法说明是正在奔向人生巅峰的屌丝。


高并发会来带的后果


  • 服务端:

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


  • 用户角度:

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


  • 我的经历:

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


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


并发下的数据处理


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


通过服务端锁进程防止包并发下的数据错乱问题


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


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


  • 需求点

【签到功能】 一天一个用户只能签到一次,

签到成功后用户获取到一个积分


  • 已知表

用户表,包含积分字段

高并发意淫分析(属于开发前的猜测):

在高并发的情况下,会导致,一个用户签到记录会有多条,或者用户签到后不止加一积分。


  • 我的设计

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


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


  • 需求点:

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


  • 已知表:

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

高并发意淫分析(属于开发前的猜测):

在高并发的情况下,会导致用户参与抽奖的时候积分被扣除,而奖品实际上已经被抽完了


  • 我的设计:







请到「今天看啥」查看全文