AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

秒杀场景的SQL解决方案 by 楼方鑫

发布者 sqler
发布于 1452129104656  浏览 7210 关键词 数据库, Java 
分享到

第1页

秒杀场景的SQL解决

杭州平民软件有限公司



www.dnt.com.cn 



版本号V2013.1 



第2页

www.dnt.com.cn 



第3页

www.dnt.com.cn 



第4页

问题 • 搞定库存秒杀问题需要什么技术?

– NoSQL? – SQL? – Why?

www.dnt.com.cn 



第5页

章节

• 库存业务? • 库存技术? • 库存方案? • 技术难点? • 方案优化?

www.dnt.com.cn 



第6页

库存业务

用户



商家



库存



网站



系统

www.dnt.com.cn 



第7页

库存全景

www.dnt.com.cn 



第8页

多种库存



前端
  库存



后端
  库存



实际
  库存



www.dnt.com.cn 



第9页

用户体验

• 实际有库存,显示零库存 • 显示有库存,实际零库存 • 已经下订单,得知零库存 • 已经付完款,得知零库存 • 付款遇问题,得知零库存

www.dnt.com.cn 



第10页

商家体验

• 实际有库存,显示零库存 • 显示有库存,实际零库存 • 库存数不对,常常做盘点 • 卖出太多货,加班来不及 • 下单数很高,付款数很低 • 特惠有限度,不能无止境

www.dnt.com.cn 



第11页

平台体验

• 实际有库存,显示零库存 • 显示有库存,实际零库存 • 库存数不对,常常做盘点 • 卖出太多货,加班来不及 • 下单数很高,付款数很低 • 流量转化率,下单与成交

www.dnt.com.cn 



第12页

系统成本 • 处理不够快,拖跨整个站 • 数据不准确,加班又通宵 • 废单特别多,浪费又可耻 • 一两件商品,坏了一锅粥

www.dnt.com.cn 



第13页

库存快准 • 库存处理快,网站不能跨 • 库存处理准,大家都开心 • 库存机制好,商品买卖爽

www.dnt.com.cn 



第14页

契约精神

甲方
  用户
 



乙方
  商家
 



库存
  契约
 



中介
  网站
 



合同
  系统
 

www.dnt.com.cn 



第15页

库存操作



商家



调整 对账



库存



售出 退货



用户



www.dnt.com.cn 



第16页

库存逻辑



拍下 扣减 付款



拍下 预扣 付款 扣减



www.dnt.com.cn 



第17页

库存技术 • 余额减一 • 操作明细 • 完整事务 • 数据落地

www.dnt.com.cn 



第18页

余额减一

• 使用pthread_mutex_t • 使用pthread_spinlock_t • 使用CAS指令

– __sync_fetch_and_add – __sync_fetch_and_sub – __sync_add_and_fetch – __sync_sub_and_fetch

www.dnt.com.cn 



第19页

操作明细 • 下过的单有没有减? • 付款的单有没有减? • 预扣的单有没有加? • 退货的单有没有加?

www.dnt.com.cn 



第20页

完整事务 • 扣了库存没有记明细? • 记了明细没有扣库存?

www.dnt.com.cn 



第21页

数据落地 • 内存不可靠,丢了怎么办 • 搞错一辆车,可能赔得起 • 搞错一套房,还能赔得起

www.dnt.com.cn 



第22页

库存方案

• MySQL • MySQL + Read Cache • MySQL + Read/Write Cache • MySQL + NoSQL + Cache • NoSQL + Cache • OneSQL + Read Cache

www.dnt.com.cn 



第23页

MySQL • 最开始的模式 • 最省心的模式 • 规模小的模式

www.dnt.com.cn 



第24页

MySQL + Read Cache • 顺然自然发展 • 比较省心模式

– 读Delay影响用户体验

• 规模中等模式

www.dnt.com.cn 



第25页

MySQL + Read/Write Cache

• 顺然自然发展 • 极度操心模式

– 读Delay影响用户体验 – 写操作丢失引起超卖 – 写操作丢失引起少卖 – 写节点漂移引起乱卖

• 规模大型模式

www.dnt.com.cn 



第26页

Write Cache(全量)



App1



App2



Cache
  (item1)



Cache
  (item2)



Cache
  (item3)



MySQL

www.dnt.com.cn 



第27页

Write Cache(问题)



App1



App2



Cache
  (item1,
  item2)



Cache
  (item2,
  item3)



Cache
  (item3,
  item1)



MySQL



www.dnt.com.cn 



第28页

Write Cache(增量)



App1



App2



Cache
  (item1,
  item2)



Cache
  (item2,
  item3)



Cache
  (item3,
  item1)



MySQL



www.dnt.com.cn 



第29页

Write Cache(问题)

• 设置麻烦

– 增量与销量相关 – 按商品逐人设置

• 秒杀商品

– 不能多卖,赶工无好货 – 不能少卖,成就唯品会

www.dnt.com.cn 



第30页

MySQL + NoSQL + Cache

• 方案复杂

– 数据复制需求过多

• 投入巨大

– 硬件资源投入巨大

• 不解决问题

– 只解决性能 – 未解决准确性

www.dnt.com.cn 



第31页

MySQL + NoSQL + Cache(全量)



App1



App2



NoSQL
  (item1,
  item2)



NoSQL
  (item2,
  item3)



NoSQL
  (item3,
  item1)



MySQL



www.dnt.com.cn 



第32页

MySQL + NoSQL + Cache(增量)

• 设置麻烦

– 增量与销量相关 – 按商品逐人设置

• 秒杀商品

– 不能多卖,赶工无好货 – 不能少卖,成就唯品会

www.dnt.com.cn 



第33页

NoSQL + Cache

• 未敢正式偿试

– 缺少事务支持

• NoSQL技术不适

– 准确性需事务支持 – 简单读的成本过高

www.dnt.com.cn 



第34页

MySQL问题定位



• MySQL优势

– 事务机制 – 程序稳定

• 事务优化

– 单行更新

• 并发优化

– 最大并发数

• 排队优化

– 抢同一商品



www.dnt.com.cn 



第35页

OneSQL + Read Cache

• 关键技术突破 • 非常省心模式

– 读Delay影响用户体验 – 缓存实时更新技术突破

• 大型模场景验证

www.dnt.com.cn 



第36页

技术难点 • 事务机制 • 单行并发 • 排队机制

www.dnt.com.cn 



第37页

事务机制

• 数据准确更重要

– 库存数据是可以盘点 – 多级库存对账成本高

• 事务机制最成熟

– 应用层无成熟事务机制 – 数据层数十年事务机制

www.dnt.com.cn 



第38页

单行并发

• 热点商品

– 资源有限,精确计数 – 关注度高,并发很高

• 瞬间压力

– 前一分钟,千万用户 – 容易堵塞,拖跨网站

• SLA可计算

– 每秒要求500个?

www.dnt.com.cn 



第39页

OneSQL 并发能力

www.dnt.com.cn 



第40页

处理逻辑 • Start transaction • Insert库存明细 • Update库存余额 • Commit

www.dnt.com.cn 



第41页

过独木桥

n 1库存
  (数据库) www.dnt.com.cn 



第42页

网络确认

• Commit后才放行 • 技术测试

– 本机Socket连接(CPU速度) – Auto Commit(CPU速度) – 0.2 ms网络 – 0.4 ms网络 – 2.0 ms网络

• 时延很关键

– 同城机房间时延? – Update后JVM GC?

www.dnt.com.cn 



第43页

网络优化

• 如何判断Update成功? • 两个条件:

– Update自身没报错 – 确认Update记录数

• 客户端:

– 确认Update记录数 – 通知服务器提交 • 优化思路 – 提前告知Update记录数?

www.dnt.com.cn 



第44页

开源定制

• 优化方案

– Start transaction – Insert 明细 – Update /*+ [auto_commit affect_rows 1] *

/… – Commit可以省略

• 效果评测

– 保留事务 – NoSQL性能

www.dnt.com.cn 



第45页

扩展定制

• 一致性查询

– Start transaction – Select /*+ [auto_rollback] */ … for

update

• 效果评测

– 保留事务 – NoSQL性能

www.dnt.com.cn 



第46页

JVM问题

• Start transaction • Insert库存明细 • Update库存余额 • JVM gc回收内存(100ms) • Commit

www.dnt.com.cn 



第47页

测试用例

• 建表语句

– Create table t_item (col1 int not null primary key, col2 int);

– Insert into t_item values (1, 100000000);

• 测试用例

– Start transaction – Update /*+ [auto_commit] */ t_item set

col2=col2-1 where col1 = 1; – Commit;

• 秒杀、大账号、额度

www.dnt.com.cn 



第48页

定制优势

• 治标治本

– 数据层治本 – 应用层治标

• 简洁方案

– 调整SQL顺序 – 扩展SQL语法

• NoSQL vs SQL?

– SQL青春常驻

www.dnt.com.cn 



第49页

排队机制

• 应用层

– 如何阻太多会话进入MySQL?

• MySQL Server层

– 如何阻太多请求进入InnoDB?

• MySQL InnoDB层

– 锁冲突检测成本非常高!

www.dnt.com.cn 



第50页

应用排队机制



App Item?



App Item?



Q1 Q2 Q3 Q4 Q5



Q1 Q2 Q3 Q4 Q5



MySQL

www.dnt.com.cn 



第51页

应用排队缺点 • 应用需要改造

– 统一开发框架

• 应用集群扩容

– 控制不够精确

www.dnt.com.cn 



第52页

MySQL排队机制

App App App Item?

Q1 Q2 Q3 Q4 Q5 InnoDB

www.dnt.com.cn 



第53页

MySQL排队优势

• 应用极少改造

– 无需统一开发框架 – 修改少量SQL语句

• 排队非常精确

– 发挥InnoDB最佳性能

www.dnt.com.cn 



第54页

方案优化 • 拆分有固定规则 • 热点商品无定律 • 热点需动态迁移

www.dnt.com.cn 



第55页

复制测试



1条

库存
  余额



MySQL
  Server1



几毫秒 ~
 几秒



MySQL
  Server2



库存
  明细

1百条/1千条/1万条/10万条/100万条



www.dnt.com.cn 



第56页

热点库存



应用

热点
  配置



热点库存路由 常规库存路由



MySQL
  MySQL
  MySQL
  MySQL
  MySQL
  MySQL
 



Move



Normal



www.dnt.com.cn 



MySQL
  MySQL
  Hot
 Spare



第57页

Q
 &
 A

OneSQL
 +
 OneProxy
 =
 Data
 Arch
 on
 Cloud



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。