導航:首頁 > 方案大全 > 網站訂票策劃方案

網站訂票策劃方案

發布時間:2021-09-13 18:42:25

A. 誰能幫我做一個電子商務網站策劃書,就是很普通的B2C,C2C,不需要太復雜

1、建設網站前的市場分析
(1)目前行業的市場分析(目前市場的情況調查分析、市場有什麼樣的特定和變化、目前是否能夠並適合在網際網路上開展業務。)
(2)市場的主要競爭者分析 (競爭對手上網情況及其網站規劃、功能作用等)
(3)公司自身條件分析 (包括公司概況、市場優勢,可以利用網站提升哪些競爭力,建設網站的能力――費用、技術、人力等。)
2、建設網站目的
(1)為什麼要建立網站。
(企業的需要還是市場開拓的延伸)
(2)網站功能
(根據公司的需要,確定網站的功能。)
(3)網站的目標
(確定網站應達到的目標和作用)
3、網站技術解決方案
根據網站的功能確定網站技術解決方案
(1)伺服器 ―― 自建、租用虛擬主機或主機託管
(2)操作系統 ―― UNIX,Linux還是Window 2000 Server / NT。 分析投入成本、功能開發、穩定性和安全性等。
(3)網站安全措施,防黑、防病毒方案
(4)相關程序開發 ―― 網頁程序ASP、JSP、CGI、資料庫程序等
4、網站內容規劃
(公司簡介、產品介紹、服務內容、價格信息、聯系方式、網上訂單、會員注冊、詳細的商品服務信息、信息搜索查詢、訂單確認、付款、個人信息保密措施、相關幫助等)
5、網頁設計
(1)網頁美術設計要求 ―― 色彩、圖片應用、版面規劃等
(2)制定網頁更新和改版計劃
6、網站維護
(1)伺服器及相關軟硬體的維護 ―― 對可能出現的問題進行評估,制定響應時間
(2)資料庫維護 - 數據管理、備份、災難恢復等
(3)內容維護 ―― 內容的更新、調整等
7、網站測試
在網站發布前要進行周密的測試,以保證正常瀏覽和使用
(1)伺服器 - 穩定性、安全性等
(2)程序、資料庫測試
(3)網頁兼容性測試 ―― 瀏覽器、解析度等
(4)其他測試
8、網站的發布與推廣
(1)發布的公關、廣告活動
(2)搜索引擎登記
(3)其他推廣活動
9、網站建設日程表
各項規劃任務的開始完成時間、負責人等
10、費用明細
各項事宜所需費用清單。

B. 網上訂機票流程

網上訂票流程其實很簡單: 登陸網上訂票系統(推薦用支付寶付款的網站,等你到達目的地後再確認付款,安全放心),然後用它們的機票信息查詢系統,一般可選擇出發城市,目的地城市,乘機時間等,然後查詢。
在查詢出來的結果後面選擇你要預訂的航班。預訂完了,可以直接用支付寶支付。也可以通過銀行轉賬,當然,用支付寶最好了!

C. 如何撰寫旅遊網站建設策劃書

一、網站定位

網站屬性:旅遊行業門戶網站

實現目標:專業大型、中型旅遊網站。網站具有旅遊信息咨詢交流版塊、旅遊B2C商務預訂版塊、旅遊B2B電子商務交易版塊或偏重其一,成為南昌及周邊最好的旅遊網站之一。

二、建站原則

1、以目的地為核心

旅遊資訊網站以目的地為核心的原則進行信息組織。信息內容的組織、網站的設計、信息的表現形式等都以旅遊目的地為核心。

2、以遊客為中心

網站遵循以遊客為中心的原則建設,信息的提供根據遊客的需求制定。把遊客放在服務對象的第一位,所有信息內容都以遊客的需求為第一需要。要做到條理清晰、能夠讓遊客快速查找到需要的信息。

3、旅遊描述的專業化

在組織旅遊信息內容時,涉及到旅遊專業詞彙時,要使用行業內的標准詞語,使旅遊信息更加規范化,專業化,從而提高信息查詢的便捷性。

4、檢索的便捷化

網站的信息之間、功能之間必須體現關聯性。要做到信息要素之間的關聯。信息內容的檢索要便捷,讓遊客迅速找到自己需要的信息。

5、增強遊客互動性

根據遊客的需求,提供人性化專業化的在線咨詢、留言板、在線投訴等線上服務,並做到及時解決、及時反饋。

網站欄目及功能

新聞發布管理、網站內容管理、酒店預訂管理、線路預訂管理、門票預訂、機票預訂、團購管理、商品銷售、廣告發布管理、友情鏈接、會員管理、旅遊論壇等多套系統,以及完善的強大的後台管理操作。

6、酒店價格管理系統

管理員可在後台添加、刪除、修改客房價格、客房簡介、配套設施與服務、房價、圖片等客房信息。後台做操作後,前台頁面會自動做相應的改動。 酒店會員注冊成功後自己也可以動態發布房型信息、房態等信息。

7、旅遊線路管理系統

管理員可在後台添加、刪除、修改線路信息、價格、服務、圖片等旅遊線路信息。後台做操作後,前台頁面會自動做相應的改動。 旅行社會員注冊成功後自己也可以動態發布線路信息。提供可靠的在線旅遊信息服務和在線預訂、客戶登錄 、信息查詢 、線路預訂 、更改預訂 、取消預訂 、旅行社管理和維護。?

8、門票預訂管理系統

管理員可在後台添加、刪除、修改旅遊景點門票信息、價格、圖片等旅遊景點信息。後台做操作後,前台頁面會自動做相應的改動。景區會員注冊成功後自己也可以動態發布景區新聞、圖片、門票信息。提供可靠的在線旅遊景點信息服務和在線門票預訂管理和維護。

D. 旅遊網站策劃方案書怎麼寫

旅遊網站策劃書範例
第一章 現狀與發展條件分析

一、 白雲區概況
白雲區是廣州市10個城區之一,因其境內有白雲山風景名勝區而得名。位於廣州市城區的北部,東鄰增城區市,西界南海市,南連荔灣、越秀、天河、黃埔等4個城區,北接花都區和從化市。全區面積1042.7平方公里,2000年末全區常住人口84萬,流動人口約90萬,行政區轄12個鎮,15條行政街。

白雲區地處北回歸線以南,陽光充足,雨量充沛,氣候溫和,屬亞熱帶海洋性氣候,年平均氣溫為21.8度,年均降雨量為1655毫米,境內兼具有多種地貌,東部和東北是丘陵地區,有廣州市(原八區)最高峰帽峰山(海拔534.7米)和著名的白雲山風景名勝區,山丘坡度平緩,林木茂盛,果樹如海,大小水庫山塘遍布,湖光山色。風景宜人。中部為廣花平原,西部是珠江水系,河網交織,珠江西航道,巴江河及流溪河流經境內,既得灌溉之便,更得航運之利,其中流溪河更是廣州市民主要的飲水源。

改革開放以來,白雲區憑借銳意進取的開拓精神、優越的區位和豐富的資源條件,經濟發展和社會各項事業均取得了令人矚目的成就。2000年,全區GDP127.53億元人民幣,比1995年翻了一番。產業結構進一步優化,農業經營從單家獨戶的分散經營,向龍頭帶動的集約經營轉變,產業化、集約化程度不斷提高。工業整體素質進一步提升,新一代企業群體逐步成長,成為新的經濟增長點和帶動經濟結構調整優化的主要力量。第三產業發展迅速,各類商貿專業市場不斷發展壯大,旅遊業、房地產、金融保險、信息中介等行業興旺發達,第三產業已成為國民經濟的骨幹。目前,全區三大產業比例為16:38:46。

二、 旅遊發展評價
(一)現狀評估
改革開放以來,伴隨全國和廣州市旅遊業的蓬勃發展,白雲區立足優越的區位、便利的交通、寬廣的地域空間和組合良好的旅遊資源等優勢,積極開拓旅遊業務,建設酒店賓館,開發景區景點,拓展旅遊市場,走上了旅遊發展之路.經過20多年的發展,尤其是"九五"時期的大發展,白雲區旅遊業從無到有,從小到大,初步形成旅遊產業體系,進入初步發展到加速發展的轉變時期。
1、旅遊接待設施日益完善,旅遊產業體系初步形成。
經過20多年的奮斗,白雲區旅遊業已經初步形成產業體系。標志是旅遊接待設施日益完善,旅遊產業規模逐步擴大,旅遊要素逐步發育。到2000年底,全區共有住宿設施195家,客房11000間,床位22000張,納入旅遊統計范圍的酒店80座,其中星級酒店15家。旅遊餐飲方面,隨著經濟及廣州市旅遊業的快速發展,區內餐飲資源得到利用,現有各類酒家、餐館網點2000家,較具規模和檔次的60家,其中定點餐館4家,近年形成的新廣從公路飲食長廊最具特色,該區域聚集了20多家上規模上檔次的特色餐館,成為"食在廣州"的旅遊強勢產品的組成部分。旅遊購物方面,隨著廣清路綜合批發市場、黃石路汽車汽配市場、梓元崗皮具市場、機場路化妝品市場等商業街和專業批發市場的建成,日漸形成獨具特色的旅遊消費市場。以南湖國家旅遊度假區、東方樂園和廣州新體育館、白雲山風景區為代表的眾多游樂場所,可滿足市民和遊客的娛樂要求.目前,全區"行、游、住、吃、購、娛"旅遊六要素基本配套,產業體系初步形成。
2、各類旅遊資源得到初步利用和開發,旅遊產品開發正在從觀光產品為主向觀光與休閑度假、生態相結合過渡。
改革開放以來,尤其是九十年代以來,白雲區逐步開發了以白雲山風景名勝區、南湖國家旅遊度假區、東方樂園、蘿崗香雪公園等為代表的一批具有一定知名度的旅遊景點和游樂場所,初步形成了具有一定特色的觀光、游樂和休閑度假的旅遊產品系列。農業生態旅遊項目也得到-定發展,並成為適應現代旅遊發展的特色旅遊產品,親親農庄,廣州綠田野生態教育中心、明興農業基地、廣州水果世界等,經過包裝和推介,已成為新的旅遊熱點。具有白雲區特色的山野蔬菜和田園風味等也逐漸發展成為吸引廣州市民及四方遊客的旅遊吸引物.尤其是近年,隨著雲台花園、雕塑公園、廣州新體育館,白雲山西側景觀帶等標志性工程的建成,廣州白雲山西線休閑帶已形成;
3、旅遊業務有了一定發展
相較於廣州中心城區各區,白雲區由於在花都、番禺撤市改區以前,區位相對偏北,不在廣州旅遊發展的核心區域內,在城市旅遊尤其是商務、會議旅遊等方面不佔優勢,但憑借廣州"山水城市"的代表和生態、水鄉的獨特優勢做文章,積極拓展觀光、度假、休閑和市民周末客源,使旅遊業務得到長足的發展,每年吸引了幾百萬的遊客到白雲區旅遊,成為廣州旅遊尤其是一日游的重要接待區域。
(二)存在的問題
1、旅遊業定位尚不明晰,發展方向沒有明確
改革開放以來,白雲區實施的是鞏固農業基礎地位、堅持商業是經濟發展的主要動力和外向帶動的發展戰略,相對而言,旅遊業基本處於自我發展狀態,地位偏低。應該說,近年來白雲區政府對旅遊業的發展是重視的,在《廣州市白雲區國民經濟和社會發展第十個五年十劃綱要》(草案)中,作為重要章節作了闡述,但對旅遊業在整個經濟社會發展中和第三產業中的地位和作用尚未作出明確的定位。這同當前的形勢是不相稱的,目前,全國很多省市,都將旅遊業作為新的經濟增長點或國民經濟的支柱產業,廣州市的其他區、市(縣級市)也將旅遊業擺在極其重要的位置加以發展。定位不明確,勢必影響到產業發展政策,行業管理職能和營造旅遊大環境相關措施的落實到位。
2、行業管理力量薄弱,管理工作滯後
缺乏行業管理人員和專業管理人才,這一問題是同前一問題緊密相聯的。由於旅遊業的地位沒有在白雲區經濟社會發展中得到恰如其分的確認,其管理機構的設置、行政管理人員的配備自然難以得到有效的保證。目前,承擔全區的旅遊市場管理、旅遊資源開發、旅遊線路組織、旅遊業務的開展等工作的僅有3人的編制,顯得力不從心。旅遊局是在商業局基礎上增設的一個部門,缺乏對旅遊全行業的管理權威,尤其是對旅遊市場和旅遊項目建設的宏觀調控缺乏力度,容易導致因缺乏規劃,失去監控而引發的布局失衡和資源開發的無序狀態等問題,造成資源、資金的浪費,妨礙旅遊業的良性發展,給整個經濟發展帶來不利影響。
3、豐富的旅遊資源尚未得到高效率的利用和開發,沒有形成有足夠影響力的拳頭產品,資源優勢沒有轉化成直接的經濟優勢。
白雲區的旅遊資源在廣州市10大城區中是較為豐富的區域之一,既有深具嶺南特色的自然景觀資源,又有多姿多彩的人文景觀資源,還有時尚流行的現代旅遊資源,如休閑度假、水鄉風情、農業生態等,但由於對旅遊資源的認識不足和定位不準,至今沒有形成在廣州旅遊市場占據較重要位置的拳頭產品。目前,白雲區的旅遊資源開發現狀是,白雲山成為廣州"山水城市"山的象徵,是廣州重點旅遊區域,但對整個白雲區旅遊市場的帶動作用不明顯;南湖國家旅遊度假區的建設進展較為緩慢,沒有對白雲區度假休閑產品開發起到期望中的示範效應;而豐富的水鄉風情、農業觀光和生態等旅遊資源的利用和開發尚處於初始期,沒有形成鮮明的個性。
因字數限制,詳細請看參考資料

E. 不就是一個訂票網站嗎 12306 的核心模型設計思路究竟復雜在哪裡

本文的重點不是在如何解決高並發的問題,而是希望從業務角度去分析,12306 的理想模型應該是怎麼樣的。網上目前談 12306 的文章貌似都是千篇一律的只談技術,不談業務分析和如何建模的。所以我想寫一下自己的設計和大家交流學習。

1、需求概述

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

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

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

其實還有很多其他的需求,比如給不同的車次設定銷售座位數配額,以及不同的區段設置不同的限額。但相比前面兩個需求來說,我覺得這個需求相對次要一些。

2、需求分析

確實,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 種:

某個區段最多允許出多少張;

某個區段最少允許出多少張;

某個站點上車的最多多少張。

當用戶訂票時,把用戶指定的區段和這 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 種關系:

不重疊;

部分重疊;

完全重疊;

覆蓋。

不重疊的情況我們已經討論過了,而覆蓋也是重疊的一種。所以我們發現如果重疊,比如有兩個區間發生重疊,那重疊部分的區間(可能誇一個或多個站點)是在爭搶座位的。因為假設一列火車有 100 個座位,那每個原子區間(兩個相鄰站點的連線),最多允許重疊 99 次。

所以,經過上面的分析,我們知道了一個車次能夠出售一張車票的核心業務規則是什麼?就是:這張車票所包含的每個原子區間的重疊次數加 1 都不能超過車次的總座位數,實際上重疊次數 +1 也可以理解為線段的厚度。

3、模型設計

上面我分析了一下票的本質是什麼。那接下來我們再來看看怎麼設計模型,來快速實現購票的需求,重點是怎麼設計商品聚合以及減庫存的邏輯。

傳統電商的思路

如果按照普通電商的思路,把票(站點區間)設計為商品(聚合根),然後為票設計庫存數量。我個人覺得是很糟糕的。因為一方面這種聚合根非常多(上面的 G71 就有 408 個);另一方面,即便枚舉出來了,一次購票也一定會影響非常多其他聚合根的庫存數量(只要被部分或全部重疊的區間都受影響)。這樣的一次訂單處理的復雜度是難以評估的。而且這么多聚合根的更新要在一個事務里,這不是為難資料庫嗎?而且,這種設計必然帶來大量的事務的並發沖突,很可能導致資料庫死鎖。

總之,我認為這種是典型的由於領域模型的設計錯誤,導致並發沖突高、數據持久化落地困難。或者如果要解決並發問題,只能排隊單線程處理,但是仍然解決不了要在一個事務里修改大量聚合根的尷尬局面。

聽說 12306 是採用了 Pivotal Gemfire 這種高大上的內存資料庫,我對這個不太了解。我不可想像要是不使用內存資料庫,他們要怎麼實現車次內的票之間的數據強一致性(就是保證所有出售的票都是符合上面討論的業務規則的)?所以,這種設計,我個人認為是思維定勢了,把火車票看成是普通電商的商品來看待。所以,我們有時做設計又要依賴於經驗,又要不能被以往經驗所束縛,真的不容易,關鍵還是要根據具體的業務場景多多深入分析,盡量分析抽象出問題的本質出來,這樣才能對症下葯。那是否有其他的設計思路呢?

我的思路

1、聚合設計

通過上面的分析我們知道,其實任何一次購票都是針對某個車次的,我認為車次是負責處理訂票的聚合根。我們看看一個車次包含了哪些信息?一個車次包括了:

車次名稱,如 G71;

座位數,實際座位數會分類型,比如商務座 20 個,一等座 200 個;二等座 500 個;我們這里為了簡化問題,可以暫時忽略類型,我認為這個類型不影響核心的模型的設計決策。需要格外注意的是:這里的座位數不要理解為真實的物理座位數,很有可能比真實的座位數要少。因為我們不可能把一個車次的所有座位都在網上通過 12306 來出售,而是只出售一部分,具體出售多少,要由工作人員人工指定。

經過的站點信息(包括站點的 ID、站點名稱等),注意:車次還會記錄這些站點之間的順序關系;

出發時間;看過 GRASP 九大模式中的信息專家模式的同學應該知道,將職責分配給擁有執行該職責所需信息的類。

我們這個場景,車次具有一次出票的所有信息,所以我們應該把出票的職責交給車次。另外學過 DDD 的同學應該知道,聚合設計有一個原則,就是:聚合內強一致性,聚合之間最終一致性。經過上面的分析,我們知道要產生一張票,其實要影響很多和這個票對應的線段相交的其他票的可用數量。因為所有的站點信息都在車次聚合內部,所以車次聚合內部自然可以維護所有的原子區間,以及每個原子區間的可用票數(相當於是庫存數)。當一個原子區間的可用票數為 0 的時候,意味著火車針對這個區間的票已經賣完了。所以,我們完全可以讓車次這個聚合根來保證出票時對所有原子區間的可用票數的更新的強一致性。對於車次聚合根來說,這很簡單,因為只是幾次簡單的內存操作而已,耗時可以忽略。一列火車假如有 ABCD 四個站點,那原子區間就是 3 個。對於 G71,則是 16 個。

2、怎麼判斷是否能出票?

基於上面的聚合設計,出票時扣減庫存的邏輯是:

根據訂單信息,拿到出發地和目的地,然後獲取這段區間里的所有的原子區間。然後嘗試將每個原子區間的可用票數減 1,如果所有的原子區間都夠減,則購票成功;否則購票失敗,提示用戶該票已經賣完了。是不是很簡單呢?知道了出票的邏輯,那退票的邏輯也就很簡單了,就是把這個票的所有原子區間的可用票數加 1 就 OK 了。如果我們從線段的厚度的角度去考慮,那出票時,每個原子區間的厚度就是 +1,退票時就是減一。就是相反的操作,但本質是一樣的。

所以,通過這樣的思路,我們將一次訂票的處理控制在了一個聚合根里,用聚合根內的強一致性的特性保證了訂票處理的強一致性,同時也保證了性能,免去了並發沖突的可能性。傳統電商那種把票單做類似商品的核心聚合根的設計,我當時第一眼看到就覺得不妥。因為這違背了 DDD 強調的強一致性應該由聚合根來保證、聚合根之間的最終一致性通過 Saga 來保證的原則。

還有一個很重要的概念我想說一下我的看法,就是座位和區間的關系。因為有些朋友和我講,考慮座位號的問題,雖然都能減 1,座位號也必須是同一個。我覺得座位是全局共享的,和區段無關(也許我的理解完全有誤,請大家指正)。座位是一個物理概念,一個用戶成功購買了一張票後,座位就會少一個,一張票唯一對應一個座位,但是一個座位有可能會對應多張票;而區間是一個邏輯上的概念,區間的作用有兩個:1)表示票的出發地和目的地;2)記錄票的可用數額。如果區間能連通(即該區間內的每個原子區間的可用數額都大於 0),則表示允許擁有一個座位。所以,我覺得座位和票(區間)是兩個維度的概念。

3、如何為票分配座位?

我覺得車次聚合根內部應該維護所有該車次已經售出的票,已經出售的票的的本質是區間和座位的對應關系。系統處理訂票時,用戶提交過來的是一段區間。所以,系統應該做兩個事情:

先根據區間去判斷是否有可用的座位;

如果有可用座位,則再通過演算法去選擇一個可用的座位;

當得到一個可用座位後,就可以生成一張票了,然後保存這個票到車次聚合根內部即可。下面舉個例子:

假設現在的情況是座位有 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 已經有人了。而通過優先回收利用的演算法,是沒這個問題的。

所以,從上面的分析我們也知道選座位的演算法該怎麼寫了,就是採用優先回收利用座位的演算法。我認為不管我們這里怎麼設計演算法,都不影響大局,因為這一切都只發生在車次聚合根內部,這就是預先設計好聚合根,明確出票職責在哪個對象上的好處。

4、模型分析總結

我認為票不是核心聚合根,票只是一次出票的結果,一個憑證而已。

12306 真正的核心聚合根應該是車次,車次具有出票的職責,一次出票具體做的事情有:

判斷是否可出票;

選擇可用的座位;

更新一次出票時所有原子區間的可用票數,用於判斷下次是否能出票;

維護所有已售出的票,用於為選擇可用座位提供依據。

通過這樣的模型設計,我們可以確保一次出票處理只會在一個車次聚合根內進行。這樣的好處是:

不需要依賴資料庫事務就能實現數據修改的強一致性,因為所有修改只在一個聚合根內發生;

在保證數據強一致性的同時還能提供很高的並發處理能力,具體設計見下面的架構設計。

4、架構設計

我覺得 12306 這樣的業務場景,非常適合使用 CQRS 架構;因為首先它是一個查多寫少、但是寫的業務邏輯非常復雜的系統。所以,非常適合做架構層面的讀寫分離,即採用 CQRS 架構。而且應該使用數據存儲也分離的 CQRS。這樣 CQ 兩端才可以完全不需要顧及對方的問題,各自優化自己的問題即可。我們可以在 C 端使用 DDD 領域模型的思路,用良好設計的領域模型實現復雜的業務規則和業務邏輯。而 Q 端則使用分布式緩存方案,實現可伸縮的查詢能力。

1、訂票的實現思路

同時藉助像 ENode 這樣的框架,我們可以實現 in-memory + Event Sourcing 的架構。Event Sourcing 技術,可以讓領域模型的所有狀態修改的持久化統一起來,本來要用 ORM 的方式保存聚合根最新狀態的,現在只需要簡單的通用的方式保存一個事件即可(一次訂票只涉及一個車次聚合根的修改,修改只產生一個事件,只需要持久化一個事件(一個 JSON 串)即可,保證了高性能,無須依賴事務,而且通過 ENode 可以解決並發問題)。

我們只要保存了聚合根每次變化的事件(事件的結構怎麼設計,本文不做多的介紹了,大家可以思考下),就相當於保存了聚合根的最新狀態。而正是由於 Event Sourcing 技術的引入,讓我們的模型可以一直存活在內存中,即可以使用 in-memory 技術。不要小看 in-memory 技術,in-memory 技術在某些方面對提高命令的處理性能非常有幫助。

比如就以我們車次聚合根處理出票的邏輯,假設某個車次有大量的命令發送到分布式消息隊列,然後有一台機器訂閱了這個隊列的消息,然後這台機器處理這個車次的訂票命令時,由於這個車次聚合根一直在內存,所以就省去了每次要去資料庫取出聚合根的步驟,相當於少了一次資料庫 IO。

這樣的好處是,因為一個車次能夠真正出售的票是有限的,因為座位就那麼幾個,比如就 1000 個座位,估計一般正常情況也就出個 2000 個左右的票吧(具體能出多少張票要取決於區間的相交程度,上面分析過)。也就是說,這個聚合根只會產生 2000 個事件,也就是說只會有 2000 個訂票命令的處理是會產生事件,並持久化事件;而其餘的大量命令,因為車次在內存計算後發現沒有餘票了,就不會做任何修改,也不會產生領域事件,這樣就可以直接處理下一個訂票命令了。這樣就可以大大提高處理訂票命令的性能。

另外一個問題我覺得還需要提一下,因為用戶訂票成功後,還需要付款。但用戶有可能不去付款或者沒有在規定的時間內完成付款。那這種情況下,系統會自動釋放該用戶之前訂購的票。所以基於這樣的需求,我們在業務上需要支持業務級別的 2pc。即先預扣庫存,也就是先佔住這張票一定時間(比如 15 分鍾),然後付款成功後再真實給你這張票,系統做真正的庫存修改。

通過這樣的預扣處理,可以保證不會出現超賣的情況。這個思路其實和傳統電商比如淘寶這樣的系統類似,我就不多展開了,我之前寫的 Conference 案例也是這樣的思路,大家有興趣的可以去看一下我之前錄制的視頻。

2、查詢余票的實現思路

我覺得余票的查詢的實現相對簡單。雖然對於 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 的設計思路:

直接設計了該查詢條件的 key,然後快速拿到車次信息,直接返回;這種方式就是要求我們系統已經枚舉了所有車次的所有可能出現的票(區間)的緩存 key,相信你一定知道這樣的 key 是非常多的。

不是枚舉所有區間,而是把每個車次的每個原子區間(相鄰的兩個站點所連成的直線)的可用票數作為 key。這樣,key 就非常少了,因為車次假如有 10000 個,然後每個車次平均 15 個區間,那也就 15W 個 key 而已。當我們要查詢時,只需要把用戶輸入的出發地和目的地之間的所有原子區間的可用票數都查出來,然後比較出最小可用票數的那個原子區間。則這個原子區間的可用票數就是用戶輸入的區間的可用票數了。當然,到這里我提到考慮出發日期。我認為出發日期是用來決定具體是哪個車次聚合根的。同一個車次,不同的日期,對應的聚合根實例是不同的,即便是同一天,也可能有多個車次聚合根,因為有些車次一天有幾班的,比如上午 9 點發車的一班,下午 3 點發車的一般。所以,我們也只要把日期也作為緩存 key 的一部分即可。

總結

本文完全是憑自己對 12306 這個網站的核心業務的簡單思考而得到的一些設計結果。如果真正的 DDD 領域建模,更多的是要和業務一線的工作人員、領域專家進行深入溝通,才能更深入的了解該領域內的業務知識,從而才能設計出更靠譜的領域模型和架構設計。

非常慚愧,我沒有上 12306 買過火車票,家離的比較近,就算要買也是家人給我買:)所以,本文所分享的內容難免是紙上談兵。但我覺得 12306 這個系統的業務確實比傳統的電商系統要復雜,且並發又這么高。所以,我覺得這個系統真的很值得大家重視模型的設計,而不只是只關注技術層面的實現。

F. 不就是一個訂票網站嗎,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),則表示允許擁有一個座位。所以,我覺得座位和票(區間)是兩個維度的概念。
如何為票分配座位
我覺得車次聚合根內部應該維護所有該車次已經售出的票,已經出售的票的的本質是區間和座位的對應關系。系統處理訂票時,用戶提交過來的是一段區間。所以,系統應該做兩個事情:
先根據區間去判斷是否有可用的座位;
如果有可用座位,則再通過演算法去選擇一個可用的座位;
當得到一個可用座位後,就可以生成一張票了,然後保存這個票到車次聚合根內部即可。下面舉個例子:
假設現在的情況是座位有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已經有人了。而通過優先回收利用的演算法,是沒這個問題的。
所以,從上面的分析我們也知道選座位的演算法該怎麼寫了,就是採用優先回收利用座位的演算法。我認為不管我們這里怎麼設計演算法,都不影響大局,因為這一切都只發生在車次聚合根內部,這就是預先設計好聚合根,明確出票職責在哪個對象上的好處。
模型分析總結
我認為票不是核心聚合根,票只是一次出票的結果,一個憑證而已。
12306真正的核心聚合根應該是車次,車次具有出票的職責,一次出票具體做的事情有:
判斷是否可出票;
選擇可用的座位;
更新一次出票時所有原子區間的可用票數,用於判斷下次是否能出票;
維護所有已售出的票,用於為選擇可用座位提供依據;
通過這樣的模型設計,我們可以確保一次出票處理只會在一個車次聚合根內進行。這樣的好處是:
不需要依賴資料庫事務就能實現數據修改的強一致性,因為所有修改只在一個聚合根內發生;
在保證數據強一致性的同時還能提供很高的並發處理能力,具體設計見下面的架構設計;
架構設計(非本文重點,沒興趣的朋友可以略過)
我覺得12306這樣的業務場景,非常適合使用CQRS架構;因為首先它是一個查多寫少、但是寫的業務邏輯非常復雜的系統。所以,非常適合做架構層面的讀寫分離,即採用CQRS架構。而且應該使用數據存儲也分離的CQRS。這樣CQ兩端才可以完全不需要顧及對方的問題,各自優化自己的問題即可。我們可以在C端使用DDD領域模型的思路,用良好設計的領域模型實現復雜的業務規則和業務邏輯。而Q端則使用分布式緩存方案,實現可伸縮的查詢能力。
訂票的實現思路
同時藉助像ENode這樣的框架,我們可以實現in-memory + Event Sourcing的架構。Event 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 的一部分即可。

G. 旅遊網站的策劃怎麼寫

一、客戶需求分析:
互聯網正在慢慢地改變生活,這已經不僅僅是概念的演繹,在生活工作的各個方面,都留下了互聯網的印記。旅遊業也不例外,據統計,網上旅遊業銷售額已經佔到全球電子商務銷售額的20%以上。隨著假日旅遊、自助旅遊、各種主題旅遊的興起,旅遊網站也煥發著春天般的氣息,一個好的網站對旅遊資源的宣傳和遊客出行計劃都有著積極的意義,讓遊客們有備而來、盡興而歸。通過網站開展相關旅遊資源的電子商務整合和旅遊資源的管理都將會是旅遊業不可迴避的現實。
二、網站功能和內容:
1、網站功能:
前台實現功能
(1)新用戶注冊
(2)密碼修改功能
(3)分類信息搜索
後台實現功能
(1)用戶注冊信息管理
(2)分類信息管理
1)、旅遊企業的旅遊產品能夠通過互聯網得到廣泛的、全面的宣傳,讓盡可能多的旅遊企業、旅遊者了解和熟知旅遊企業的產品以及產品特色,旅遊企業服務。
2)、能夠通過互聯網找到新的合作夥伴,拓寬市場銷售渠道。
3)、能夠通過網站和客戶之間達成直接交流,收集客戶意見。
4)、能夠為企業的旅遊產品提供直接銷售的空間,旅遊企業通過互聯網宣傳企業產品的過程中能夠直接接收到網上的遊客訂單。
5)、能夠幫助旅遊企業在具體業務過程中提供便利、快捷、實惠的信息;互聯網能夠充分體現網路優勢,幫助企業實現散客網上成團,即使散客不成團企業需要獨立操作時。
2、欄目架構
三、系統功能:
本公司開發人員擁有豐富的大型網站開發經驗,在網站建設方面擁有豐厚的底蘊和積累,在旅遊綜合信息建設、旅遊電子商務預訂、旅遊B2B電子商務平台建設方面均有自己獨特完整的解決方案。該系統主要包括:新聞發布系統、旅遊線路發布及預訂系統、遊客出遊意向詢價系統、在線散客拼團系統、電子雜志訂閱分發系統、電子郵件營銷系統、在線市場調查系統、統計系統、動態欄目更新、專業旅遊論壇系統、後台管理及許可權分配等。系統採用Browse/Server模式,既用戶端採用瀏覽器方式。
下面簡單介紹各子系統功能:
1、新聞發布系統
多欄目:可根據需要建立數個新聞欄目。
自動列出相關新聞:程序將自動將相關連的新聞顯示出來,方便瀏覽者。
關鍵詞功能:發布新聞時,可為每篇文章設定關鍵詞,使搜索更加准確,相關新聞相關性更好。
搜索功能:可以進行標題和時間搜索,讓用戶查找信息更加方便快捷。
自動更新功能:在發布/修改新聞後可以更新首頁或欄目首頁以反映最新新聞變化。
後台管理:可以新發布、修改、刪除新聞。
2、旅遊線路發布及預訂系統
後台管理功能:
方便地管理旅遊線路:輕松發布、修改、刪除旅遊線路,有標准發布和自定義發布兩種形式,自定義發布可以將你已經有的線路Word文檔直接上傳到網站上發布,界面設計精巧新穎。
方便地管理訂單:可方便的查看、修改、刪除、回復用戶訂單
方便地管理用戶資料:可對旅遊者進行會員制管理,保存會員的資料以便日後聯系
方便地推薦旅遊線路:可以設置、取消旅遊線路是否為推薦旅遊線路,推薦的旅遊線路優先顯示良好的完備查詢功能:可以查詢按地區、線路、價格、姓名等查詢旅遊線路資料或用戶資料。
前台預訂功能:
瀏覽功能:旅遊者可選擇旅遊線路進行瀏覽,了解旅遊線路的詳細情況,如天數、價格、景點、餐標、住宿、已包含的費用和未包含的費用等。
預訂功能:如果滿意的話即可預定該旅遊線路,填寫訂單。如果用戶對所有的線路都不滿意的話,可以自己填寫出遊意向,旅行社可根據用戶的要求提供個性化的服務。
會員注冊功能:本系統可作為會員系統使用,接受用戶注冊,本系統的用戶資料庫和線路預訂系統、網上訂票系統的資料庫為統一的一個庫,更加方便網站對用戶的管理。
3、遊客出遊意向詢價系統
遊客可將自己的出遊意向發布到網站上,由旅行社為其定製服務。後台可對其進行刪除操作。
4、在線散客拼團系統
包括:發布/維護拼團信息、線上報名拼團、後台管理程序。
發布拼團請求:旅行社會員發布自己的拼團線路和團隊計劃請其他同行前來參加拼團。
修改/刪除拼團請求:旅行社會員可以發布自己的拼團線路進行修改和刪除操作。
修改拼團計劃:旅行社在該團隊的動態出團/成團發生變化後,即時上網更新團隊狀況。
拼團需求(團隊詢價):如果用戶在拼團計劃中沒有查詢到符合自己要求的線路而自己手頭客源。可以發布自己的拼團需求進行團隊詢價。
5、電子雜志訂閱分發系統
電子雜志的創建、修改、發布、刪除、查詢、訂閱、退訂。
反垃圾郵件功能:訂閱電子雜志的用戶只需通過簡單的設置就能保證其它用戶以及電子雜志的發布者不能看到你的電子郵箱地址,即不會收到某些用戶通過本系統發給您的垃圾郵件。
用戶間互相傳遞消息功能:用戶可通過本系統向其他用戶和系統管理員發送短消息和電子郵件。
6、電子郵件營銷系統
電子郵件營銷的優點有:
便捷根本不用製作印刷品,也不用雇傭人力投遞。
成本低廉製作成本和發送成本都比傳統郵件低得多。
反饋率高電子郵件本身具有定向性,其使用的便捷性也會導致更高的反饋率。
7、在線市場調查系統
本系統支持單用戶版的網上投票,投票結果用條形圖或餅圖顯示。
可隨時修改已申請投票內容的主題與選項。
系統有防止一人投多票的功能。
投票引擎申請模塊支持多達八個選項的申請。
申請用戶可以自由選擇生成立體的餅圖或者條形圖來顯示投票結果。
引擎後台管理提供友好界面,管理員不需涉及任何編程,就可對資料庫內容進行修改。
管理員可以增加或刪除現有投票主題的各個選項。管理員可以直接刪除投票主題或增加新增投票主題的選項。
8、統計系統
我公司開發統計系統的優點有:
可以統計客戶的詳細來源。
可以鎖定客戶的來源區域及來訪次數。
統計真實IP,可以自定義統計時間。可以鎖定目標客戶的來源搜索引摯及所用關鍵詞。
提供數據的統計分析功能。
9、動態欄目更新
可以按不同的時期在頁面顯示不同的內容欄目頁,實現後台動態欄目更新。可以增設及修修欄目並為該欄目添加資訊信息。支持圖文並茂顯示。
10、後台管理及許可權分配
系統支持多人維護,可根據分工的不同分配不同的許可權。
支持數據安全備份。
統一資料庫,輕松維護網站。
11、專業旅遊論壇系統
本系統支持多人發言,可限制許可權等。
四、系統特點:
·先進性
該系統在設計上採用三層結構、WebService技術,使之在選用平台、採用技術上具有先進性、前瞻性、擴充性,從而保證建成的網站系統具有良好的穩定性、可擴展性和安全性。
·實用性
考慮到要盡量滿足業務功能需求的前提下,又要適應各業務角色的工作特點,該系統做到簡單、實用、人性化,實現了統一身份和資源管理、統一認證、統一內容管理、個性化界面和內容定製。
·可靠性
由於該系統用戶群比較復雜,所以建設的信息服務網站系統我們考慮了在建設平台上保證系統的可靠性和安全性。系統設計中,應有適量冗餘及其他保護措施,平台和應用軟體具有良好的容錯性、容災性等。
·開放性
在系統構架、採用技術、選用平台方面都有較好的開放性。特別是在選擇產品上,我們採用符合開放性要求,遵循國際標准化組織的技術標准,我們的產品既有自己的獨特優勢,又能與其他多家優秀的產品進行組合,共同構成一個開放的、易擴充的、穩定的、統一軟體的系統。
·可維護性
系統設計應標准化、規范化,按照分層設計,軟體構件化實現。採用軟體構件化的開發方式:一是系統結構分層,業務與實現分離,邏輯與數據分離;二是以統一的服務介面規范為核心,使用開放標准;三是構件語意描述形式化;四是提煉封裝構件規范化。
·可伸縮性
考慮到政務系統的網上業務建設是一個循序漸進、不斷擴充的過程,系統採用積木式結構,整體構架可以與原有系統進行無縫連接,為今後系統擴展和集成留有擴充餘量。
·可移植性
選擇開放的應用平台,建設一套與平台無關,以統一的服務介面規范和與各種資料庫相連的應用組件。
五、運行環境:
伺服器:Windows2003Server
資料庫:SQLServer2000
六、技術實現:
編程語言:伺服器端。Net,客戶端Javascript
頁面實現:DIV+CSS
應用技術:AJAX、RSS、XML等
七、網站功能和內容
1、網站功能:
前台實現功能
(1)新用戶注冊
(2)密碼修改功能
(3)分類信息搜索
後台實現功能
(1)用戶注冊信息管理
(2)分類信息管理
2、網站的內容規劃:
首頁導航條:美容、瘦身、養生、最新信息、留言板、關於我們、聯系我們、會員登錄等。
美容:提供各種健康美白、護膚、保養信息等。
瘦身:提供各種健康纖體、瘦身、保健信息等。
養生:提供四季生活養生信息。
最新信息:提供及時的新品信息。
留言板:為了更好的與網民交流,為了讓客戶在網路上有一個可交流的地方,我們打造一個網上交流的BBS論壇系統,使客戶與客戶,我們與客戶之間可以針對某一問題進行交流,從而增加網站的人氣。
關於我們:提供在網站購物相關的幫助信息。
聯系我們:利用E-mail客戶可以直接和我們聯系。
會員注冊、登陸系統:用戶可進行在線注冊,免費成為會員。注冊成會員後可以在網站的登錄位置進行登錄。
3、網站的目標和作用
網站要達到讓客戶了解我們網站的各種信息的目的,以及通過網路宣傳我們的網站,進一步實現盈利的目的。並且對網站進行推廣,促使客戶數目的增加。
4、網站技術解決方案
(1)操作系統
系統採用WinxpServer+IIS+SQLServer+APS作為平台,開發成本低、功能強大,完全滿足客戶需求,將客戶的理想轉化為現實。
(2)租用虛擬主機、個性化開發
(3)網站安全措施,防黑、防病毒方案
在設置口令的時候盡可能復雜,單純的英文或者數字很容易被暴力破解。某些系統服務功能有內建賬號,應及時修改操作系統內部賬號口令的預設設置,防止別人利用默認的密碼侵入系統。
我們還要時刻關注微軟官方站點發布的補丁程序。通常在微軟公司發現了某些有可能影響系統安全的漏洞之後,都會在它的官方網站中發布系統補丁,這時應該在第一時間中下載安裝最新的補丁,及時堵住系統漏洞。
使用Windows2000/XP過程中還需要經常查看系統日誌文件,因為這個文件會完整記錄一段時間之內所有的網路活動情況,通過查看系統日誌能夠得知是否有人對系統嘗試攻擊以及攻擊的結果,便於我們進行針對性的彌補。
最行之有效的網路安全防護手段就是安裝一款防火牆軟體。目前這種防火牆軟體很多,比如天網防火牆、NortonInternetFirewall、ZoneAlarm等,它們不僅可以防Ping、防止惡意連接,而且在遇到惡意攻擊的時候還會有獨特的警告信息來引起注意,並且把所有的入侵信息記錄下來。
(4)相關程序開發
我們使用網頁程序ASP、JSP等網頁技術來完善網站建設,並使用photoshop來修飾圖片。
5、網頁風格設計
網站的頁面設計:我們的網頁主要採用的是以粉紅色為主色調,淡紫色為輔助顏色,在此種顏色的基礎之上還要添加一些綠色為基調。總之主要的就是體現女性的青春活力,吸引更多的瀏覽者進入觀賞,並積極地進行討論。而且能讓他們在我們的網站上找到他們所要了解的知識,既要迅速又要快捷。
網站頁面製作先進技術應用:我們將採用先進的JAVE技術、VBScript等等來對所要進行的網站進行編程以及系統的設計。
內容風格:網站的內容時尚新穎,簡潔明朗,方便快速瀏覽,具有當今美容潮流的風格。我們所涉及的美容、瘦身、養生等知識能夠以最新的內容吸引留言者的觀賞,掌握最新的動態以及現今對於美容瘦身以及養生各種最新的討論和評價,使整體上感覺很真實,而不是一味的吹捧等。除此之外,我們還會在我們的網站上投放一些現當今比較流行的音樂,讓瀏覽者一邊聽著優美的音樂一邊觀賞我們的網頁,有種賞心悅目的感覺,給他們留下深刻的印象,以增加我們的訪問量。當然在以上的基礎之上,我們要把動態和靜態網頁做好。
6、網站維護
(1)資料庫維護
我們將對資料庫進行管理、備份、災難恢復。
(2)內容維護
我們會對網站的內容進行及時地更新和調整,並對新產品進行及時的發布
7、網站測試
在網站發布前我們會進行周密的測試,以保證正常瀏覽和使用。
(1)伺服器-穩定性、安全性等
(2)程序、資料庫測試
(3)網頁兼容性測試――瀏覽器、解析度等
(4)其他測試
8、網站的發布與推廣
(1)發布廣告
(2)搜索引擎登記
1)注冊3721網路實名,並可參考競價排名。
2)加入網路、Google等國內大型網站搜索引擎
(3)友情 鏈接
網站的友情鏈接系統可以與國內外的廣大化妝品網站聯系起來,讓我們了解別人,也讓別人了解我們,交換友情鏈接不但可以提高網站的訪問量,而且可以帶來無限的商機。鏈接的方式很多,我們採取文字與LOGO交換。文字簡便,LOGO圖片直接。
(4)其他推廣活動
1)在國內電子公告欄BBS發布信息
2)通過E-mail,向廣大網民發布網站信息
9、網站建設日程表
各項規劃任務的開始完成時間、負責人等。

閱讀全文

與網站訂票策劃方案相關的資料

熱點內容
培訓對標方案 瀏覽:503
c2c電子商務平台運作方式 瀏覽:681
傢具促銷活動經典廣告詞 瀏覽:267
深圳大象電子商務有限公司地址 瀏覽:242
景區超市營銷方案 瀏覽:267
北京吾愛吾買電子商務有限公司58 瀏覽:364
電子商務公司如何報稅 瀏覽:618
移動電源促銷方案 瀏覽:787
淄博電子商務創業園 瀏覽:384
天津濱海電子商務有限公司 瀏覽:120
開班教育培訓機構方案 瀏覽:564
幼兒全員培訓方案 瀏覽:535
大型促銷活動歌曲店鋪 瀏覽:768
歡樂谷六一兒童節廣告策劃方案範文 瀏覽:905
小型酒會主題策劃方案 瀏覽:154
魯班網電子商務平台官網 瀏覽:943
培訓機構中秋節線下活動方案 瀏覽:500
房地產促銷活動預算表 瀏覽:344
茶葉促銷活動預算表 瀏覽:703
小學畢業活動策劃方案 瀏覽:415