如何看待春运票务系统的架构优化?

  • 回答 (9)
  • 关注 (0)
  • 查看 (300)

最近,很热的问题应该就是春运的购票系统了。疯狂堆砌的“加速包”,七零八碎的“抢票‘’APP,其实最核心的问题应该就是需求大于供给了。

如何合理的分配票务资源,保证票务系统的正常运转,成了春运票务系统的核心需求。

其实票务系统架构步骤无非在于:

1、 检查是否有剩余的票

2、 购票后票数减一

3、 账户上扣除金额

4、 获得火车票

在这些步骤的基础上,购票系统又该如何进行架构优化呢?

TaborTabor

CM-Z.net · 站长 (已认证)

提问于
嗝屁软件工程修改于
已采纳

感觉题主上面说的太简单了些。

如上所说一般的电商网站,购买都是基于商品的概念,每个商品有一定量的库存,用户的购买行为是针对商品的。当用户发起购买行为时,系统只需要生成订单并对用户要购买的商品减库存即可。但是,12306就不是那么简单了,具体复杂在哪里,且听我慢慢分析:

如今的票务系统,核心要解决的问题是网上售票。涉及到2个角色使用该系统:用户、铁道部。用户的核心诉求是查询余票、购票;铁道部的核心诉求是售票。购票和售票其实是一个场景,对用户来说是购票,对铁道部来说是售票。

业务模型也大抵如此:

查询余票:用户输入出发地、目的地、出发日三个条件,查询可能存在的车次,用户可以看到每个车次经过的站点名称,以及每种座位的余票数量。

购票:购票分为订票和付款两个阶段,本文重点分析订票的模型设计和实现思路。

其实还有很多其他的需求,比如给不同的车次设定销售座位数配额,以及不同的区段设置不同的限额。但相比前面两个需求来说,我觉得这个需求相对次要一些。

以北京西到深圳北的G72车次高铁为例,它有17个站(北京西是01号站,深圳北是17号站),3种座位(商务、一等、二等)。表面看起来,这不就是3个商品吗?G71商务座、G71一等座、G71二等座。大部分轻易喷12306的技术人员就是在这里栽第一个跟头的。实际上,G71有136*3=408种商品(408个SKU),怎么算来的?如下:

如果卖北京西始发的,有16种卖法(因为后面有16个站),北京西到:保定、石家庄、郑州、武汉、长沙、广州、虎门、深圳。。。。都是一个独立的商品,同理,石家庄上车的,有15种下车的可能,以此类推,单以上下车的站来计算,有136种票:16+15+14....+2+1=136。每种票都有3种座位,一共是408个商品。

细思极恐,所以票务系统远远不是题主想的那么简单

其实任何一次购票都是针对某个车次的,我认为车次是负责处理订票的聚合根。

一个车次包括了:

1)车次名称,如G72;

2)座位数,实际座位数会分类型,比如商务座20个,一等座200个;二等座500个

3)经过的站点信息(包括站点的ID、站点名称等)

4)出发时间;看过GRASP九大模式中的信息专家模式的同学应该知道,将职责分配给拥有执行该职责所需信息的类。我们这个场景,车次具有一次出票的所有信息,所以我们应该把出票的职责交给车次。另外学过DDD的同学应该知道,聚合设计有一个原则,就是:聚合内强一致性,聚合之间最终一致性。经过上面的分析,我们知道要产生一张票,其实要影响很多和这个票对应的线段相交的其他票的可用数量。因为所有的站点信息都在车次聚合内部,所以车次聚合内部自然可以维护所有的原子区间,以及每个原子区间的可用票数(相当于是库存数)。当一个原子区间的可用票数为0的时候,意味着火车针对这个区间的票已经卖完了。所以,我们完全可以让车次这个聚合根来保证出票时对所有原子区间的可用票数的更新的强一致性。

我觉得12306这样的业务场景,非常适合使用CQRS架构;因为首先它是一个查多写少、但是写的业务逻辑非常复杂的系统。所以,非常适合做架构层面的读写分离,即采用CQRS架构。

CQRS架构模型如下:

下面来讨论下技术层面

主要的技术模型推测是这样的:

要解决12306面对“高流量,高并发“的难题是需要从软件平台和应用系统层面出发,要实现“可扩展的应用云平台架构”,灵活和快速热部署的机制,才是真正解决高并发访问的根本。

12306承建单位-铁科院在此方面做很多改进,使用Pivotal Gemfire内存数据管理平台,重新设计和改造核心子系统,从用户登录,余票计算,票价计算,实名身份认证,到订单查询;这些改造后的业务子系统都能支持“按需弹性扩展”, 不再受限于原来关系型数据库无法做分布式扩展的问题。

这些一连串的改造,打通各个环节,实现“质”的大跃进, 也为未来使用混合云服务模式的架构打下良好的基础。

其中混合云设计的特点归纳如下:

1. 业务托管:

从整个购票流程来说,12306只是将部分流程的环节-“余票查询”业务交由云厂商提供服务,并不是“整个系统”按需扩容的托管,这与一般企业的业务托管有最大的差异。如何将“业务子系统“剥离整个系统独立作业, 再将数据结果传回系统,协同作业,这需要从应用系统框架设计着手。

2. 敏感资料的存放和安全性:

12306是公共服务平台,敏感性资料的保护和安全性是首要考虑因素。在混合云设计上,12306将这些资料存放在私有云的数据中心, 确保数据安全无虑。

3. 业务连续性,应用不中断的容灾设计:

双数据中心并行作业,不但可以分担高负载运行,而且可以相互备份, 保证操作不间断。

4. 资源动态扩展:

将“难预测,暂时性”的巨大访问量-余票查询业务放在公有云服务商,可以按需动态调整网络带宽和“虚机“资源,保证12306的服务品质,并解决网络传输瓶颈问题。

5. 关系型数据库(SQL) 和非关系型数据库(NoSQL)混合应用:

12306将热点数据放在NoSQL的Gemfire平台,提供快速查询和计算;将关键数据持久化到关系型数据库。

回答过的其他问题

为什么我的web服务器搭建好之后网站的aspx文件打开显示404呢?

嗝屁软件工程
第一步,检查IIS服务扩展 控制面板->管理工具 ->服务和应用程序 ->Internet 信息服务(IIS)管理器 ->Web服务扩展 -> Active Server Pages -> 允许 -> Internet数据连接器 -> 允许。 注:ASP的程序版本要与ASP服务扩...... 展开详请

关于 云对象存储v4 费用计算?

嗝屁软件工程
COS 标准存储采用后付费方式,根据实际使用量收费。其中存储空间、请求数、数据取回三类计费项采用月结方式。每月 3 日到 5 日为账单结算日,对上月产生费用进行结算,输出账单。流量采用日结方式,每日对上一日产生费用进行结算,输出账单。 费用说明 COS 在中国大陆目前支持的地域有...... 展开详请

如何看待家用智能机器人的飞速发展?

嗝屁软件工程
智能机器人的飞速发展离不开人工智能的各种技术的飞速发展啊,比如通过语音与用户交互,通过语音控制来播放音乐、视频,实现远程家居监控等等。 而Zenbo最重要的语音交互,是用腾讯云小微来实现的。 [图片] 它有一下几个主要功能: 1,人脸识别:在LFW无限制条件下人脸验证测试中,...... 展开详请

文智关键词提取API报错501,短文能用,长文不行?

嗝屁软件工程

调用一次接口content/text的最大长度限制为65535字节。

32767个汉字,看看是不是超了?或者看下py45行

相同配置的数据库和服务器为什么差价那么多?

嗝屁软件工程
1.云存储服务,是腾讯云平台提供的面向互联网应用的数据存储服务。 2.完全兼容 MySQL 协议,适用于面向表结构的场景,适用 MySQL 的地方都可以使用云数据库。 3.提供了高性能、高可靠、易用、便捷的 MySQL 集群服务。 4.整合了备份、扩容、迁移等功能,同时提供 ph...... 展开详请

云通讯发送小视频sendMessage接口回调code:116001怎么解决?

嗝屁软件工程
no permission 是指没有权限访问某项资源 IM发送的小视频实际上是存储到点播中的,检查一下你点播套餐有没有开通咯; 如果开通了,检查是否开通了防盗链,你app做的请求是否符合防盗链要求;... 展开详请

关于作者

所属标签

扫码关注云+社区