V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zaishanfeng
V2EX  ›  问与答

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

  •  
  •   zaishanfeng · 2014-11-13 07:35:28 +08:00 via Android · 13963 次点击
    这是一个创建于 3698 天前的主题,其中的信息可能已经有所发展或是发生改变。
    瞬间并发量能达到两万,服务器四核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   ·   实用小工具   ·   2718 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:45 · PVG 22:45 · LAX 06:45 · JFK 09:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.