精華區beta Programming 關於我們 聯絡資訊
==> 在 SmallBee.bbs@binary.csie.ncu.edu.tw (喵~~~ 的文章中提到: > 其實這種東西一定早就有寫好的了 > 訂票系統又不是第一次出現... > 在我的想法裡, 我認定所有訂票機器都是固定的 > 也因此,每一台訂票機都擁有一個唯一識別碼 > 流程1 > 讀取空位, 這個動作由訂票機直接向資料庫請求完整的空位資料 > 在使用者確認的過程中, 訂票機以一定不影響系統效能的頻率確認空位還空著 > 流程2 > 使用者下訂單, 此時不是直接寫入資料庫, 而是向一個唯一服務程式送出空位註冊 > 該服務程式使用UDP+CRC Check+單執行緒確保不會有兩個請求同時到達 > 資料內容包含訂票機識別號碼 > 由於只有唯一的程式負責寫入訂位, 自然沒有重複畫位問題 "唯一的服務程式" 並不能解決一位多賣的問題. 去年在"非科班出身的人有辦法走Programer這條路嗎", 我就提出 這種高鐵一位多賣的問題, 很不幸地高鐵真的有這樣的問題, 而且 信譽受損. ;比如資料庫裡某個產品剩餘 m 個, 我們打算取出 n 個, 若庫存量不 ;足則 print error message, 否則把剩餘量減 n 再存回資料庫。 ;如果這是多人多工系統, 一般沒受過良好訓練的 programmer ;在某些狀況下即使庫存量不足也會讓 user 取出 n 個。這就是 ;bug, 而這 bug 一般自己測試測不出來, 只有在流量大的時候會 ;發生, 流量大的時候可能公司忙得不可開交卻要撥人力來處理這 ;種問題, 而且公司聲譽可能大受影響。這問題我所見過的 programmer ;有下面幾種處理: ;1. 根本不知有這種問題(這最可怕, 他的程式好像不知哪裡埋了地雷) ;2. 知道有這問題, 但程式不處理, 因為覺得機率太小 ;3. 知道有這問題, 會想辦法多加程式碼處理, 但問題還是存在 ;4. 從一開始就知道這問題, 而且用正確的寫法寫, 所以沒這 bug。 這在計算機科系是常識, 四年的課程裡常會提到這樣的問題. 解決的方法不是用程式技巧, 而是系統要提供解決這程問題的機制, 因為用程式技巧通常可以減少發生的機率, 但不能徹底解決. 高鐵 的售票系統如果是用資料庫, 那麼在資料庫系統裡就有 lock 的機 制可以解決這種問題. > 流程3 > 訂票機自行向資料庫確認定位是否成功, 藉由確認該空位的註冊者是不是自己 > 流程4 > 若失敗, 回到流程1 > 若成功, 但使用者放棄付款, 則刪除空位註冊資料 > 若成功, 且付款成功, 則向資料庫寫入完整定位資訊 > ======================= > 其實高鐵總共也才(19(北上)+19(南下))*6(站間)*(923(標準)+66(商務))=225492 > 要紀錄所有空位資料才880KB(我相信訂票機不會超過1023台...) > 這種大小連資料庫都不需要動用, 直接作成矩陣就好... -- * Origin: ★ 交通大學資訊科學系 BBS ★ <bbs.cis.nctu.edu.tw: 140.113.23.3>