AirJD 焦点
AirJD

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

Go语⾔言在⼩小⽶米抢购系统中的应⽤用 by 韩祝鹏

发布者 arch
发布于 1450055640733  浏览 6401 关键词 Go, 并发 
分享到

第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



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