第378章【解決方案與報價】(2/2)
「最後是預扣庫存。從上面兩種方案的考慮,可以得出結論:只要創建訂單,就要頻繁操作資料庫IO。那麼有沒有一種不需要直接操作資料庫IO的解決方案呢?答案是有,就是預扣庫存,先扣除了庫存,保證不超賣,然後異步生成用戶訂單,這樣響應給用戶的速度會快很多。」
「那麼怎麼保證不少賣呢?用戶拿到了訂單,不支付怎麼辦?訂單都應該有效期,比如說用戶五分鐘內不支付,訂單就失效,就會加入新的庫存。訂單的生成是異步的,應該放到即時消費隊列中處理……」
劉副總聽的雲裡霧裡的,但是他發現羅晟和他帶來的幾個技術專家交流的愈發火熱,似乎也得出了一個信息。
找對人了!
這時,羅晟打開了房間裡的牆面上的大屏幕,他也拿來了一台筆記本工作電腦打開,示意眾人看向主投屏,自己一邊操作電腦一邊說道:
「Go語言原生為並發設計,我就採用Go語言給各位演示一下單機搶票的具體流程以及我優化後的解決方案。」
「Go包中的init函數先於main函數執行,也在這個階段主要做一些準備性質的工作。系統需要做的準備工作有:初始化本地庫存、初始化遠程redis存儲統一庫存的hash鍵值、初始化redis連結池。」
「另外還需要初始化一個大小為1的int類型chan,目的是實現分布式鎖的功能,也可以直接使用讀寫鎖或者使用redis等其他方式避免資源競爭,但是使用Channel更加高效,這就是Go語言的哲學,不需要通過共享內存來通信,而是通過通信來共享內存。Redis庫使用的是redigo,下面是代碼:
【
/localSpike包結構體定義
package localSpike
type LocalSpike struct {
LocalInStock int64
LocalSalesVolume int64
}
…
emoteSpike對hash結構的定義和redis連接池
package remoteSpike
/遠程訂單存儲健值
type RemoteSpikeKeys struct {
……
】
……
不知不覺,時間已經過去了一個半小時,反正劉副總是聽不懂,那些代碼看的暈頭轉向。
技術問題終於討論的差不多了。
鐵路集團的技術專家看向了劉副總並且帶著肯定的目光輕點了一下頭,劉副總立馬就明白了,果斷的轉投看向羅晟問道:「羅總,如果提供這麼一整套完善解決方案,報價是多少?」
羅晟直言:「每年支付10個億。」
劉副總聽到這個數字差點沒有一口老血噴出來,12306票務系統一期工程的預算也才3個億,這樣的報價簡直貴到難以接受。
……