第1页
Go语⾔言在⼩小⽶米抢购系统中的应⽤用
——⽆无⽤用之⽤用,兼谈⼀一些⼩小众编程语⾔言
主讲:韩祝鹏 (hanzhupeng@gmail.com)
第2页
开场与⾃自我介绍
• 韩祝鹏 (albertlee) • ⼩小⽶米⺴⽹网 (2010年7⽉月 — 今) • ⼩小众编程语⾔言业余爱好者
第3页
内容提纲
• ⼩小⽶米⺴⽹网⼤大型秒杀系统设计 • Go语⾔言在⼤大秒系统中的使⽤用与优化 • ⾼高并发系统设计的思路 • 介绍⼏几个⼩小众的编程语⾔言 • Just for fun
第4页
抢购应⽤用的场景
• 开发时间限制 • 突发海量并发请求 • 数据准确性要求:不能超卖、购买数量限制 • 对失败的容忍基本为零
第5页
瞬时⾼高并发
第7页
抢购系统历史
• 基于PHP+Mysql同步请求的系统 • 基于PHP和⽇日志异步处理的系统 • 基于Go的⼤大秒系统
第8页
基于PHP+Mysql
• 数据⼀一致性好 • 难于扩展,在突发⼤大流量下,会很惨烈 • 只在2011年第⼀一次预约时⽤用过⼀一次
第9页
基于PHP+⽂文件锁的系统
• PHP层通过⽂文件锁判断结果,写⽇日志,返回结果 • ⽇日志异步集中处理 • 集中记数,操作缺货开关 • 抢到资格的⽤用户列表通过消息队列传⼊入商城系统 • 数量控制不精确,放弃部分数据⼀一致性,获取性能
第10页
基于PHP+⽂文件锁的系统
⼀一周内能快速搞定!
第11页
基于PHP+⽂文件锁的系统
第12页
基于Go语⾔言的⼤大秒系统
• 重写! • 业务逻辑越来越复杂,急需管理 • 对更精细控制能⼒力的需求
第13页
为什么选择Go?
• 语⾔言偏好 • 语法标准,相对简单 • 编译型,强类型,GC
• Goroutine 并发能⼒力 • 编译成可执⾏行⽂文件,部署简单 • 系统的消息通道结构与Go语⾔言⻛风格内在相似性
第14页
为什么选择Go?
• ⾮非技术因素 • 应⽤用核⼼心逻辑较为固定,不需要频繁改动 • 在正式项⺫⽬目开始前半年,已经做过尝试
• 开发⼈人员上⼿手容易 • ⽼老同事许式伟的推⼲⼴广与榜样作⽤用
第15页
why not X?
• Erlang: 学习成本⼤大,不确定性⼤大。抱持开放态度 • PHP:我希望有⼀一个简单的基于内存的数据管理 • C/C++:没信⼼心快速搞定 • Python:对性能有所担忧,开发快速的收益⻓长期看难
以抵消服务器成本
第17页
⼤大秒系统的设计
• Go语⾔言开发前端HTTP层及middle层 • http层与middle层之间通过Redis做消息队列 • http层⽤用于维持⼤大量连接,保护middle层 • http层通过维护⼤大量⻓长连接,减少带宽使⽤用 • middle层处理放⾏行逻辑判断
第18页
⼤大秒系统的设计
• ⽤用户的请求随机发送到HTTP服务器上 • 通过消息队列将⽤用户请求汇聚到同⼀一台middle服务器 • 系统的消息通道结构与Go语⾔言⻛风格内在相似性 • 系统结构的设计与语⾔言⻛风格的相互影响
第19页
针对Go语⾔言的性能优化
• 使⽤用 Go 1.3 ,提升GC性能 • 使⽤用 Go 1.2 定制HTTP包
• 增加写缓存和读缓存的通道⻓长度 • 创建连接时,减少读写缓存的⻓长度 • 尽量减少heap上的短⽣生命周期对象(避免频繁申请内 存,引起GC问题) • 实际效果:单机最⼤大连接数增⻓长了⼀一倍
第21页
增加写缓存和读缓存的通道⻓长度
• 使⽤用chan作为资源池 修改后:
修改前:
第22页
bufioWriter由默认4k减少为32字节
• 减少内存使⽤用
• 减少写buffer操作
第23页
bufioReader 由默认4k减少为1k
第24页
• 连接结束时,将buf放回资源池 • ⽆无法将资源放回资源池时,显式设置为nil • 优化GC (具体效果待考)
第25页
改⼩小buf,减少写buf的操作
bufio.go
第26页
对突发⼤大流量系统设计 的思考
• 独⽴立⼩小系统 • 分层
• 多⽤用内存,少⽤用IO,数据的局部性 • ⼩小⼼心防⽌止雪崩效应 • 对队列的⻓长度、⽣生产消费速度要格外⼩小⼼心 • 对数据⼀一致性的考虑:是否需要严格、实时
第27页
编程要从 娃娃抓起
图图,你都三天了, Hello World都还不会写,
不能输在起跑线上啊。
第28页
⼏几个有意思的⼩小众语⾔言
• LOGO • Smalltalk Squeak • Scratch • LISP,Prolog • Haskell • Forth
第29页
我对语⾔言的偏好
• 基本语法⾜足够简单,正交性 • 语⾔言可扩展 • 明确的价值观 • 如果能有交互式的环境就更好了
第30页
LOGO
• 最开始就是设计成LISP的⽅方⾔言 • 不只是学习编程,更是学习如何学习
第31页
LOGO
第32页
Smalltalk
• 语⾔言设计的简单性与可扩展性 • IDE的始祖 • Squeak , Etoys , Pharo • 开发环境与运⾏行环境⼀一体 • 开发过程就是在⼀一个不停⽣生⻓长的过程
第36页
EToys
第37页
Scratch
• 图形化的创作⼯工具 • 互联⺴⽹网时代的LOGO • 在线协作社区 http://scratch.mit.edu (被墙了) • 把世界上最有创造⼒力的孩⼦子们(除了墙内的孩⼦子们)
连接在⼀一起,给他们⼀一个强⼤大的⼯工具,你想象不到他 们会创造出什么!
第38页
Scratch
第39页
Scratch
第40页
Scratch
第41页
这只是⼩小孩的玩意么?
• 运⾏行环境、实时调试、热部署 • LOGO与函数式编程 • 互联⺴⽹网协作创新的试验场 • 从 LOGO - Smalltalk - OLPC - Squeak - Scratch,
我们旁观了⼀一代代⼈人不断向着同⼀一个⽅方向前进
第42页
⼩小众语⾔言的⽆无⽤用之⽤用
• 思想观念的进化与结合 • 避免变成只有⼀一把锤⼦子的⼈人 • 快速变化,享受技术进步的红利
第43页
创业公司?
• 客户端其实没什么选择余地:ObjC, Java, HTML+JS • 服务端:个⼈人熟悉Python + Go的组合 • 特定领域:R, Haskell, Prolog, Scala…… • 程序员开⼼心才是最⼤大的⽣生产⼒力
第44页
爱好者?
• LISP, Scheme, Prolog, Smalltalk, Forth, Haskell • LOGO, Squeak, Etoys, Scratch, LEGO • 都很好玩,每种语⾔言都是⼀一种⻛风味不同的⾷食材 • 都是⽆无⽤用的,好玩本⾝身就是最⼤大的回报
第45页
The best way to predict the future is to invent it.
—— Alan Kay