`
loveqinghe
  • 浏览: 14873 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

我看小米抢购——纯技术分析贴

 
阅读更多
这几天分析小米抢购机制的帖子网文很多。我也来浅析一下,小米具体的没看,但原理相通。
鄙人曾在某知名网站做技术。做了一个很复杂的抢票系统,至今在用。
需求是这样的,网站会跟商业公司合作做一些推广,送出一些演出门票,数码产品什么的让网友来抢。
第一次上线抢票,只放了一张门票,送个数码相机,再送飞机票。数据库里只放一条记录,第一个网友进来了就立即删除。其他网友全部提示“没抢到”,但也让网友留信息。第一次成功了。 客户很满意,尤其看到了很多热心网友留的信息。
第二次放20张门票,还沿用第一次的系统设计,放20条记录,在网友抢走了几张票后,后台数据混乱了,票超发了(放出去了不到30张),客户也认了。(这种故障12年的淘宝双十一也出现过) 。
后来分析,不能在一开始就让所有请求都操作数据库,直接连库MySQL扛不住,主从就超发,加缓存超发估计会更严重。
解决办法:
1.让用户分流,让部分用户直接返回“没抢到”,不请求数据库 。
2.如果还不行就,错开峰值 ,高峰期全部用户都不请求数据库,全部返回“没抢到”。
分流我们的办法比小米高明,网友猜测不到,每一个请求分配一个随机数,跟编辑设置的“阀值”比较,比阀值大就请求数据库,再判断奖品还有没有。小米傻到直接在页面上上空链接。大傻。
错开峰值,就是抢票刚开始时,其实库里奖品数量是0,全部返回“没抢到”,过了高峰期再放出来抢。(小米这次20分钟抢完,估计也是这样的)
分布部署,我们直接用于前端响应的server大概有20台,直接挂在F5上的,修改配置,让其中的n台程序就不访问数据库,直接返回“没抢到”。

现状:编辑可以自由的控制奖池中奖品的数量,设置“阀值”大小改变抢中的概率,分不同时段放票,来维持活动的热度。
====================================================================================
我的另两篇文章,大型网站设计及大型网站动态应用。
http://loveqinghe.iteye.com/blog/1969733
http://loveqinghe.iteye.com/blog/1969777
20
9
分享到:
评论
44 楼 windshome 2013-10-26  
没有人自居是高尚的程序员,我们只是不那么卑鄙而已。


说到方案,让老板拿钱换更好的服务器和数据库。非常简单。没钱?没钱出来混个啥,回家抱孩子吧!!

赚了钱胡吃海喝,在正经事上总是抠门省钱,这种老板,大不了我不跟他混。
43 楼 javatozhang 2013-10-26  
高尚的程序员们还真不少,希望拿出高尚的解决方法,愿闻其详洗耳恭听!
42 楼 ququjioulai 2013-10-25  
我到觉得是这样的,比如虽然是卖10W台,实际后台有个队列只有5000个位置,最先进去的5000人最容易抢到,然后当前面进去的用户做某一个步骤就退出了一个位置,然后所有人就都去抢空出来的那个位置。
41 楼 zhenjw 2013-10-25  
只能说太无耻了,我还能说什么呢,给做程序的人丢人啊,如果需求是这样那没有办法,但是如果需求是我们大家理解的需求,要这样做只能说你太牛X了,我听过一个清华的人经常说用工程化的方法,就跟你的做法差不多,让人很无语,你们是师兄弟吗?
40 楼 tianyaluke 2013-10-25  
hardPass 写道
技术水平低,不是你的错。
但是“抢票”不是基于“先到先得”的原则,程序员的节操碎了一地。


22楼正解,玩技术哪是这样玩的
39 楼 liujia229 2013-10-25  
不想着怎么克服问题。再说另辟蹊径也不是这么玩的。对自己的东西一点要求都没有
38 楼 canon99 2013-10-25  
知道了太多了,所以拼命刷新页面的,希望刷新到与系统阀值相同的值
37 楼 donlianli 2013-10-25  
你说的这种方案,很想12306的做法啊
36 楼 zera 2013-10-25  
职业素养!!!
35 楼 Jack_ljk 2013-10-25  
我只能说,你让小伙伴们知道的太多了
34 楼 xiangjie88 2013-10-25  
各种坏味道,没有好的解决方案,就靠投机取巧,程序员的悲哀
33 楼 sj853 2013-10-25  
“抢” 和 “抽” 有本质的区别  一个是先到就先得   一个是随机      这样只能是 抽 不是抢
32 楼 humtiger 2013-10-25  
wzarx 写道
windshome 写道
原来是在骗客户啊!我向来不喜欢这么做,做IT的,不能为了别的东西,泯灭自己的良知啊!抢买手机倒也罢了,但是如果你是为了一个非常需要的事情,在医院网站预约挂号,总挂不上,后来得知医院的后台是这么处理的,导致没有挂上号耽误了病情,你不愤怒吗??

为了生存,为了利益,去选择做事情的方法,都没有争议和非议,唯一需要说的是,做任何事情,搞IT、扫大街都需要良知。

其实提高系统高并发下运行的方法有很多种。完全没有必要这么做。又要多多赚钱,又死死的压低投入。

我觉得楼主的办法,从概率的角度每个人获奖的概率根本没有任何影响,也没什么不好吧

排队买车票和排队买彩票怎么能一样呢
31 楼 windshome 2013-10-25  
昨天北京地铁10号线故障,让我想起“良知”这个概念,如果楼主这种方式去做,一定是“撞死人拉倒”,“撞车”。

我是做信息安全的,深感“做安全要靠良知”,或者说“职业素养”,因为自己一个图省事,带来的代价不定有多大,不可有一丝的轻忽大意。偶尔会有bug,有漏洞,但是如果发现了会及时修正,更不会自己作假欺骗别人。

至于欺骗了别人还拿出来炫耀,我认为是一种可耻的事情。
30 楼 beidou566 2013-10-25  
提高并发有很多办法

结论:
1、无良程序员
2、无实力的公司

坚决抵制
29 楼 vcok 2013-10-24  
把请求先放入队列排好队后再依次访问数据库不好吗?
28 楼 dopic 2013-10-24  
你不这不是在设计抽奖系统吗,忽悠客户还行
27 楼 hacker47 2013-10-24  
看了你的分析,哥笑了!我相信小米的程序员技术应该也很牛B
26 楼 windshome 2013-10-24  
一些无良厂商和运营商这么做了我也没有办法,也惹不起,但是我能够做的是,尽量不这么做。
25 楼 gxz1989611 2013-10-24  
hardPass 写道
技术水平低,不是你的错。
但是“抢票”不是基于“先到先得”的原则,程序员的节操碎了一地。


同意,抢票还是要基于先到先得,如果12306要是用你这种“投机取巧”的策略来放票,那全国人民都不会答应的啊。
个人认为可以在使用一些内存级别的缓存来代替mysql,类似redis、memcached都是一种尝试。

相关推荐

Global site tag (gtag.js) - Google Analytics