作为程序员,你可以开发一个 12306 嘛
或者在原理上该如何实现一个 12306 ,技术难点有哪些,欢迎大家讨论
感觉难度被夸大了。
用 bit 表示列车的站点区间,卖出一张票,就把对应的 bit 置 true , 若对应区间都是 false 表示可乘。一趟列车不会超过 32 个停靠站,4 字节就够表示一趟列车上一个座位的售卖情况。全国 2 个月内的也就几个 G 内存就能装下。
余票查询操作全部是内存计算,没有 rpc ,没有锁甚至没有 cas 操作,可以做到单机很高的并发
www.zhihu.com/question/315887668 知乎有过讨论
可以,大概 2000 元预算就可以了。
找几个 985 计算机研究生就能搞定了,哪里需要什么复杂的技术和大量的资金投入啊
#1 一个 bit 只能表示有或者无票吧,实际上是要表示票剩下数量有多少
这个话题 v2 之前对喷过好几页
系统本身应该就是调度算法和卖票相关的算法难. 以及更多的难处是要抗住全国节假日的短时间并发量、以及各黄牛 /脚本的外挂刷刷刷.
精英全在 v2🙏
一般的商城系统就可以,每个旅程段的车票无限多,根据订单现场造火车。
#1 一个位图就解决啦?
“卖出一张票”,魔鬼藏在这里呢。
这楼里都是没有实际做过项目的产品在叨逼叨?
精英全在 v2🙏12306 就该来这边找外包,还搞什么全球招标。
有没有考虑过一个问题,比如一条线起点 a ,能到 b 和 c ,需要保证到 b 点的人至少百分之 60 能买到票,然后到 c 点的也要有百分之 60 (还包括 b 点上车的)能买到票,如果这样、还算简单吗?
再加上需要为线下保留百分之 10 的或者百分之五的票,为不方便网上买票的用户购买
v2 真牛,12306 没请你们真是失败
不能
别做梦了,业务复杂到你不可想象
我觉得这是很难的,座位算法是牵一发动全身那种,不只有直达,还会影响换乘的线路和时间,并且即时更新,加上超高并发,比双十一抢购还要难。
技术很简单,但不便宜哦,因为 v 友的时薪都很高。
按 12306 的工作量,最低 3000 块钱,并且,你得先付 1500 的定金。
原理不复杂,本质上还是商品售卖服务,就是商品级联的业务逻辑比较复杂,但是任何服务好用和能用背后的成本是两回事。
同理可以类推:搜索,从 like 语法到语义识别直接给答案,云泥之别。
12306 这种网站恶意和灰色流量可能比正常流量还多
不考虑恶意流量和对手攻击,很多事都好解决很多
12306 真正解决问题是自己开发排队系统,绝杀第三方
不能
看完我觉得 原铁道部没请 v2 的精英去开发 12306 是铁道部的损失🐶🐶🐶
只有 1# 2# 21# 有参与讨论
剩下全在冷嘲热讽
此贴可以下沉了, 因为可以预见接下来全是嘲讽.
挺简单的,我去年去某头部大厂面试,面试官就让我当场设计一个 12306 。[人麻了]
哈哈哈
技术难度没那么大,业务难度比较大。
什么实时计算复用就当扯淡就行了,铁路车票不是这么卖的。
v2 真牛,12306 没请你们真是失败
不考虑区间卖票最优解分配问题?不考虑经济效益问题?那么大的并发量不需要考虑锁?多个人买到同一张票?还有,你没注意到你周边座位基本都是和你目的地一样的吗?
铁路售票不是这么实时的哦,其实每趟车不同区间段的票,有多少票都是预定义好的。比如刚开票一般只放出来一部分起终点的票,中间站是不放票出来的,然后随着时间,之后慢慢放出来中间站的。
牛逼,都是高手,中科院没你们损失大了
System design 而论没有非常复杂
但是实际实现很难 很难
别一下子调到开发啊,需求调研,产品交互设计必不可少,先把这两个搞清楚了,再来谈开发。本末倒置了
为什么论坛都会变成阴阳怪气冷嘲热讽呢,贴吧 nga 知乎 v2 感觉都同质化了
遇到这这种帖子,不嘲讽怎么办?都这种情况了,难道还要好好说话?
#33 因为阴阳怪气成了流行的表达,知乎有过一个讨论 www.zhihu.com/question/402147443
一瞬间甚至觉得是不是在钓鱼🤔
技术,钱资源不重要,首先你要扛得住几亿人骂你。
有钱谁管被骂多惨啊
我建议先不谈技术,而是先用人类自然语言来描述 12306 的需求。
大部分程序员都没有这么大并发的经验
先不谈技术实现,能把需求文档写清楚再说。
ABCDEF……Z 个站,卖出一张 AD 的票,AB 、BC 、CD 、AC 、BD 就要减少一张,这个数据库怎么改,前后端怎么同步,怎么压低超售概率,锁票逻辑,想想就让人头大。
主要难点还是流量大啊。那些个说卖票算法多复杂的,不如看看现在 12306 的算法,也不咋地啊。
今天抢火车票,又是传统的只有终点站有票其他没票。然后看心情隔几天发几张,这种算法我上我也行啊=。=
从实际体验上来说,卖票算法并不智能,也完全没做到什么能让 60%的人买上票这么神。
这才是符合商业利益的算法啊,补票的时候就直接不装了,谁买全程谁就优先排队
搞得我以为 12306 不是程序员开发的。
12306 多少也是个千人起步的系统,能 hold 住技术这一块的最最起码是个大厂的 VP ,这个是 CTO 岗位。
扪心问一下自己。。。让你当 CTO ,你有这个能力不。
难度不是在上亿级别的并发吗?
#45 对的,所以我现在就很绝望,ABCDEFGHIJK 这几个车站,我这次是抢 A 到 I 的,硬是一到发售就没了,我怀疑压根没放票,而 A 到 K 的,我现在看还是“有”。
我看了到 J 的也是一张都没有。合着只有起始到终点站的呗,然后候补也不知道啥时候是个头,影响后续规划。
等到候补到了没几天了,然后其他日期的票要退,又是一笔手续费。12306 赚麻了。
是的,上来就技术的一看就离谱,真正主导做过系统的哪有这么搞的
你们都太负责任了,想得太复杂。
实际上 12306 是玩忽职守的,售票是随意决定的。
将所有可能的票按类型提前分配好,就像数据库分区一样,分到具体节点,每个节点负责一小部分票。
售票的时候,负载均衡将用户分配到售票节点。
分给你的节点卖光了,就跟你说没票。即便全局来看其他的节点还有票。
平常的时候一列车就一个售票节点,余票是可靠的,就剩一张票你也能买到,春运的时候一列车一排节点,
余票是不可靠的,你买到票的概率是随机的。
就第一眼的需求
感觉自己写不了,好复杂,可能我的经验还不够
#42 补充一个还要票务分配 线上线下每日比例放票 海量的线下窗口各种客户端都在疯狂出票
铁路上的票是预分配好的
#5
#1 楼说的是区间是不是有票,比如 A11 这个座位的值是 00111100 ,就表示 A11 座位从第 3 站到第 6 站这 4 站的票已经有人占用了。余票数量跟这个没关系。
这么多年的购票经历来看; 3000 块,只参与买票,不能参与卖票
抢得是位置,而不是票
我同学大学本科毕设就是抢票工具 接口确实免费,可以参考下 www.bypass.cn/
我觉得你说的有道理啊。从外面看似系统遵守业务规则,其实从内部看做了很多妥协。
先说一点, 各个站的票数是写死的, 并不是动态算的.
我回家是 A -> B -> C 的中间站 B, A -> B 每次应该是只有 2 张票, 我买不到, 都是直接买 A -> C 的.
你要能满足那么高并发,不是件简单的事
别说技术了,需求能完全整清楚并且表述出来形成需求文档都没几个
我记得 12306 刚出来的时候,经常崩溃,也有一群程序员,不知天高地厚的想要挑战,觉得开发 12306 的都是沙比,殊不知,业务复杂度高得很
我记得之前看到的,12306 的票不是动态分配的,举例:
A B C 三个站,1000 张票
A-C 800 张
B-C 200 张
第一天开放其中一半的售票,过几天再开放 30%,过几天再把剩下的开放
我记得大概是这个逻辑,如果不对请指正
v2 高手就是多啊🙏🏻
不谈抢购什么, 你先把动态分配车票逻辑搞定.
我觉得#1 说的很对,难度被夸大了。
直到现在,12306 的余票数量还是像量子力学一样,一会儿显示有票一会儿又突然消失一会儿又出现那个数字,然后点进去买票,就显示出票失败。
所以,同步加锁并没有想象的那么严酷。
另外,铁路看起来那么多条挺吓人,但是各个线路是没有关系的啊,所以考虑难度的话,只考虑 1 条线路就好了,1 条还觉得很难吗?
内存方面#1 楼也论证了,几个 G 的内存就足够了,1 台机器不行的话,就多加几台,内存纠错,大带宽同步传输。挺快的。:doge
为什么要一个人开发。。。
我觉得你说的很有到里,讨论到现在,所有人都是把业务简化到并发的库存管理。对于 12306 整体业务的描述,需要满足的性能指标,很好见到人讨论的。只能说,大多数人讨论的都是理论上是否可行,或者在讨论的是能不能完成一个 demo
太简单了,不是随便画个原型,Ai 自动帮你实现了所有功能吗?
一个 iframe 标签解决
可以, 但是你性能指标不行啊.
你说的这些难度不在于研发
我同意你的说法,毕竟是卖方市场,只要能解决大并发不崩溃,剩下的可以慢慢售卖,基本不会让人感觉到体验差,甚至体验会更好,想想最后三天抢到票的感觉,晚上睡觉都会笑。
牛啊,夏虫不可语冰
稍微想一想 业务复杂度就很高了……
纯线上的话相信大多没啥问题,难的是和线上与线下相统一
#55 如果这样就更离谱了,一趟列车的座位 20516=1600 个座位左右,假设每个座位都是 32 个停靠站,6.4K 。车次数据网上没查到比较具体的,大概是千次?算 5000 车次 大概是 32M 内存一天。咋一看确实可以,但是还要考虑分部署冗余等问题
是的。很多人都理解错卖票业务了,并不存在你买了 A-D 的票就影响他买 A-B 的票的情况
大神🙏🏻
不存在你买 A-D 影响 A-C 的情况,没有 12306 的还得线下抢票的时候就不是这样,不是实时的,你想复杂了
你看到的已经是完成业务优化的 12306 了,分时段,分车次,分量放票,自己带补票功能
一开始全放出来全民开抢,而且没疫情的时候,扛住了才是奇迹
#78
所以啊,1 天才对应 32M 内存呢。不同天的数据是可以分布式的,1 台机器只处理 1 天的订票工作不就可以减轻负担了吗?
按照前楼的说法,买了 A-D 的票不影响买 A-B 的票,内存还可以减少。20 个站,两两形成 200 个起点-终点对,每个起点-终点对维护一个剩余票数,2*200=400 字节就够了。
其实把这个问题简化,很多都是可以并发的,而且是完全的并发,不需要同步。
- 5000 个车次,分给 5000 台机器,每个机器处理 1 个车次的订票操作,互不干扰
- 20 天内的订票,分给 20 台机器,每个机器只处理某 1 天的订票
- 20 个站,两两之间形成 200 个起点-终点对,彼此之间的剩余票数也是独立的(按照前楼说法),分给 200 台机器去各自处理。
按照每天发送 1000 万次旅客的高峰,5000*200 台机器并发,每台机器只需要响应 10 次订票请求就可以了。
看别人做都很容易,自己做起来真叫难。难度在于,很多事你都无法用精确的语言描述出来
缺 3 亿人民币雇人开发
一个人的话 弄个抢不到票的应该问题不大
乘票售卖系统难度不大,难度大的是铁路调度系统
难在业务,所谓高并发层面也就那样。
PS:最近上去看,历史订单只能查看 30 天的。
水平有限,给钱开发个省内公交🚌系统还可以,火车搞不来
我记得有几个开发 12306 的人写的帖子,写的挺中肯的。
求链接
一趟车每个站票数是不一样的,而且要知道余票的数量,一张票可能还属于多个区间可以重复买卖等问题,还有等等其他一系列问题,你考虑得场景太少了
讨论这个问题可以先看懂需求, 中国铁路是按什么方式分配车票的? www.zhihu.com/question/36029493
挺难的,自己写可能写个抢票脚本都写不明白
感觉难点不在设计算法有多难,而是超高的并发和超大的了流量。
很久远了。刚刚去搜索了一番书签,没有找到了。
前员工答一波
Q: 技术难点有哪些?
A: 1. 全局性事务
- 流量压力
- 前置检查
- 车票区段售卖
- 全局性事务
现阶段最难的是全局性事务, 因为保密原因, 不能说太多, 一句话概述就是整个系统存在事务问题导致的性能低下 - 流量压力
众所周知 - 前置检查
你买一张票的前置检查多到你无法想象, 目前的做法是线性检查, 提过并行检查的意见, 被否了 - 车票区段售卖
其实车票不是 12306 卖的, 实际卖票的是 18 个铁路局, 12306 只是一个售卖平台.
12306 只是拿到票然后根据用户提交的席位来分配这些票.
总体来说 12306 目前的复杂性都是因为技术债务导致的.
如果抛弃全部包袱, 重新开发需要 200 人的团队开发大概 3 年左右.
#64
现在除了重大节日 其他时间放票都是 98%互联网放票
光说不做的话,那 12306 这事,我一个人一星期就搞定了,洒洒水而已。
按一般政务系统的研发费用配置情况,实际研发费用我觉得不会超过 1000 W
下面是一个程序员coding的时间分配图,原图在这里。 编程时间分配图 思考会是一个很重要的过程,当然耽搁拖沓也有可能也是因为没有想好,抽烟/喝咖啡应该也是一种思考,吃点东西是…
我目前工作是 MFC 写桌面软件,业余时间也想写点其他的东西 但是每次看到服务器,图形学,或者数据库,我就在想,我现在学了,对我的工作也没有用处,那我学他干啥呢,这些和桌面软件…
现在不知道什么情况,本来打算睡个觉起来东西就编译好了,早上起来发现电脑是全新的重启了?为啥重启呢?---好像是自动更新了,msmmp “累积更新”,说明 Windows 自己…