腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
搜索
搜索
关闭
发布
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
idba
专栏成员
举报
334
文章
565589
阅读量
48
订阅数
订阅专栏
申请加入专栏
全部文章(334)
数据库(147)
sql(121)
云数据库 SQL Server(117)
其他(46)
编程算法(33)
https(33)
网络安全(31)
python(27)
存储(24)
云数据库 Redis(19)
linux(18)
运维(18)
分布式(12)
缓存(11)
mysql(10)
数据(10)
html(9)
腾讯云测试服务(9)
node.js(7)
tcp/ip(7)
go(6)
unix(6)
http(6)
数据迁移(6)
微服务(6)
redis(6)
git(5)
容器(5)
自动化(5)
shell(5)
安全(5)
负载均衡(4)
jquery(4)
postgresql(4)
ide(4)
github(4)
文件存储(4)
人工智能(4)
网站(4)
rpc(4)
数据处理(4)
测试(4)
系统(4)
性能(4)
优化(4)
java(3)
json(3)
oracle(3)
打包(3)
负载均衡缓存(3)
容器镜像服务(3)
访问管理(3)
TDSQL MySQL 版(3)
压力测试(3)
socket编程(3)
大数据(3)
数据分析(3)
es(3)
dba(3)
磁盘(3)
服务(3)
工具(3)
内存(3)
配置(3)
线程(3)
ios(2)
c++(2)
php(2)
javascript(2)
ruby(2)
bash(2)
api(2)
centos(2)
apache(2)
云推荐引擎(2)
日志数据(2)
express(2)
kubernetes(2)
开源(2)
yum(2)
dubbo(2)
微信(2)
windows(2)
架构设计(2)
hbase(2)
迁移(2)
raft(2)
Elasticsearch Service(2)
io(2)
备份(2)
编译(2)
并发(2)
产品(2)
程序(2)
管理(2)
函数(2)
集合(2)
集群(2)
连接(2)
模型(2)
实践(2)
事务(2)
索引(2)
统计(2)
异常(2)
lua(1)
react(1)
nosql(1)
access(1)
mvc(1)
django(1)
ruby on rails(1)
jar(1)
bash 指令(1)
神经网络(1)
深度学习(1)
日志服务(1)
云直播(1)
数据工坊(1)
mongodb(1)
DevOps 解决方案(1)
电商(1)
云数据库 MySQL(1)
serverless(1)
爬虫(1)
ssh(1)
hive(1)
sql server(1)
面向对象编程(1)
jdbc(1)
zookeeper(1)
udp(1)
zabbix(1)
机器人(1)
数据可视化(1)
物联网(1)
系统架构(1)
腾讯云开发者社区(1)
processing(1)
云计算(1)
kafka(1)
任务调度(1)
unicode(1)
utf8(1)
sdk(1)
性能测试(1)
腾讯云(1)
analysis(1)
buffer(1)
byte(1)
chat(1)
clone(1)
copy(1)
cpu(1)
db(1)
ddl(1)
fifo(1)
free(1)
handler(1)
hash(1)
innodb(1)
interrupt(1)
it(1)
load(1)
lookup(1)
migrate(1)
nsq(1)
ode(1)
partition(1)
pdf(1)
performance(1)
plugin(1)
prefix(1)
push(1)
row(1)
schema(1)
screen(1)
session(1)
size(1)
split(1)
sys(1)
table(1)
terraform(1)
tmux(1)
window(1)
zk(1)
笔记(1)
变量(1)
编译器(1)
部署(1)
测试工具(1)
插件(1)
读书笔记(1)
多线程(1)
服务器(1)
工作(1)
监控(1)
监控工具(1)
兼容性(1)
进程(1)
内核(1)
权限(1)
软件(1)
设计(1)
事件(1)
数据库设计(1)
数据类型(1)
数据同步(1)
数学(1)
算法(1)
网络(1)
文件系统(1)
效率(1)
硬件(1)
源码(1)
字符串(1)
数据库安全(1)
搜索文章
搜索
搜索
关闭
如何解决热点数据更新问题
机器人
数据库
云数据库 SQL Server
一 背景 某个业务线商品开放用户申请免费试用,当某个商品特别吸引人时,比如iPhone6 。肯定有一大波人为了少卖一个肾而疯狂去抢申请资格。更有甚者利用机器人申请注册,于是简单的申请操作变成了秒杀行为。大量请求同时更新数据库中的同一个商品的申请次数,update 操作给表加上行锁,导致后面的请求全部排队等待前面一个update完成,释放行锁后才能处理下一个请求。大量后来请求等待,占用了数据库的连接。一旦数据库连接数被占满,就会导致后来的全部请求因拿不到连接而超时,业务请求出现无法及时处理的情况,数据库系统的RT会异常飙高,业务层由于等待出现超时,app 层的连接耗尽,一系列的雪崩效应! 二 解决方案 从上面的背景分析,解决热点数据并发更新需要注意核心问题: 减少直接对db层数据热点的并发更新,或者提供MySQL 更新同一行的吞吐量。本文从业务和数据库的设计层面来规划.同时也希望大家提更好的解决思路。 1 前端层面 前端是整个流量的入口, 正常业务访问时系统表现平稳,但是当有人恶意请求时,需要加上流控措施,比如常见的 a 需要用户回答问题,填写验证码,移动图像等等,防止或者减少有机器人来恶意请求。 b 页面上采用防止机器人的判断 两秒以内的成功请求一律拒绝。 c 通过设置nginx ,对同一个ip源的请求次数做限制,防止机器人来申请。 优点 有效减少或者防止有人利用机器人恶意请求 缺点 存在一定的误杀率,错杀了正常的请求。 2 应用层 应用程序接收前端前端请求,进行一系列的数据库操作,在我们规避了恶意请求之后如果还是有大量的数据库写访问请求,我们需要 a 对业务做降级 限制接口的调用次数,降低对数据库的请求压力。选择异步更新请求次数,弱化该商品申请次数的展现。类似于阅读次数,申请次数 ,与金额,库存无关的功能点。 b 通过异步更新来避免直接写数据库 。 应用使用分布式缓存(比如Tair/Redis)来存储某项商品的申请次数或者某人的申请次数,以商品id/user_id 或者将where 条件作为key,申请试用人数为value/符合某项具体条件的 count结果为value, 有用户申请成功则更新申请试用人数。不需要查询和实时写数据库,每隔一定时间/次数将结果写入数据库。 优点:该方法依赖于缓存,读写速度快,不需要实时更新数据库,减轻数据库并发写的压力; 缺点:缓存不是100%稳定,很容易丢,即使采用持久化的缓存,在高并发下有时也可能会出现异常,穿透缓存到db ,导致前端业务展现问题。 3 数据库层 a 将热点数据拆分,分在不同的库不同的表中,分散热点数据,减轻数据库并发更新热点带来的RT升高和应用连接等待时能保证业务能够正常访问其他商品表,损失局部可用性。 优点:实时读写数据库,前端展示数据的准确性。 缺点:业务逻辑稍显复杂。 b 限流补丁 针对某些特定的sql语句 从MySQL 层面加以限制,当系统thread_running达到一定值或者某个sql执行时间超过一定阈值则拒绝该sql的执行。(阿里内部已经实现限流版本)
用户1278550
2018-08-08
2.4K
0
没有更多了
社区活动
【纪录片】中国数据库前世今生
穿越半个世纪,探寻中国数据库50年的发展历程
立即查看
Python精品学习库
代码在线跑,知识轻松学
立即查看
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
立即体验
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
立即查看
领券
问题归档
专栏文章
快讯文章归档
关键词归档
开发者手册归档
开发者手册 Section 归档