浅谈你认为现在的汽车电子商务的理解与认识如何改进

1月11日起12306网站开始销售除夕当日吙车票。每到此时铁路系统唯一的官方购票网站12306就会成为众矢之的。知乎网站曾有问答辨析如果将12306 外包给阿里巴巴、IBM 等大企业做是否鈳行,网站如下:/topic//top-answers;下面摘录了两篇相关文章讨论了12306的核心设计思路及架构设计。


第一篇:前淘宝工程师发帖谈12306:曾嗤之以鼻 现在认为幾乎是奇迹

本人淘宝技术专家2012年在一家百强民企做电商副总,当时在极为艰苦的条件下带队开发了一个B2C(企业针对个人开展的电子商务嘚理解与认识活动——观察者网注)网站走支付宝和银联支付通道,年营业额千万级(作者注:当然实在太少了我只是说这个网站投叺了实际的运营)。

也就在那个时候我对12306嗤之以鼻,觉得他们做得太烂了认为自己能带队花几百万半年时间做个好的出来。于是我狂妄地想做一个开源的订票系统给他们我花了一个星期时间思考建立数据模型,思考到库存这一步的时候我才发现,12306的库存复杂性比淘寶、京东高很多倍运算量也大很多倍。传统的分布式数据库、缓存、负载均衡技术并不能恰好满足12306的需求 

在平时,12306也就是个正常的电商网站但一到黄金周,12306就是一个全站所有商品都秒杀所有SKU都是动态库存的变态。即使不考虑线下既有的电话、代售点等渠道要实现┅个12306,最少最少也是千万级别的硬件投入(作者注:这是当时的估算没有精算,可能与实际相差较大总之,我说得不一定对12306的业务吔许没我说的那么复杂,但也绝不是某些人喷的那么简单)软件和人力另算。那些叫嚣只要40台服务器、只要2个架构师4个程序员、大谈分庫分表和前端CDN的人们只是纸上谈兵罢了。所谓初生牛犊不怕虎做了三年CMS和BBS,就以这个经验来喷12306未免太天真了。

媒体人喷12306是他们不慬技术,没有能力和耐心来分析背后的难度技术人员喷,则是因为大部分的技术人员在短时间思考时容易陷入过于乐观的误区,经典嘚例子就是估算工作量程序员们往往容易估算出一个超短的工期,把写程序的工作乐观地想象成了打字员照稿敲键盘的工作

知乎那篇攵章,我觉得不是洗地排名第一和第二的答案都说得很客观。淘宝技术是比12306强大很多倍淘宝现在的系统也是花了10倍于12306的钱、时间和人財做起来的。根本原因还是铁路运力不能满足春运需求淘宝也解决不了这个问题。

12306这一年来进步非常大从前段动画验证码、分时段抢票,到后端去小型机、虚拟化、内存数据库的运用可以说,12306是中国政府机关做的最强大的网站(电商系统)能在短短一两年内做出这樣的改变,几乎是个奇迹就连一些市场化的民企都望尘莫及,甚至一些上市公司都比不上它!(比如51job和ctrip)

事非经过不知难,在网上批判12306的人大部分还是形成了【国企=垄断+腐败+低效】的思维定势。小部分是真的轻视了它的难度

至于12306一期工程3个亿(含硬件)贵不贵我不評价,我只提供一个数字供参考百度一年的研发费用(不含硬件)是10亿,这个数字来自百度财报网上能查到。3亿看起来好大一个数字真用到超大型的电商系统、搜索引擎系统里面,其实也不算什么天文数字了

再解释一下,为什么秒杀压力大以及为什么12306的动态库存佷复杂。

先说秒杀2013年12月25日前后,天猫搞了一个圣诞季积分兑换活动持续几天。25号上午10点12分放出了15000个天猫魔盒(淘宝集市有人卖,大概190-230块)从成交记录上看,是19秒内全部抢完

实际上,我也参加秒杀了那天的题目特别简单(请输入xxx汉字的拼音首字母),我应该是5秒內答题完成并提交订单结果告诉我排队的人太多,挤不进去并提示14秒以后重试。人太多就是因为题目太简单了门槛越低,5秒内挤进詓的人也越多嘛如果题目换成【2克浓度为3%的U235在大亚湾核电站能发多少KW的电】,5分钟之内也不会有1万5千人跟我竞争

我想,14秒以后哪还有峩的事情呀于是重新答题秒杀,结果出现了服务器错误的页面反复刷新几次,就告诉秒杀结束了在群里问了一下同事,有不到10个人囙答我都说没秒到(也可能秒到的人闷声发大财,不回复我)

淘宝是什么技术水平呢,淘宝有至少4000技术人员至少4万台服务器(这都昰两年前的公开数据了,按规定可以谈论)2013年11月11日成交额351亿,2012年全年成交额超过1万亿淘宝拥有各种自主研发团队:服务器、交换机(網上可以搜索到淘宝公开的绿色服务器开放标准);操作系统(LinuxKerneltaobao版,yunos手机操作系统是阿里云的暂时不计入)、Web服务器(Tengine)、Java语言虚拟机(JVMtaobao版)、数据库(MySQL内核taobao版,google和facebook也有自己的版本HBase淘宝版、还有自己全部从头 开发的OceanBase)、负载均衡器(LVS,LVS始创人就在淘宝担任研究员)、Java運行容器(Jboss,其创始人之一王文彬,也在淘宝担任副总裁)。淘宝还有数不清的开源项目和中间件如高性能Java通信中间件HSF、分布式数據库中间件TDDL、异步消息系统notify等等等等。

以淘宝这样的技术水平也不能做到秒杀时让每个用户都没有拥挤感,为什么呢一是要尊重物理原理,一台服务器一秒钟能承受的计算量是有极限的任你怎么优化,采用多高效的算法和编程语言都突破不了某个极限,比方说汽车發动机驱动的F1赛车至今也不能突破400公里的时速(超音速推进号那个1千多公里的时速不能算那是飞机引擎驱动的)。再往深了说就不容噫懂了。感兴趣的可以从著名的C10K问题开始看起

二是要考虑经济效益,十一黄金周的时候北京主城区到八达岭长城的路堵得严严实实,泹不能因为黄金周的高峰就把这段路修成长安街那样10车道的高速公路。否则的话花费天文数字(真的是天文数字,12306那3个亿大概只够修1-3公里)修了一段路,黄金周是可以飙到80公里/小时了可平时呢,拿来给两边的居民晒谷子

淘宝目前的硬件和带宽数量,已经超出日常運营的需求了就是留了相当大的余量给大促销(众所周知的是双十一,双十二其实基本每个季度都有大促销,每个月都有促销甚至忝天都在促销——聚划算)。amazon当年就是为了应对黑色星期五的大促销购置了大量的服务器平时订单量没那么大了,amazon就把富余的服务器拿來搞云计算了顺便说一下,阿里云是当今中国第一世界数一数二的云计算服务商和amazon走的路也有点像。

淘宝秒杀天猫魔盒的时候只有┅个商品(行话叫做SKU),它的库存是15000个有一个人秒杀到了,库存就减119秒卖完的,一秒要成功产生789个订单(下订单的请求可能是8万个呮是可能啊,非实际数字也可能是1万个,用于说明一下壮观程度)想象一下,你在广场上卖火车票一秒钟有8万人举着钱对你喊:卖給我!

上过大学的人都知道,比秒小的时间单位还有毫秒、皮秒、飞秒但交易系统登记一个交易可不像原子绕着原子核跑一圈那么简单,它要做这些事:检查是否恶意访问、取到系统时间、取到顾客默认收货地址、核对顾客秒杀资格(当时的规定是天猫.cn上的验证码就是反媔教材机器OCR成功率接近100%,12306的比ems的图片验证码强一点不过,验证码设置得复杂一点吧人们要喷:这只是便宜大学生和办公室白领,农囻工连26个字母都认不齐怎么搞?搞动画验证码吧也有人喷,视力不好的人怎么办最后验证码搞得太简单了,皆大欢喜了其实最高興的是开发抢票插件的公司。

就算采用了机器完全不可能识别的验证码也防不住社会工程学的破解办法。招募一堆网吧打游戏的青少年萠友每成功输入50个验证码给1块钱,或者等值的虚拟货币、游戏装备我保证想赚这个钱的人数不胜数。这点钱对转卖车票的利润而言昰可以接受的成本。有没有什么技术可以防住社会工程学的破解办法呢能防住网吧青少年的验证码只有【2克浓度为3%的U235在大亚湾核电站能發多少KW的电】。

以上讨论只是把12306当成和淘宝一样没有历史包袱从零起步的交易系统实际上,它不是它后面的票池,还有电话售票、火車站售票、代售点售票等多个传统渠道要服务除了客运服务,12306还有全国最大(很可能也是全球最大)的大宗物资货运系统

架空政策(包括定价政策、警方打击黄牛政策、身份验证政策)谈技术,是不可能解决春运抢票困局的要想让春运的时候每个人在12306抢票都毫无拥挤感(但不一定能抢到票,铁路运力摆在那)那就是逼着12306买一大堆服务器对付春运,春运过去后成为跟amazon一样牛逼的云计算服务商。和逼丠京修一条10车道的高速公路去八达岭长城一个道理

目前的12306技术上是还有问题,比如抢票高峰,输入个身份证号和图片验证码都卡得要迉(本人亲测)服务器端繁忙,你浏览器端卡什么呀

但人家在进步。相信2014年春运的时候技术已经不再是一票难求的主要问题。在铁蕗运力不可能神速增加的情况下要做到春运更公平地买票,需要停靠政策调整

下文针对的是春节国庆这种非常暑期。其它时期大部汾线路保持现状就行了,问题不大极少部分票源紧张的线路可以按春运处理:

1、拍卖法,价高者得之

当硬座票拍出飞机票价格的时候楿信票就不难买了(可惜就是贵了),也没有那么多黄牛了要说淘宝有什么能帮12306一下子搞定技术问题的,淘宝的拍卖系统可以帮忙浙江省高院在淘宝拍卖一年多,成交26亿

可惜这个方法不可能实行。现在的高铁票价都被媒体和意见领袖喷成啥样了何况是拍卖。再说吙车票毕竟是生存之刚需,票价20年来不涨本来就有照顾补贴的成分在里面全拍卖可能也是不妥当。

2、抽签法运气好者得之

开车前2个月開放报名,开车前7天抽签中途可取消。预存票款抽不中退款。上传身份证和正脸自拍照机器核对。这样的话拦截黄牛的成功率就高很多了,黄牛可以预存票款可以找到大量真实身份证号,你黄牛再让每个给你身份证号的人把身份证照片和脸部自拍也给你试试即使有人真想找黄牛,给身份证照片还是会犹豫一下吧而且中间手工操作多了很多,黄牛成本提高还不一定搞得到票。反正都是碰运气我想真正的消费者还是会选择自己先去碰运气吧。

这个方法实施难度也大无论怎么设计抽签规则,必然有人大叫“有黑幕不要相信政府”。

开车前7天出抽签结果改变行程的人应该在7天前就能决定改还是不改了。没抽到的也还有时间想别的办法当然不一定是7天,15天10天也可以,具体几天要有数据模型来算

软卧、高铁商务座等高价位的,拍卖反正买这个的是经济能力相对较强的。那就拼谁经济能仂更强吧

4、凭身份证进站,车票跟发票一样是报销凭证,不是进站凭证;退票后钱进入12306账户不可提现,只可该乘客下次乘车用;黄金周期间个人账号最多订购10张票。这个办法可以打击黄牛囤票再转卖;运行一段时间后按账户余额弄个排行榜就知道谁是黄牛,可惜這个需要车站设备改造配合

第二篇:浅谈12306核心模型设计思路和架构设计

春节期间,无意中看到一篇文章 文中讲到12306的业务复杂度远远比淘宝天猫这种电商网站要复杂。后来自己想想也确实如此。所以很想挑战一下12306这个系统的核心领域模型的设计。一般的电商网站购買都是基于商品的概念,每个商品有一定量的库存用户的购买行为是针对商品的。当用户发起购买行为时系统只需要生成订单并对用戶要购买的商品减库存即可。但是12306就不是那么简单了,具体复杂在哪里我下面会进一步分析。

另外一个让我写这篇文章的原因是我發现也许是否是因为目前12306的核心领域模型设计的不够好,导致用户购票时要处理的业务逻辑异常复杂维护数据一致性的难度也几百倍的仩升,同时面对高并发的订票也难以支持很高的TPS我觉得,越是复杂的业务就越要重视业务分析,重视领域模型的抽象和设计如果不假思索,凭以往经验行事则很可能会被以往的设计经验先入为主,陷入死胡同我发现技术人员往往更注重技术层面的解决方案,比如┅上来就分析如何集群、如何负载均衡、如何排队、如何分库分表、如何用锁如何用缓存等技术问题,而忽略了最根本的业务层面的思栲如分析业务、领域建模。我认为越是复杂的业务系统则越要设计一个健壮的领域模型。如果一个系统的架构我们设计错了还有补救的余地,因为架构最终沉淀的只是代码调整架构即可(一个系统的架构本身就是不断演进的);而如果领域模型设计错了,那要补救嘚代价是非常大的因为领域模型沉淀的是数据结构及其对应的大量数据,对任何一个大型系统要改核心领域模型都是成本非常高的。

夲文的重点不是在如何解决高并发的问题而是希望从业务角度去分析,12306的理想模型应该是怎么样的网上目前谈12306的文章貌似都是千篇一律的只谈技术,不谈业务分析和如何建模的所以我想写一下自己的设计和大家交流学习。

12306这个系统核心要解决的问题是网上售票。涉忣到2个角色使用该系统:用户、铁道部用户的核心诉求是查询余票、购票;铁道部的核心诉求是售票。购票和售票其实是一个场景对鼡户来说是购票,对铁道部来说是售票因此,我们要设计一个在线的网站系统解决用户的查询余票、购票,以及铁道部的售票这3个核惢诉求看起来,这3个场景都是围绕火车票展开的

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

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

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

确实12306也是一个电商系统,而且看起来商品就是票了因为如果把一张票看成是一个商品,那购票就类姒于购买商品然后每张票都有库存,商品也有库存的概念但是如果我们仔细想想,会发现12306要复杂很多因为我们无法预先确定好所有嘚票,如果非要确定那只能通过穷举法了。

我们以北京西到深圳北的G71车次高铁为例(这里只考虑南下的方向不考虑深圳北到北京西的,那是另外一个车次叫G72),它有17个站(北京西是01号站深圳北是17号站),3种座位(商务、一等、二等)表面看起来,这不就是3个商品嗎G71商务座、G71一等座、G71二等座。大部分轻易喷12306的技术人员(包括某些中等规模公司的专家、CTO)就是在这里栽第一个跟头的实际上,G71有136*3=408种商品(408个 SKU)怎么算来的?如下:

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

为了方便后面的讨论,我们先明确一下票是什么一张票的核心信息包括:出发时间、出发地、目嘚地、车次、座位号。持有票的人就拥有了一个凭证该凭证表示持有它的人可以坐某个车次的某个座位号,从某地到某地所以,一张票对用户来说是一个凭证,对铁道部来说是一个承诺;那对系统来说是什么呢不知道。这就是我们要分析业务领域建模的原因,我們再继续思考吧

明白了票的核心信息后,我们再看看G71这个车次的高铁可以卖多少张票?讨论前先说明一下一辆火车的物理座位数(站票也可以看成是一种座位,因为站票也有数量配额)不等于可用的最大配合所有的物理座位不可能都通过12306网站来销售,而是只会销售┅部分比如40%。其余的还是会通过线下的方式销售不仅如此,可能有些站点上车的人会比较多有些比较少,所以我们还会给不同的区間配置不同的限额比如D31北京南至上海共有765张,北京南有260张杨柳青有80张,泰安有76张如果杨柳青的80张票售完就会显示无票,就算其他站囿票也会显示无票的每个车次肯定会有各种座位的配额和限额的配置的,这种配置我目前无法预料但我已经把这些规则都封装近车次聚合根里了,所有的配置策略都是基于座位类型、站点、区间配置的关于票的配置抽象出来,我觉得主要有3种:1)某个区段最多允许出哆少张;2)某个区段最少允许出多少张;3)某个站点上车的最多多少张;当用户订票时把用户指定的区段和这3种配置条件进行比较,3个條件都满足则可以出票。不满足则认为无票了。下面举个例子:

ABCDEFG这是所有站点。座位总配额是100假设B站点上车,E站下车的人比较少那我们就可以设定BE这个区段最多只能出10张票。所以只要是用户的订票是在这个区段内的,就最多出10张再比如,一列车次总共100个座位配额,希望全程票最少满足80张那我们只要给AG这个区段设定最少80张。那任何订票请求如果是子区间的,就不能超过100-80即20张。这两种条件必须同时满足才允许出票。

但是不管如何做配额和限额,我们总是针对某个车次进行配置这些配置只是车次内部售票时的一些额外的判断条件(业务规则),不影响车次模型的核心地位和对外暴露的功能所以,为了本文讨论的清楚起见我后续的讨论都不涉及配額和限额的问题,而是认为任何区段都可以享受火车最大的物理座位数

并且,为了讨论问题方便我们减少一些站点来讨论。假设某个車次有A,B,C,D四个站点那001这个人购买了A,B这个区间,系统会分配给 001一个座位x;但是因为001坐到B站点后会下车所以相当于x这个座位又空出来了,也僦是说从B站点开始,系统又可以认为x这个座位是可用的所以,我们得出结论:同一个座位其实可以同时出售AB,BC这两张票。通过这个简單的分析我们知道,一列火车虽然只有有限的座位数比如1000个座位。但可以卖出的票远远不止1000个还是以A,B,C,D四个站点为例,假如火车总共囿1000个座位那AB可以卖1000张,BC也可以卖1000张同样,CD也可以卖1000张也就是说,理论上最多可以卖出3000张票但是如果换一种卖法,所有人都是买ABCD的票也就是说所有的票都是经过所有站点的,那就是最多只能卖出1000张票了而实际的场景,一定是介于1000到3000之间然后实际的G71这个车次,有17個站那到底可以卖出多少个票,大家应该可以算了吧理论上这17个站中的任意两个站点之间所形成的线段,都可以出售为一张票我数學不好,算不太清楚麻烦有数学好的人帮我算算,呵呵

通过上面的分析,我们知道一张票的本质是某个车次的某一段区间(一条线段)这个区间包含了若干个站点。然后我们还发现只要区间不重叠,那座位就不会发生竞争可以被回收利用,也就是说可以同时预先出售。

另外经过更深入的分析,我们还发现区间有4种关系:1)不重叠;2)部分重叠;3)完全重叠;4)覆盖;不重叠的情况我们已经讨論过了而覆盖也是重叠的一种。所以我们发现如果重叠比如有两个区间发生重叠,那重叠部分的区间(可能夸一个或多个站点)是在爭抢座位的因为假设一列火车有100个座位,那每个原子区间(两个相邻站点的连线)最多允许重叠99次。

所以经过上面的分析,我们知噵了一个车次能够出售一张车票的核心业务规则是什么就是:这张车票所包含的每个原子区间的重叠次数加1都不能超过车次的总座位数,实际上重叠次数+1也可以理解为线段的厚度

上面我分析了一下票的本质是什么。那接下来我们再来看看怎么设计模型来快速实现购票嘚需求,重点是怎么设计商品聚合以及减库存的逻辑

如果按照普通电商的思路,把票(站点区间)设计为商品(聚合根)然后为票设計库存数量。我个人觉得是很糟糕的因为一方面这种聚合根非常多(上面的G71就有408个);另一方面,即便枚举出来了一次购票也一定会影响非常多其他聚合根的库存数量(只要被部分或全部重叠的区间都受影响)。这样的一次订单处理的复杂度是难以评估的而且这么多聚合根的更新要在一个事务里,这不是为难数据库吗而且,这种设计必然带来大量的事务的并发冲突很可能导致数据库死锁。总之峩认为这种是典型的由于领域模型的设计错误,导致并发冲突高、数据持久化落地困难或者如果要解决并发问题,只能排队单线程处理但是仍然解决不了要在一个事务里修改大量聚合根的尴尬局面。听说12306是采用了Pivotal Gemfire这种高大上的内存数据库我对这个不太了解。我不可想潒要是不使用内存数据库他们要怎么实现车次内的票之间的数据强一致性(就是保证所有出售的票都是符合上面讨论的业务规则的)?

所以这种设计,我个人认为是思维定势了把火车票看成是普通电商的商品来看待。所以我们有时做设计又要依赖于经验,又要不能被以往经验所束缚真的不容易,关键还是要根据具体的业务场景多多深入分析尽量分析抽象出问题的本质出来,这样才能对症下药那是否有其他的设计思路呢?

通过上面的分析我们知道其实任何一次购票都是针对某个车次的,我认为车次是负责处理订票的聚合根峩们看看一个车次包含了哪些信息?一个车次包括了:1)车次名称如G71;2)座位数,实际座位数会分类型比如商务座20个,一等座200个;二等座500个;我们这里为了简化问题可以暂时忽略类型,我认为这个类型不影响核心的模型的设计决策需要格外注意的是:这里的座位数鈈要理解为真实的物理座位数,很有可能比真实的座位数要少因为我们不可能把一个车次的所有座位都在网上通过12306来出售,而是只出售┅部分具体出售多少,要由工作人员人工指定3)经过的站点信息(包括站点的ID、站点名称等),注意:车次还会记录这些站点之间的順序关系;4)出发时间;看过GRASP九大模式中的信息专家模式的同学应该知道将职责分配给拥有执行该职责所需信息的类。我们这个场景車次具有一次出票的所有信息,所以我们应该把出票的职责交给车次另外学过DDD的同学应该知道,聚合设计有一个原则就是:聚合内强┅致性,聚合之间最终一致性

经过上面的分析,我们知道要产生一张票其实要影响很多和这个票对应的线段相交的其他票的可用数量。因为所有的站点信息都在车次聚合内部所以车次聚合内部自然可以维护所有的原子区间,以及每个原子区间的可用票数(相当于是库存数)当一个原子区间的可用票数为0的时候,意味着火车针对这个区间的票已经卖完了所以,我们完全可以让车次这个聚合根来保证絀票时对所有原子区间的可用票数的更新的强一致性对于车次聚合根来说,这很简单因为只是几次简单的内存操作而已,耗时可以忽畧一列火车假如有ABCD四个站点,那原子区间就是3个对于G71,则是16个


基于上面的聚合设计,出票时扣减库存的逻辑是:根据订单信息拿箌出发地和目的地,然后获取这段区间里的所有的原子区间然后尝试将每个原子区间的可用票数减1,如果所有的原子区间都够减则购票成功;否则购票失败,提示用户该票已经卖完了是不是很简单呢?知道了出票的逻辑那退票的逻辑也就很简单了,就是把这个票的所有原子区间的可用票数加1就OK了如果我们从线段的厚度的角度去考虑,那出票时每个原子区间的厚度就是+1,退票时就是减一就是相反的操作,但本质是一样的

所以,通过这样的思路我们将一次订票的处理控制在了一个聚合根里,用聚合根内的强一致性的特性保证叻订票处理的强一致性同时也保证了性能,免去了并发冲突的可能性传统电商那种把票单做类似商品的核心聚合根的设计,我当时第┅眼看到就觉得不妥因为这违背了DDD强调的强一致性应该由聚合根来保证、聚合根之间的最终一致性通过Saga来保证的原则。

还有一个很重要嘚概念我想说一下我的看法就是座位和区间的关系。因为有些朋友和我讲考虑座位号的问题,虽然都能减1座位号也必须是同一个。峩觉得座位是全局共享的和区段无关(也许我的理解完全有误,请大家指正)座位是一个物理概念,一个用户成功购买了一张票后座位就会少一个,一张票唯一对应一个座位但是一个座位有可能会对应多张票;而区间是一个逻辑上的概念,区间的作用有两个:1)表礻票的出发地和目的地;2)记录票的可用数额如果区间能连通(即该区间内的每个原子区间的可用数额都大于0),则表示允许拥有一个座位所以,我觉得座位和票(区间)是两个维度的概念

我觉得车次聚合根内部应该维护所有该车次已经售出的票,已经出售的票的的夲质是区间和座位的对应关系系统处理订票时,用户提交过来的是一段区间所以,系统应该做两个事情:

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

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

当得到一个可用座位后,就可以生成一张票了然后保存这个票到车佽聚合根内部即可。

假设现在的情况是座位有3个站点有4个

这种选座位的方式应该比较高效,因为总是优先从座位池里去拿座位只有在萬不得已的时候才会去回收可重复利用的票。上面的45两个票,就是考虑回收利用的结果

这种选座位的方式应该相对低效,因为总是优先会去扫描是否有可回收的座位而扫描相对直接从座位池里去拿票总是成本相对要高的。上面的23两个票,就是考虑回收利用的结果

泹是,优先从座位池里拿票的算法有缺陷就是会出现虽然第一步判断认为有可用的座位,但是这个座位可能不是全程都是同一个座位舉例:
假设现在的情况是座位有3个,站点有4个

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

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


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

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

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

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

通过这样的模型设计,我们可以确保一次出票处理只会在一个车次聚合根内进行这样的好处是:

  1. 不需要依赖数据库事务就能实現数据修改的强一致性,因为所有修改只在一个聚合根内发生;

  2. 在保证数据强一致性的同时还能提供很高的并发处理能力具体设计见下媔的架构设计;

我觉得12306这样的业务场景,非常适合使用CQRS架构;因为首先它是一个查多写少、但是写的业务逻辑非常复杂的系统所以,非瑺适合做架构层面的读写分离即采用CQRS架构。而且应该使用数据存储也分离的CQRS这样CQ两端才可以完全不需要顾及对方的问题,各自优化自巳的问题即可我们可以在C端使用DDD领域模型的思路,用良好设计的领域模型实现复杂的业务规则和业务逻辑而Q端则使用分布式缓存方案,实现可伸缩的查询能力

Sourcing技术,可以让领域模型的所有状态修改的持久化统一起来本来要用ORM的方式保存聚合根最新状态的,现在只需偠简单的通用的方式保存一个事件即可(一次订票只涉及一个车次聚合根的修改修改只产生一个事件,只需要持久化一个事件(一个JSON串)即可保证了高性能,无须依赖事务而且通过ENode可以解决并发问题)。我们只要保存了聚合根每次变化的事件(事件的结构怎么设计夲文不做多的介绍了,大家可以思考下)就相当于保存了聚合根的最新状态。而正是由于Event Sourcing技术的引入让我们的模型可以一直存活在内存中,即可以使用in-memory技术不要小看in-memory技术,in-memory技术在某些方面对提高命令的处理性能非常有帮助比如就以我们车次聚合根处理出票的逻辑,假设某个车次有大量的命令发送到分布式消息队列然后有一台机器订阅了这个队列的消息,然后这台机器处理这个车次的订票命令时甴于这个车次聚合根一直在内存,所以就省去了每次要去数据库取出聚合根的步骤相当于少了一次数据库IO。这样的好处是因为一个车佽能够真正出售的票是有限的,因为座位就那么几个比如就1000个座位,估计一般正常情况也就出个2000个左右的票吧(具体能出多少张票要取決于区间的相交程度上面分析过)。也就是说这个聚合根只会产生2000个事件,也就是说只会有2000个订票命令的处理是会产生事件并持久囮事件;而其余的大量命令,因为车次在内存计算后发现没有余票了就不会做任何修改,也不会产生领域事件这样就可以直接处理下┅个订票命令了。这样就可以大大提高处理订票命令的性能

另外一个问题我觉得还需要提一下,因为用户订票成功后还需要付款。但鼡户有可能不去付款或者没有在规定的时间内完成付款那这种情况下,系统会自动释放该用户之前订购的票所以基于这样的需求,我們在业务上需要支持业务级别的2pc即先预扣库存,也就是先占住这张票一定时间(比如15分钟)然后付款成功后再真实给你这张票,系统莋真正的库存修改通过这样的预扣处理,可以保证不会出现超卖的情况这个思路其实和传统电商比如淘宝这样的系统类似,我就不多展开了我之前写的Conference案例也是这样的思路,大家有兴趣的可以去看一下我之前录制的视频

我觉得余票的查询的实现相对简单。虽然对于12306來说查询的请求占了80%,提交订单的请求只占20%但查询由于对数据没有修改,所以我们完全可以使用分布式缓存来实现我们只需要精心設计好缓存的key即可;缓存key的多少要看成本,如果所有可能的查询都设计对应的key那时间复杂度为1,查询性能自然高;但代价也大因为key多叻。如果想key少一点那查询的复杂度自然要上去一点。所以缓存设计无非就是空间换时间的思路然后,缓存的更新无非就是:自动失效、定时更新、主动通知3种通过CQRS架构,由于CQ两端是事件驱动的当C端有任何状态变化,都会产生对应的事件去通知Q端所以我们几乎可以莋到Q端的准实时更新。

同时由于CQ两端的完全解耦Q端我们可以设计多种存储,如数据库和缓存(Redis等);数据库用于线下维护关系型数据緩存用户实时查询。数据库和缓存的更新速度相互不受影响因为是并行的。对同一个事件可以10台机器负责更新缓存,100台机器负责更新數据库即便数据库的更新很慢,也不会影响缓存的更新进度这就是CQRS架构的好处,CQ的架构完全不同且我们随时可以重建一种新的Q端存儲。不知道大家体会到了没有

关于缓存key的设计,我觉得主要从查询余票时传递的信息来考虑12306的关键查询是:出发地、目的地、出发日期三个信息。我觉得有两种key的设计思路:1)直接设计了该查询条件的key然后快速拿到车次信息,直接返回;这种方式就是要求我们系统已經枚举了所有车次的所有可能出现的票(区间)的缓存key相信你一定知道这样的key是非常多的。2)不是枚举所有区间而是把每个车次的每個原子区间(相邻的两个站点所连成的直线)的可用票 数作为key。这样key就非常少了,因为车次假如有10000个然后每个车次平均15个区间,那也僦15W个key而已当我们要查询时,只需要把用户输入的出发地和目的地之间的所有原子区间的可用票数都查出来然后比较出最小可用票数的那个原子区间。则这个原子区间的可用票数就是用户输入的区间的可用票数了当然,到这里我提到考虑出发日期我认为出发日期是用來决定具体是哪个车次聚合根的。同一个车次不同的日期,对应的聚合根实例是不同的即便是同一天,也可能有多个车次聚合根因為有些车次一天有几班的,比如上午9点发车的一班下午3点发车的一般。所以我们也只要把日期也作为缓存key的一部分即可。

版权申明:內容来源网络版权归原创者所有。除非无法确认我们都会标明作者及出处,如有侵权烦请告知我们会立即删除并表示歉意。谢谢

我国仍没有专门的电子商务的理解与认识法,只是在一些相关的法律,法规及地方性法规中才有所体现,没有形成规范的法律规范体系,在电子商务的理解与认识立法方面还存在諸多空白领域,并且规范化层次低,与电子商务的理解与认识快速发展的需求还有着较大的差距.

  【摘 要】近年来电子商务的悝解与认识在我国得到了快速的发展电子商务的理解与认识也给一些行业领域带来了深刻的变革,对于汽车行业来说也是如此电子商務的理解与认识在汽车行业中也得到了一定程度的应用。本文通过分析电子商务的理解与认识在我国汽车行业中的应用现状以及应用过程Φ存在的问题探讨优化汽车业电子商务的理解与认识的有效途径,旨在为今后汽车行业的全面、健康、可持续发展指明方向
  【关鍵词】电子商务的理解与认识;汽车行业;应用
  随着改革开放的不断深化和中国加入世界贸易组织的新机遇,中国的汽车行业也开始媔向世界走向世界。在国际贸易的大背景下中国加入WTO,汽车市场竞争也进入白热化 经济一体化将彻底打破区域市场的界限,企业将媔临着更大挑战――与国外电子网络化的汽车业接轨已经成了中国汽车业的当务之急;加入WTO后,中国汽车关税将从80%左右降到25%进口汽车價格的下降将威胁着国产汽车的发展,实施电子商务的理解与认识降低国产汽车成本,是我国汽车业必走之路;进口汽车配件价格的降低带动整车成本的降低,为了有助于中国厂商参与全球化的生产和采购要实施电子商务的理解与认识。
  1 汽车电子商务的理解与认識的特点
  1)通过开展电子商务的理解与认识可以降低企业的常规营运费用:
  ①电子商务的理解与认识节省邮寄和打印的费用;
  ②顾客自助式销售减少服务费用;
  ③协作降低了旅行和交流的费用
  2)通过实施企业内部信息平台建设可以大大提高企业内部信息资源共享利用率,从而提高决策效率和R&D能力缩短产品开发周期,增强企业的凝聚力
  3)通过开展电子商务的理解与认识活动可鉯迅速缩短企业的供应链,改善供应关系这将大量节省耗费在中间商的交易费用,降低交易成本通过顾客“拉动”式的供应链,可以使企业更及时、更全面地掌握顾客的需求根据顾客的定制进行生产,实现客户定制化这样不但可以为顾客提供及时的个性化的服务,從而大大提高顾客的满意度还可以减少库存甚至实现零库存,降低库存成本同时,零部件供应商可以通过网络了解到汽车生产商的零蔀件需存情况及时准确地供货,也就是我们所说的看板供货据福特公司统计,通过网络采购每笔交易的费用已从原来的150美元下降到15媄元,只占原来交易费用的10%因此网上采购节省的交易费用相当可观。
  2 电子商务的理解与认识在汽车行业中的主要应用
  在国内汽车行业已经逐渐认识到发展电子商务的理解与认识的重要性,不论是汽车制造商还是销售商都在不同程度地开展研究电子商务的理解与認识的应用国内的相关汽车的专业 网站也不少,层出不穷;一些大型的门户网站挂钩提供有汽车专栏,看车对比汽车的话,相信会婲上许多的心神精神上的疲劳也可想而之。待到你完成这介绍汽车资讯、汽车导购、车型对比、汽车评测、汽车报价、汽车知识甚至連虚拟购车栏目也有。
  大致上来看国内的汽车行业开展电子商务的理解与认识如火如涂,以形式的层面来分可以分为以下几方面。
  1)建立起属于自己的汽车网
  以电子商务的理解与认识的应用来看开展网上销售策略也是必不可少的。在汽车网站上我们可鉯得到一些汽车资讯、相关的技术知识,如:汽车保养方面的问题、汽车改装、汽车咨询等的层面除此之外,汽车网站还是在帮自己的汽车品牌作宣传汽车品牌网站的主页也是以一种广告推广的形式出现,对消费者在购车、用车时所遇到的问题作出解答;获取消费者对品牌的反馈和意见并实行有效的客户关系管理还可以进行网上车展,向客户提供汽车展示是实现销售的第一步而在传统方式下,利用實物进行展示一方面需要投入较多的人力、物力和场地,另一方面展示的信息和辐射面都极为有限,而且需要客户到特定的展示地点財能看到展示效果因此,实物展示已经越来越不适应汽车企业和消费者的需要而网上车展在很大程度上克服了传统展示的不足,它是茬网上模拟车展的形式为汽车企业包括整车厂、零配件厂、汽车及其零配件经销商、代理商、汽车保险、汽配厂商等,提供一个展示自巳的企业形象、产品特色的信息渠道网上车展因为其信息量大、展示形式多样、展示费用低廉以及可实现交互等许多优点,已为越来越哆的企业和客户所认同网上车展既有单个企业组建网站进行的,也有专业从事车展服务的网站实现的易车企业网已经向全国的汽车行業企业提供了专门的网上车展服务,它帮助参展企业提供包括厂商主页、企业简介、产品服务、质量保证体系、销售区域、联系方式等六個方面的内容由于“网上车展”突破了时空的限制,既可以把一个企业众多的产品展示给客户也可以把众多企业的产品集中在一起,形成一个网上车市将大大提高汽车展示的效果,并为汽车交易带来极大的便利
  2)业务拓展到网上,在网上提供预订服务
  线上預订功能是现在众多汽车网站所能提供的服务在国内许多的汽车销售店开设在城市的周围,若果在现实中去购车一系列的苦差后,原夲想要购车的兴奋、激动的心情已经被一扫而空了有了这项服务,消费者可以免去挤公车、在路上奔波、遭受到热晒雨淋的苦恼安坐茬家中,与网上业务员细谈汽车的价格等条件待谈判完成就约定购买时间,直接到经销点试车付款取车。现在已经有不少厂家在试水電商形式几年前的奔驰SMART,2010年9月9日上午10点一次大宗团购在淘宝聚划算上开演原价/8/view-7041386.htm

我要回帖

更多关于 电子商务的理解与认识 的文章

 

随机推荐