V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
noli
V2EX  ›  程序员

选课系统,火车购票系统, 这类问题如何优雅解决

  •  
  •   noli · 2019-09-05 18:02:40 +08:00 · 4449 次点击
    这是一个创建于 1667 天前的主题,其中的信息可能已经有所发展或是发生改变。
    选课系统和火车购票系统有相似的特点,
    短时间内会有爆发性用户并发,每一次选课或者购票都会影响全局。

    像这类系统有没有什么通用的经验介绍一下?

    譬如可以从减少用户焦虑,提高支撑能力等方面?
    27 条回复    2019-09-06 16:08:28 +08:00
    VDimos
        1
    VDimos  
       2019-09-05 18:05:54 +08:00 via Android
    加服务器
    hahaayaoyaoyao
        2
    hahaayaoyaoyao  
       2019-09-05 18:10:53 +08:00 via Android   ❤️ 5
    竞价选课啊,陪读外国学生选课啊
    Coolee
        3
    Coolee  
       2019-09-05 18:14:03 +08:00
    服务器跟上了,就不会有问题,就像淘宝双十一
    chinvo
        4
    chinvo  
       2019-09-05 18:15:21 +08:00 via iPhone
    队列、扩容、人为限制(比如分系分时段放课、分地区分时段放票)
    qq316107934
        5
    qq316107934  
       2019-09-05 18:21:54 +08:00   ❤️ 1
    这类属于秒杀系统,秒杀系统行业有很多成熟的方案,可以参考下。

    减少用户焦虑可以从前端加入等待动画,状态显示;后端热 key 做好集群隔离,用策略打散用户请求时间。
    最后,做好压测,解决性能瓶颈,容量预估,然后看着加机器。
    moonfly
        6
    moonfly  
       2019-09-05 18:28:30 +08:00 via iPhone
    看到火车购票网站,还有没有人记得一个叫 12306NG.org 的网站?
    lshero
        7
    lshero  
       2019-09-05 18:29:04 +08:00
    好几百个教授一致同意错峰选课
    kokutou
        8
    kokutou  
       2019-09-05 18:30:46 +08:00
    所有人分成 10 份,
    放到 10 个不同的位面,
    这问题就解决了。。。
    Narcissu5
        9
    Narcissu5  
       2019-09-05 18:35:04 +08:00 via Android
    这类系统就不该做成秒杀式的,现在 12306 有个功能候补,思路终于对了
    smdbh
        10
    smdbh  
       2019-09-05 18:43:42 +08:00
    @VDimos 加服务器的本质是什么,最后结算不是还要到一起么
    JerryCha
        11
    JerryCha  
       2019-09-05 18:48:44 +08:00
    选课可以不遵循先到先得的规则,到点了关闭通道随机踢人。
    VensonEEE
        12
    VensonEEE  
       2019-09-05 19:12:38 +08:00
    最好的方案是预约摇号。
    秒杀什么的 ,都是劳神劳力。
    摇号,全凭天意,无话可说。
    gamexg
        13
    gamexg  
       2019-09-05 19:33:30 +08:00 via Android
    @smdbh 可以拆分
    按铁路线路、用户 id 扩展。
    noli
        14
    noli  
    OP
       2019-09-05 20:14:30 +08:00   ❤️ 1
    #3 @Coolee 我认为双十一抢购,和选课买火车票,不是同一种业务模型。

    #4 @chinvo

    如果使用队列的话是否意味着,用户需要等待?
    假设用户是 Web 端的,同时多人等待再通知只会造成更大的负荷问题吧?

    #12 @VensonEEE 题外话,如果买火车票要摇号,恐怕会引发更大的非技术层面问题。几百万人不确定自己是不是能回家是很可怕的事情。
    chinvo
        15
    chinvo  
       2019-09-05 20:20:51 +08:00 via iPhone
    @noli #14 不管是轮询还是 long polling、ws,用户等待期间只是查询一个状态,开销远比大量业务 /事务压上来低多了
    Greatshu
        16
    Greatshu  
       2019-09-05 23:22:48 +08:00
    就学校选课而言,这些应该就够了
    按照年级分开选课
    临时限制多设备登录
    给选课超过一定数量的人给予清空课表处理
    给脚本用户加验证码
    云服务器(学校私有云)临时扩容
    dallaslu
        17
    dallaslu  
       2019-09-06 01:09:16 +08:00
    这两个问题都是如何公平分配的问题。选课和刷票都是大家拼手速,手快有手慢无,抢到的沾沾自喜,没抢到的骂骂咧咧。另外还有一些常见办法,比如看运气——摇号分配车牌;看需求强烈程度——优先把奶给哭声大的孩子。但是高考填志愿施行多年,没人觉得高考不公平,甚至会说最公平的就是高考了。现在候补票的方式,终于有点靠近这个公平范例了。我把志愿报给你,我只要是周末北京到南京就可以,服从安排,有啥坐啥;隔一段时间给我个结果就行了。根本没必要浪费时间刷几个小时,一等座没刷到,再刷二等座也没了,又刷站票卧铺都没了。
    qile1
        18
    qile1  
       2019-09-06 07:24:32 +08:00 via Android
    解决方案就是拿钱咂,好多次看到 12306 上面有票,就是买不到,持续半小时都是那样!
    sbbeta
        19
    sbbeta  
       2019-09-06 08:16:28 +08:00 via Android
    @qile1 因为那是缓存
    ybbswc
        20
    ybbswc  
       2019-09-06 08:18:37 +08:00 via Android
    需求大于供给。没办法。
    Coolee
        21
    Coolee  
       2019-09-06 08:50:21 +08:00
    @noli 抢票,选课,和买电影票是一样的,只不过业务级别差很大吧。
    换种角度,如果能有更好分配先后买票的解决方案,或许可以解决这种问题。
    再换种角度,火车票抢票这种情况只在中国才有,需求量大了,很多问题也就不言而喻了。
    niubee1
        22
    niubee1  
       2019-09-06 09:28:01 +08:00   ❤️ 1
    火车票购票的问题不光是互联网抢购的问题,还涉及到车站线下购票,购票点购票的问题,多个渠道抢有限资源,还必须兼顾公平,比如 12315 线上购票 11 点后就停止服务了, 因为车站和购票点也都是 11 点就关门停止售票了,如果网上还能抢,对无法上网购票的人来说不公平。这个和选课什么的相比还是要复杂很多
    luojianxhlxt
        23
    luojianxhlxt  
       2019-09-06 09:31:02 +08:00
    学习小米,点击选课后先 roll 一下,小于 95 的直接下一轮

    运气也是实力的一部分
    967182
        24
    967182  
       2019-09-06 10:47:02 +08:00
    按年级、按学科、按老师 拆分选课时间
    ddzy
        25
    ddzy  
       2019-09-06 10:51:19 +08:00
    @hahaayaoyaoyao 暴躁老哥, 在线摊牌
    littlewing
        26
    littlewing  
       2019-09-06 12:28:50 +08:00 via iPhone
    排队
    Eugene1024
        27
    Eugene1024  
       2019-09-06 16:08:28 +08:00
    先预约,凭号来 ,各时段分流
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2826 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:29 · PVG 21:29 · LAX 06:29 · JFK 09:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.