需要做个支持两万并发的抢购程序,只有一台服务器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zaishanfeng
V2EX    问与答

需要做个支持两万并发的抢购程序,只有一台服务器

  •  
  •   zaishanfeng 2014-11-13 07:35:28 +08:00 via Android 14457 次点击
    这是一个创建于 4034 天前的主题,其中的信息可能已经有所发展或是发生改变。
    瞬间并发量能达到两万,服务器四核8g,备选语言php python,求方案
    62 条回复    2014-11-13 16:08:35 +08:00
    wzxjohn
        1
    wzxjohn  
       2014-11-13 07:36:26 +08:00 via iPhone
    黄牛你好。
    zaishanfeng
        2
    zaishanfeng  
    OP
       2014-11-13 07:37:42 +08:00 via Android
    @wzxjohn 怎么是黄牛?
    msg7086
        3
    msg7086  
       2014-11-13 07:52:39 +08:00
    并发两万是什么概念?

    瞬时连接数到两万的话,建议考虑基于event模型的架构,比如openresty。

    PHP的瞬时连接数能到500就不错了。
    abelyao
        4
    abelyao  
       2014-11-13 07:53:05 +08:00 via Android
    @wzxjohn 以为你要去抢别人
    zaishanfeng
        5
    zaishanfeng  
    OP
       2014-11-13 07:54:32 +08:00 via Android
    @msg7086 客户需求是这样的 要求达到瞬间两万 现在考虑用hhvm 候选golang
    zjxubinbin
        6
    zjxubinbin  
       2014-11-13 07:56:03 +08:00 via Android
    Gunicorn+gevent
    coldwinds
        7
    coldwinds  
       2014-11-13 07:58:24 +08:00
    swoole
    msg7086
        8
    msg7086  
       2014-11-13 07:58:52 +08:00
    @zaishanfeng hhvm跟不上的吧。
    顺便一提,都瞬间并发2万的,最起码得来个几十万的资金支持吧。
    瞬间2万,每个请求假定是100ms,那就是每秒20万请求,每天至少能跑170亿请求。
    京东这级别的都不知道平时有没有并发2万。
    RemRain
        9
    RemRain  
       2014-11-13 07:59:56 +08:00 via iPhone
    PHP 是进程或者线程模型,一个线程同时只能处理一个请求,并发两万个线程能要了 server 的命。除非用 PHP 裸写 socket,用 pool 或者 epoll 模型才有一点希望
    goofansu
        10
    goofansu  
       2014-11-13 08:00:56 +08:00 via iPhone
    数据库才是瓶颈
    zaishanfeng
        11
    zaishanfeng  
    OP
       2014-11-13 08:02:36 +08:00 via Android
    @msg7086 这个是临时需求 他们不愿意花钱买服务器
    zaishanfeng
        12
    zaishanfeng  
    OP
       2014-11-13 08:03:11 +08:00 via Android
    @goofansu 这个级别server也是瓶颈
    zaishanfeng
        13
    zaishanfeng  
    OP
       2014-11-13 08:04:24 +08:00 via Android
    也许nginx + lua可以扛得住?
    zaishanfeng
        14
    zaishanfeng  
    OP
       2014-11-13 08:07:24 +08:00 via Android
    据我估计他们真实并发能有五六千就不错了,可是客户很强硬,搞死我了,哎
    abelyao
        15
    abelyao  
       2014-11-13 08:07:37 +08:00 via Android
    @zaishanfeng 了解一下实际可能的访问量,有时候客户尽会瞎扯,浪费了许多时间去滥开发
    changsha
        16
    changsha  
       2014-11-13 08:09:13 +08:00 via iPhone
    都在bb 能不能给点实际的?
    zaishanfeng
        17
    zaishanfeng  
    OP
       2014-11-13 08:09:59 +08:00 via Android
    @abelyao 他们前期推广做的比较好,到时候抢购的人应该会比较多
    msg7086
        18
    msg7086  
       2014-11-13 08:11:36 +08:00
    @zaishanfeng 加钱嘛?

    nginx+lua的速度还是不错的,基本都异步而且开发应该也不算太麻烦。

    特别是如果请求和返回值不要求严格一致的话,还可以扔进redis队列里慢慢处理。

    之前写了个简单的bt tracker,每秒250请求在一台i3上基本看不出CPU占用。
    serco
        19
    serco  
       2014-11-13 08:13:17 +08:00 via iPad
    @zaishanfeng 必须event IO模型才可能,语言限定的话
    abelyao
        20
    abelyao  
       2014-11-13 08:13:25 +08:00 via Android
    @zaishanfeng 其实就是文字上的表述问题,例如 “每分钟处理20000次请求” 听起来也是 “瞬间”,但平均下来每秒只要处理大约 333 次就可以了,具体还是要看实际访问量+沟通吧,如果真的是每秒 20000 次请求,不加钱别谈了,这么大的项目还这么吝啬。
    zaishanfeng
        21
    zaishanfeng  
    OP
       2014-11-13 08:17:18 +08:00 via Android
    @abelyao 就跟抢购小米一样,整点的那几秒,请求会很多,也就那几秒,他们也不好估计那几秒究竟有多少请求,他们老板不懂这些
    zaishanfeng
        22
    zaishanfeng  
    OP
       2014-11-13 08:21:30 +08:00 via Android
    @serco 我比较熟悉php python 实测根本达不到,现在考虑用golang, 抢购业务不复杂,页面很简单
    blaboy
        23
    blaboy  
       2014-11-13 08:28:48 +08:00 via Android
    搞一个排队程序。哈哈哈。
    msg7086
        24
    msg7086  
       2014-11-13 08:28:56 +08:00
    @zaishanfeng 小米那请求量,营业额都能上亿了,只用一台服务器这不搞笑么……
    服务器要是挂了那可是上亿损失啊。
    zaishanfeng
        25
    zaishanfeng  
    OP
       2014-11-13 08:30:41 +08:00 via Android
    @msg7086 打个比方而已 他们销售额不多,利润也很低,纯粹为了推广。我现在打算让他们加服务器,不知道加多少合适?
    zaishanfeng
        26
    zaishanfeng  
    OP
       2014-11-13 08:32:22 +08:00 via Android
    楼主没有高并发开发经验,跪求指点!
    shawngao
        27
    shawngao  
       2014-11-13 08:34:14 +08:00
    @zaishanfeng Golang我测过,没数据库的话我的Macmini能跑1W6这样子,所以一定要用redis之类的,或者逻辑不复杂的话直接加载到内存。
    wzxjohn
        28
    wzxjohn  
       2014-11-13 08:36:58 +08:00
    @zaishanfeng
    @abelyao
    原来是被抢。。。好吧。。。
    msg7086
        29
    msg7086  
       2014-11-13 08:37:32 +08:00
    @zaishanfeng 建议还是先分析一下具体的需求再定。

    首先是要确定瞬间并发2万还是每秒并发2万还是每分钟并发2万。这差别大了去了。

    然后他并发的是什么东西?静态网页还是购物车?多少东西可以缓存?什么东西是一定要hit到你app stack上的?

    最后你记得跟他们老板说一下带宽的问题。每秒2万请求,1个请求50K,已经跑满万兆网卡了,放在机房里光带宽费就要超过5位数咯。
    zaishanfeng
        30
    zaishanfeng  
    OP
       2014-11-13 08:37:58 +08:00 via Android
    如果页面加上cdn的话,本机需要多少带宽才扛得住,每个页面大概100k,cdn不知道有没有带宽限制
    msg7086
        31
    msg7086  
       2014-11-13 08:46:44 +08:00
    @zaishanfeng 100KB × 20kPV = 2GB

    如果是20kPV/min的话就是267Mbps,半个千兆就行。
    如果是20kPV/s的话就是2GB/s就是跑满2块万兆网卡,或者20多块千兆网卡。
    如果是并发20kPV的话,假定是0.1s执行速度那就是20GB/s,你需要20块万兆网卡和一层楼的带宽量,服务器数十台,外加各种交换机数十台,成本可参考12306。
    rrfeng
        32
    rrfeng  
       2014-11-13 08:47:19 +08:00
    nginx

    return 204

    2 万没问题妥妥的
    zaishanfeng
        33
    zaishanfeng  
    OP
       2014-11-13 08:50:26 +08:00 via Android
    @shawngao 逻辑不复杂 就一个登录 一个预定 一个结果页 , 都可以放在内存里。

    现在就按一分钟并发两万,前十秒并发1万,瞬间并发2000算吧。

    带宽需要多少,加cdn。服务器要加几台。

    如果卡住了,什么样的应对措施比较好?是很前两天联通抢购流量包一样来个服务器忙,还是什么都不做,让他慢慢等?
    zaishanfeng
        34
    zaishanfeng  
    OP
       2014-11-13 08:51:19 +08:00 via Android
    @msg7086 。。。。
    mgc
        35
    mgc  
       2014-11-13 08:56:14 +08:00   1
    alert('服务器繁忙,请稍后再试');
    icqdany
        36
    icqdany  
       2014-11-13 09:00:49 +08:00
    Gearman
    m_z
        37
    m_z  
       2014-11-13 09:10:51 +08:00
    不愿意买,去租阿
    zaishanfeng
        38
    zaishanfeng  
    OP
       2014-11-13 09:12:32 +08:00 via Android
    @m_z 是租 我没说清楚
    loading
        39
    loading  
       2014-11-13 09:20:27 +08:00
    知道AWS吗?刚开始就是用来支撑圣诞节的!
    这临时需求,居然买永久性的服务器,有病!
    zaishanfeng
        40
    zaishanfeng  
    OP
       2014-11-13 09:22:59 +08:00 via Android
    @loading 额 怪我没说清楚 这个肯定不会永久性的,是租,阿里云或者其他什么的
    CupTools
        41
    CupTools  
       2014-11-13 09:25:59 +08:00
    @zaishanfeng 短期的话做Cloud bursting,租用公共云资源。阿里云可以

    长期的话必须自己买设备自己做
    ipconfiger
        42
    ipconfiger  
       2014-11-13 09:34:27 +08:00
    这样子的连接数能满足不?node.js+redis
    阿里云4核8G主机


    cpu 20% mem 30%
    xoxo
        43
    xoxo  
       2014-11-13 09:40:53 +08:00
    别纸上谈兵了.
    架构搞好 + 异步处理订单 + 大流量弹神兽验证码

    感觉是最好的方案了
    Comdex
        44
    Comdex  
       2014-11-13 09:42:30 +08:00
    golang想你所想
    mhycy
        45
    mhycy  
       2014-11-13 09:47:52 +08:00
    @abelyao
    某地方部门给我们一个X6550服务器上的虚拟机...8G内存.........
    结果跑下来就30m带宽(他们说百兆接入,我们内网跑的数字,可以想象母机负载有多高)
    要求做个类似于领导热线的在线留言板....
    满足峰值5W在线的需求.........(5W这个数字不用担心,因为公务员都得上线)
    ScotGu
        46
    ScotGu  
       2014-11-13 09:53:42 +08:00
    @xoxo 大流量弹神兽验证码 可以有效降低负载,同事屏蔽低端用户, 值得推广。。
    abelyao
        47
    abelyao  
       2014-11-13 10:02:02 +08:00
    @mhycy 我勒个去…
    jiongjionger
        48
    jiongjionger  
       2014-11-13 11:13:50 +08:00
    2W并发,纯php、python显然不太现实了。除非你叫钱多多。
    另外弱弱的问下,您说的是峰值2W还是平均2W?峰值2W,完全可以上验证码限制一下,还能过滤不少机器人和低端用户。平均2W,你这是比京东还的节奏啊
    yangff
        49
    yangff  
       2014-11-13 11:51:35 +08:00 via Android
    临时花几千块租个云用几天咯。
    RemRain
        50
    RemRain  
       2014-11-13 12:17:32 +08:00
    LZ,不用租机器可以搞定的,给你回复到这了 /t/146139
    mhycy
        51
    mhycy  
       2014-11-13 12:24:30 +08:00
    @RemRain 果然是好办法.....
    zaishanfeng
        52
    zaishanfeng  
    OP
       2014-11-13 12:38:37 +08:00
    @jiongjionger 验证码不太好吧 我还没发现哪个抢购的还有验证码 峰值预计四五千
    zaishanfeng
        53
    zaishanfeng  
    OP
       2014-11-13 12:39:28 +08:00
    @mhycy 亲 你们是怎么对付员员们的?
    mhycy
        54
    mhycy  
       2014-11-13 12:50:11 +08:00
    @zaishanfeng 作为乙方只能尽量满足对方需求....
    最近几天做新项目兼容IE6..........
    benjiam
        55
    benjiam  
       2014-11-13 13:33:37 +08:00
    瞬间2万吗? 还是很容易的。 可以在微博上搜我的文章 c1000k实践手册。 我那个框架 可以接收同时12万并发请求的瞬间接入, 不会有掉线。服务器是7年前的 4核心。所以应该没问题
    cxe2v
        56
    cxe2v  
       2014-11-13 13:59:08 +08:00
    @zaishanfeng 天猫的抢购都有验证码,谁说没有
    mhycy
        57
    mhycy  
       2014-11-13 14:15:04 +08:00
    @benjiam 大神请明示,微博按照关键字没找到....
    zts1993
        58
    zts1993  
       2014-11-13 15:09:06 +08:00
    @mgc 棒极了。
    zts1993
        59
    zts1993  
       2014-11-13 15:09:55 +08:00
    随机数判断啊


    不和条件直接返回false。
    23333333333333333333333
    benjiam
        60
    benjiam  
       2014-11-13 15:51:24 +08:00
    查 c1000k
    clino
        61
    clino  
       2014-11-13 16:03:53 +08:00
    @zaishanfeng 用python的话应该用gevent,twisted,tornado 才有可能吧

    @benjiam 微博上搜到个 https://github.com/xiaojiaqi/C1000kPracticeGuide ,是这个吗?
    jiongjionger
        62
    jiongjionger  
       2014-11-13 16:08:35 +08:00
    @zaishanfeng 天猫的不就有么,还有些虽然没验证码,但是抢的时候需要回答问题,和验证码一个性质,都是为了防止峰值和机器人
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2199 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 00:30 PVG 08:30 LAX 16:30 JFK 19:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86