12306需求分析

             

需求簡述架構

12306這個系統,核心要解決的問題是網上售票。涉及到2個角色使用該系統:用戶、鐵道部。用戶的核心訴求是查詢餘票、購票;鐵道部的核心訴求是售票。購票和售票實際上是一個場景,對用戶來講是購票,對鐵道部來講是售票。所以,咱們要設計一個在線的網站系統,解決用戶的查詢餘票、購票,以及鐵道部的售票這3個核心訴求。看起來,這3個場景都是圍繞火車票展開的。網站

 

查詢餘票:用戶輸入出發地、目的地、出發日三個條件,查詢可能存在的車次,用戶能夠看到每一個車次通過的站點名稱,以及每種座位的餘票數量。架構設計

 

購票:購票分爲訂票和付款兩個階段,本文重點分析訂票的模型設計和實現思路。設計

 

其實還有不少其餘的需求,好比給不一樣的車次設定銷售座位數配額,以及不一樣的區段設置不一樣的限額。我以爲這個需求不是核心最重要的訴求,因此,本文針對這個需求不作具體討論,也不是本文分析設計的重點。get

 

需求分析數學

確實,12306也是一個電商系統,並且看起來商品就是票了。由於若是把一張票當作是一個商品,那購票就相似於購買商品,而後每張票都有庫存,商品也有庫存的概念。可是若是咱們仔細想一想,會發現12306要複雜不少,由於咱們沒法預先肯定好全部的票,若是非要肯定,那隻能經過窮舉法了。電商

咱們以北京西到深圳北的G71車次高鐵爲例(這裏只考慮南下的方向,不考慮深圳北到北京西的,那是另一個車次,叫G72),它有17個站(北京西是01號站,深圳北是17號站),3種座位(商務、一等、二等)。表面看起來,這不就是3個商品嗎?G71商務座、G71一等座、G71二等座。大部分輕易噴12306的技術人員(包括某些中等規模公司的專家、CTO)就是在這裏栽第一個跟頭的。配置

 

實際上,這個車次能夠賣的票是很是多的。爲了方便後面的討論,咱們先明確一下票是什麼?技術

 

一張票的核心信息包括:出發時間、出發地、目的地、車次、座位號。持有票的人就擁有了一個憑證,該憑證表示持有它的人能夠坐某個車次的某個座位號,從某地到某地。因此,一張票,對用戶來講是一個憑證,對鐵道部來講是一個承諾;那對系統來講是什麼呢?不知道。這就是咱們要分析業務,領域建模的緣由,咱們再繼續思考吧。qq

 

明白了票的核心信息後,咱們再看看G71這個車次的高鐵,能夠賣多少張票?

討論前先說明一下,一輛火車的物理座位數(站票也能夠當作是一種座位,由於站票也有數量配額)不等於可用的最大配合。全部的物理座位不可能都經過12306網站來銷售,而是隻會銷售一部分,好比40%。其他的仍是會經過線下的方式銷售。不只如此,可能有些站點上車的人會比較多,有些比較少,因此咱們還會給不一樣的區間配置不一樣的限額。好比D31北京南至上海共有765張,北京南有260張,楊柳青有80張,泰安有76張。若是楊柳青的80張票售完就會顯示無票,就算其餘站有票也會顯示無票的。無論如何配置限制區段的配額和限額,咱們老是針對車次進行配置,這點只是車次內部售票時的一些額外的判斷條件(業務規則),不影響車次模型的核心地位。因此,爲了本文討論的清楚起見,我後續的討論都不涉及配額和限額的問題,而是認爲任何區段均可以享受火車最大的物理座位數。

 

爲了討論問題方便,咱們減小一些站點來討論。假設某個車次有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也能夠理解爲線段的厚度。

 

來源淺談12306核心模型設計思路和架構設計

相關文章
相關標籤/搜索