首页
在线工具
搜索
1
Kuboard与KubeSphere的区别:Kubernetes管理平台对比
2
ShardingSphere使用中的重点问题剖析
3
Flowable工作流引擎源码深度解析
4
用AI生成的原型设计稿效果还可以
5
如何将Virtualbox和VMware虚拟机相互转换
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
Search
标签搜索
Angular
Docker
Phabricator
SpringBoot
Java
Chrome
SpringSecurity
SpringCloud
DDD
Git
Mac
K8S
Kubernetes
ESLint
SSH
高并发
Eclipse
Javascript
Vim
Centos
Jonathan
累计撰写
86
篇文章
累计收到
0
条评论
首页
栏目
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
页面
搜索到
1
篇与
的结果
2016-05-18
大话程序猿眼里的高并发
大话程序猿眼里的高并发 简单理解高并发 高并发指的是在同一时间点,有很多用户同时访问某个URL地址。例如淘宝的双11、双12活动,贴吧的爆吧事件(恶意的高并发请求,即DDOS攻击)。简单来说,就像玩游戏中被ADC暴击了一样,伤害巨大。 高并发带来的后果 服务端:站点服务器/DB服务器资源被占满崩溃,数据存储和更新结果与理想设计不一致(如重复的数据记录,多次添加用户积分等)。 用户角度:页面卡顿,用户体验差,可能导致用户流失。 我的经历:在开发公司产品网站时,经常会有类似抽奖、签到、积分竞拍等功能需求。如果未考虑高并发下的数据处理,可能会导致数据异常,影响用户体验。 实例分析 并发下的数据处理 通过表设计(如记录表添加唯一约束)、使用事务防止并发下的数据错乱问题,以及通过服务端锁进程防止并发下的数据错乱问题。 例子1:签到功能 需求:一天一个用户只能签到一次,签到成功后用户获取一个积分。 已知表:用户表,包含积分字段。 设计: 添加一张签到记录表,并将用户唯一标识字段(ID, Token)和签到日期字段设为唯一约束或索引。 在代码逻辑中,先执行签到数据的添加,再进行积分的添加。 所有操作写在一个SQL事务里,确保数据一致性。 例子2:抽奖功能 需求:抽奖一次消耗一个积分,抽奖中奖后编辑剩余奖品总数。当剩余奖品总数为0或用户积分为0时无法进行抽奖。 已知表:用户表(包含积分字段),奖品表(包含奖品剩余数量字段)。 设计: 在事务中,通过WITH (UPDLOCK)锁住商品表,或更新表的奖品剩余数量和最后编辑时间字段来锁定数据行。 进行用户积分的消耗,完成后提交事务,失败则回滚。 例子3:缓存数据到Cache 需求:当缓存不存在时从数据库获取并保存到缓存中;每天10点必须更新一次,其他时间点缓存两小时更新一次。 问题:10点时有很多并发请求同时过来,导致大量SQL查询操作,增加服务器压力。 解决:C#通过lock机制,在从数据库读取到缓存的代码前加上锁,确保只有一个请求是从数据库获取数据,其他都从缓存中获取。 访问量大的数据统计接口 需求:用户行为数据统计接口,记录商品展示次数等。 问题:大量用户同时在线访问页面会导致大量请求,给服务器带来巨大压力。 解决:通过Node.js写一个数据处理接口,把统计数据先存到Redis的list里,然后再同步到MySQL数据库中。这样可以减少数据库压力,加快响应速度。 高并发下的服务器压力均衡 服务器代理Nginx:做服务器的负载均衡,分散压力到多台服务器。 集群部署:MySQL数据库、Redis服务器或MongoDB服务器,常用查询数据保存到NoSQL DB中,减少数据库压力。 数据缓存:使用Cache。 编程语言选择:使用具有高并发能力的语言(如Node.js)开发Web接口。 服务器部署:图片服务器分离,静态文件走CDN。 数据库优化:优化查询条件和索引。 消息队列:将数据添加到信息队列(如Redis list)中,再写工具入库。 脚本控制请求:防止用户重复点击导致多余的AJAX请求。 并发测试神器推荐 Apache JMeter Microsoft Web Application Stress Tool Visual Studio 性能负载 文章来源
2016年05月18日