天天看點

基于空間資料庫MongoDB實作全國電影票預定系統

受到中文社群《電商參考架構第二部分:庫存優化方法》啟發,想到了去年做過類似的電影票預定系統,如果用mongodb去做存儲支撐,那應該是怎樣架構的呢?本文的目的是為了更好的學習掌握mongodb,是以某些設計上更偏向于功能的展示,在實際使用上要因地制宜的改變,合适才是最好的。

電影票預定系統與電商系統非常類似,都可以抽象了解為商品的售賣。進一步的講電影票系統是電商系統的一個庫存特例場景:

每個場次,每個座位,都隻有一個庫存

每個訂單所預定的座位有鎖定狀态,在支付前對應的作為不能被再次購買

訂單涉及到的座位要不全成功,要不全失敗

“全國”級的,資料容量不是太大問題,但性能上要支援水準擴充

ps:實際上的理論tps并不高,目前全國5000家影院,假設平均8個影廳,每個廳200個位置,每個影廳6個場次,早中晚各3個高峰,每個高峰1個小時。計算得出tps大概是:5000 8 6 * 200/ 3 / 3600 = 4400 tps;但是設計上我們還是要保證性能的可水準擴充,否則怎麼展現mongodb的特色呢?^-^

儲存最基本的影院資訊,包括地理資訊,名稱,_id為mongodb由mongodb自動配置設定

cinemamanager.cinema_detail

例如:

因為影院資訊的查詢一般都是按照城市和名稱,或者地理坐标檢索,是以這裡建立兩個索引

index1:城市+名稱的複合索引,因為查詢電影院時一般都會指定城市名

注意,這裡使用的是複合索引,是以針對 city + name的查詢,或者city的查詢是有效的,隻查找name字段是無法通過索引優化的。

index2:地理坐标索引,用來應付"最近的電影院"類查詢

例如,查詢在杭州最近的某個電影院

theater_detail.cinema_id與cinema_detail._id集合形成references關系,通過cinema_detail._id可以快速找到所屬影廳的資訊。另一個關鍵字段theater_detail.seat用來描述座位資訊,每排所有的座位是一個數組,不同排可以有不同數量的座位。

cinemamanager.theater_detail

建立索引

影片說明

索引

放映資訊包含放映時間段,放映影廳,票價。雖然document結構可以做複雜的嵌套,但原則上期望document盡量小,利用資料shard,性能優化。是以在movie_schedule的設計上每個影片的每場放映獨立一個document表達。

movie_schedule的references關系較多,需要與電影院,影廳,電影三者分别建立關系。

還是建立一個複合索引,優化查詢某一電影院的某部影片(的某一影廳)上映資訊

ps:也可以建立相應的索引,用來優化某一時間段内的影片資訊查詢,讀者自行思考

至此,基本的資訊文檔集合均已建立完成,一般的查詢需求都可以滿足了。接下來是重點:庫存售賣系統。抽象的來看,售賣系統就是對上訴所有集合的一個整合,外加一套庫存字段。我們認為一場放映就是一個主商品,每個座位可以認為是這個商品的sku,每個sku都是1份。

通過reference關系結合movie_schedule與theater_detail,注意這裡引用了

注意,這裡不僅僅是reference的引用關系,還複制了theater_detail.seat字段,每個seat都有一個庫存數字,因為在mongodb中一個document的操作是可以保證原子的,不需要對collection加任何鎖。數字2并不是表示可以賣2次:

數字2表示,可銷售

數字1表示,已鎖定

數字0表示,已售完

交易邏輯上可通過findandmodify + $inc,原子性的修改庫存資訊。其他的描述資訊是否需要再次備援取決于具體的業務狀況了,具體問題具體分析。我本人更傾向于目前的資料結構方案,不做過多的備援,原因:

資料訂正複雜,多一個備援,多一份複雜

其他資訊基本都是靜态資料,資料量又小,完全可以通過cache技術解決讀取問題

先插入一個我們的商品

鎖定座位的動作,鎖定第4排的3号位置(從1開始計數)和鎖定第4排的2号位置:

分别鎖定了第4排3号(row4[2]),第4排2号(row4[1]),

注意,這裡是分兩次鎖定的,鎖定操作并不需要原子完成,否則會造成使用者鎖定失敗機率的上升。

ok,交易成功以此類推,同時修改兩個庫存到0,這裡利用了findandmodify的原子特性

再查下集合看看:

一套全國級的電影票系統會比這複雜的多,本文的目的還是以教程為主,主要是說明mongodb如何建構一個電影票系統,但距離生長系統還是有一定的距離,仍有很多其他的技術點需要讨論,可以延伸開的還有,下單失敗,過期未付款,資料唯一性等問題。