首页 > 业内资讯 > 浅谈 12306 核心模型设计思路和架构设计

浅谈 12306 核心模型设计思路和架构设计

时间:2016-02-22 | 来源:developerWorks | 阅读:85

话题: developerWorks

  1. 先根据区间去判断是否有可用的座位;

  2. 如果有可用座位,则再通过算法去选择一个可用的座位;


当得到一个可用座位后,就可以生成一张票了,然后保存这个票到车次聚合根内部即可。下面举个例子:

假设现在的情况是座位有3个,站点有4个
座位:1,2,3
站点:abcd


票的卖法1:
票1:ab,1
票2:bc,2
票3:cd,3
票4:ac,3
票5:bd,1

这种选座位的方式应该比较高效,因为总是优先从座位池里去拿座位,只有在万不得已的时候才会去回收可重复利用的票。

上面的4,5两个票,就是考虑回收利用的结果。


票的卖法2:
票1:ab,1
票2:bc,1
票3:cd,1
票4:ac,2
票5:bd,3

这种选座位的方式应该相对低效,因为总是优先会去扫描是否有可回收的座位,而扫描相对直接从座位池里去拿票总是成本相对要高的。

上面的2,3两个票,就是考虑回收利用的结果。


但是,优先从座位池里拿票的算法有缺陷,就是会出现虽然第一步判断认为有可用的座位,但是这个座位可能不是全程都是同一个座位。举例:

假设现在的情况是座位有3个,站点有4个
座位:1,2,3
站点:abcd
票的卖法3:
票1:ab,1
票2:bc,2
票3:cd,3

现在如果有人要买ad的票,那可用的座位有2,或者3。但是无论是2还是3,都要这个乘客中途换车位。比如卖给他座位2,那他ab是坐的座位2,但是bc的时候要坐座位1的。否则拿票2的那个人上车时,发现座位2已经有人了。而通过优先回收利用的算法,是没这个问题的。


所以,从上面的分析我们也知道选座位的算法该怎么写了,就是采用优先回收利用座位的算法。我认为不管我们这里怎么设计算法,都不影响大局,因为这一切都只发生在车次聚合根内部,这就是预先设计好聚合根,明确出票职责在哪个对象上的好处。


模型分析总结

  1. 我认为票不是核心聚合根,票只是一次出票的结果,一个凭证而已。

  2. 12306真正的核心聚合根应该是车次,车次具有出票的职责,一次出票具体做的事情有:

    • 判断是否可出票;

    • 选择可用的座位;

    • 更新一次出票时所有原子区间的可用票数,用于判断下次是否能出票;

    • 维护所有已售出的票,用于为选择可用座位提供依据;


湘ICP备2022002427号-10湘公网安备:43070202000427号
© 2013~2019 haote.com 好特网