iT邦幫忙

0

秒殺華航百張機票,身為軟件人員的我們該如何看待?

繼上次境管局當機事件之後
此次事件應可做為另一個研討的話題
http://news.pchome.com.tw/living/nownews/20090119/index-12323551546984562009.html

上次的題目較偏系統維運面
這次的題目較偏軟件設計面
請大家發表意見
尤其是軟件人員
不要再沉默了
不要再讓albertachen大說iT邦沒軟人(不是,是軟件人)了

如果不知道要發表什麼,可以試回答
1.如何控制170萬人次/秒的點擊而「只」賣出100張票?
2.如何處理170萬人次/秒的點擊而網站不掛點?
3.如何將網站伺服器的流量上線從5萬提高一倍為10萬?

至於「根本就是玩假的」這種非IT界的答案
留給海綿寶來講就可以了

看更多先前的討論...收起先前的討論...
wordsmith iT邦高手 1 級 ‧ 2009-01-20 16:25:03 檢舉
看來是IT謠言追追追系列
http://www.mobile01.com/topicdetail.php?f=37&t=907511&p=1 mobile01那邊也有相關的討論
glennlin iT邦研究生 4 級 ‧ 2009-01-20 18:14:16 檢舉
搞得好像在開樂透一樣
百萬分之一的幸運兒才開得了網頁訂票喔
Ruei iT邦研究生 1 級 ‧ 2009-02-10 00:14:20 檢舉
有種網路選課頁面大爆滿那種感覺吧,一進去卻發現課程已經滿額 囧
連假時訂台鐵火車票也是
nikwu43 iT邦好手 1 級 ‧ 2009-02-10 14:59:54 檢舉
感覺都會有保留票咧...
有一次我去買票的時候...
前面那位就拿出一張名片就買到有座位的票...
我買的時候剛好是有人退票我才有座位...
不然這下我可是要從台南站到台北咧...
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
28
jamesjan
iT邦高手 1 級 ‧ 2009-01-22 08:54:34
最佳解答

我是沒有參與訂票也沒有看相關的新聞報導

個人比較贊同 fillano 大的回答
就資料庫而言給定 sequencial 欄位或是 identity 欄位即可輕易抓取前 100 筆記錄

程式在進入的頁面上,設計先取得目前資料庫中已有多少筆記錄,超過 100 就就導向「謝謝再聯絡」的頁面,根本不會寫到資料庫。
如果同時間取得的筆數小於 100,那在submit之後由程式去控制,回應給程式的 nbr 超過 100,就導向「謝謝再聯絡」的頁面,這樣就能夠控制100張票,不需要 Lock不Lock Talbe或Transaction的問題,由資料庫自行 Handle 即可

要不要控制170萬人次/秒的點擊?我想華航本身或委包的廠商可能也沒有想過這個問題

而如何處理170萬人次/秒的點擊而網站不掛點?只要 Web Server 與其硬體等級夠強悍加上 load balance 機制去分流(不過前提是 load balance機器要能撐住),瞬間流量的問題,只要華航與 ISP 協調過,應該不是問題

就決定是你了, 去吧, 皮卡丘!

26
julie8tw
iT邦研究生 4 級 ‧ 2009-01-20 13:47:53

唉!這真的只跟軟體有關嗎?看得出來你真的跟IT槓上了

這答案...嗯...加油, 好嗎?

jamesjan iT邦高手 1 級 ‧ 2009-01-22 08:24:06 檢舉

嗯 小胖老師回答完了
接下來該換師太了...這個答案有點油...
說到師太
對了 達太安消失了

36
msit
iT邦高手 1 級 ‧ 2009-01-20 15:27:06

這件事情讓我想起Server 2008的上市發表會的實境秀
想必華航程式開發小組,沒有事先模擬網站被塞爆的情況;而硬體或模擬技術小組沒有馬上插上刀鋒或是利用Hiper-V提供新的站台服務頻寬。
結論就是,那只有在上市發表會會玩,現實環境,就讓他掛吧。
但是,秒殺一百多張票,只能說是神奇,有沒有買到的人出來說說他是如何中此樂透的。

我曾經用 JMeter(一套opensource的測試工具,有multithread功能) 對系統做壓力測試
結果測著測著
server 還沒掛
負責模擬發上萬 request 的 client 先掛了(out of memory) -_-|||

fillano iT邦超人 1 級 ‧ 2009-01-21 09:53:31 檢舉

通常也要五台十台的load generators才會產生足夠的壓力吧。

JMeter 是窮人用的 load generator
只要電腦夠力
可以在一部電腦上模擬上千個 HTTP Request 給server

36
echen688
iT邦高手 1 級 ‧ 2009-01-20 15:40:28

請設計線上遊戲的團隊來規劃華航的活動如何?來個百萬人圍城戰奪機票的遊戲好了...

看更多先前的回應...收起先前的回應...


我一直很佩服線上遊戲的系統架構
還有另一個行業的系統架構也能應付超大流量
就是要付費的「兩岸線上交友視訊語音交談平台」

rely1020 iT邦新手 4 級 ‧ 2009-01-21 08:28:08 檢舉

小弟寫過幾年程式,就試著回看看。
1.如何控制170萬人次/秒的點擊而「只」賣出100張票?
這一次只要資料庫有針對一個計數欄位作好 lock 控制就行了。

2.如何處理170萬人次/秒的點擊而網站不掛點?
基本上這問題無法由軟人來解,因為連入網站的部份是Web Service(IIS, Apache這類)負責的,這些Web Service都是事先準備好的,除非不用自已寫。主機還有週圍的網路設備組態當然也有關係也要耐操的。
軟人只能負責成功連入後的動作,軟人負責保證一個交易作業的完整性。

3.如何將網站伺服器的流量上線從5萬提高一倍為10萬?
上線數量也是網站的組態參數之一,數字上想調多少都行,只要硬體資源夠。

echen688 iT邦高手 1 級 ‧ 2009-01-21 11:33:58 檢舉

我也認為先天上的基礎建設就要有承受得起的能量才是根本...... 其他只是治標...

glennlin iT邦研究生 4 級 ‧ 2009-01-21 11:58:46 檢舉

其實線上遊戲的系統並沒那麼神奇
反而他們才是錢砸出來的
通常都是一台主機最多服務1w人數以下

echen688 iT邦高手 1 級 ‧ 2009-01-21 12:23:40 檢舉

所以, 換個角度想,要搞華航這種容易引來巨大流量來客數的行銷活動, 是不是也要投資一些錢來準備適當的設備才行?如果沒有的話, 事後被大家樵是必然的結果.......

鐵殼心 iT邦高手 1 級 ‧ 2009-01-22 08:53:59 檢舉

To 達太安
還有 cdfu 念念不忘的 X Online 也是要有能力應付超大流量需求的.

總裁 iT邦好手 1 級 ‧ 2009-01-22 17:04:40 檢舉

鐵大是要邀請達太安大大加入我們的X Online 團隊嗎??

鐵殼心 iT邦高手 1 級 ‧ 2009-01-22 18:05:01 檢舉

To Cdfu

達太安是 X Online 的守護神....

echen688 iT邦高手 1 級 ‧ 2009-01-23 10:19:13 檢舉

那有吉祥物或守護獸嗎?..... XD

44
vincent118
iT邦高手 5 級 ‧ 2009-01-20 16:03:46

"在訂票的午夜12點左右,華航網站創下瞬間170萬人次點擊"
1.如何控制170萬人次/秒的點擊而「只」賣出100張票?
2.如何處理170萬人次/秒的點擊而網站不掛點?
3.如何將網站伺服器的流量上線從5萬提高一倍為10萬?
我假裝很認真的討論這件事好了,先不討論軟體工程,我們從基礎建置開始。
瞬間170萬人次點擊,假設網頁的大小是100K(現在還有人做這樣小的網頁嗎?),瞬間的流量是1700000x100K=170000000K=17GB的流量換算成網路流量還要x8 = 136G bps的流量。
不知道華航的網站用哪一家的ISP,很讚!
136GB的流量假設有設備處理,後面的網頁伺服器不管是加速器或是主機,數量一定很可觀。我看不用到軟體設計,基礎建設就做不下去了。
我直接認輸,沒有能力。 汗........!
重申我沒有說"做假"這件事。

fillano iT邦超人 1 級 ‧ 2009-01-20 16:27:11 檢舉

所謂「點擊」,我想是submit後送出post動作,這個動作的資料量不大。要做比較準確的評估,我想需要考慮access送出post那一個網頁的人數跟送出post的人數,這會有一些不同。機器人訂票軟體也可能只送post的,不過要看華航的程式怎麼寫。不過我懷疑有人用機器人去訂票啦,不然想一下,怎麼有可能有170萬人去訂票?(跟國內人口比一比就會覺得有點誇張)

同意 fillano 大大所說
顯示的網頁大小和點下「傳送」鍵送出的資料(eg.身分證字號、訂位時間..)
大小差距蠻大的

36
careychen
iT邦研究生 5 級 ‧ 2009-01-20 16:51:47

小弟的看法是,瞬間要 170 萬人衝進去,這如 vincent118 守護神所說的,這…ISP 哪家有這個能力,所以小弟覺得…那應該是他們 MIS 的人回覆主管,在那段時間裡面 (Maybe 半個小時) 的人數流量。或是他們 MIS 把 Web Session 算成一個人頭,但通常一個 Web 畫面 Request 時,會造成很多的 Session 出現..

1.如何控制170萬人次/秒的點擊而「只」賣出100張票?
要達成只有一百人可以訂票,這用 SQL Server 本身的 Transcation 就可以達成了,資料庫在處理這方面還算強,畢竟也【只需處理一百筆】,雖然 Request 很多,但資料庫在一百筆完成後也沒有再做啥事了。

2.如何處理170萬人次/秒的點擊而網站不掛點?
不過多數網友都發生無法進入購票專區 (有這句話,網站的部份應該是有做分流處理),或是出現系統無法提供服務的訊息 (而這句話是指還未分流前就塞住的狀況)
所以要不掛點,只有加大叢集服務,做硬體分流才有機會

小弟的認知很淺,從這個事件,小弟覺得軟體面似乎還好,反倒是硬體的承載與分流反而是重點。

小弟也重申我沒有說"做假"這件事。但他們報的數據資料 170 萬人次是【多少時間內造成的】要看他們的 MIS 怎麼報給主管...

Transaction 只能保證「整個 Transaction 要嘛全做完,要嘛全不做」
我的疑問是
如果同一時間(非常小的差距)
有上萬個對相同資料表進行同一個 Transaction 的 request
那麼 Transaction 的機制還能正常運作嗎?
可不可能有 deadlock 的情形發生?

36
灌籃高手
iT邦高手 1 級 ‧ 2009-01-20 16:57:30

1.如何控制170萬人次/秒的點擊而「只」賣出100張票?
資料庫的stored procedure + transaction
2.如何處理170萬人次/秒的點擊而網站不掛點?
雲端運算,不過比較好奇1秒170萬人次是怎麼算出來的?是看apache log嗎?如果是webalizer裡面的hits,加上每個人開好幾個browser重覆reload,實際人次應該還要打好幾折
3.如何將網站伺服器的流量上線從5萬提高一倍為10萬?
雲端運算

看pchome的新聞,大多數的人被系統踢出來,應該只有極少數的人能進入系統執行訂票的動作

看更多先前的回應...收起先前的回應...

Stored Procedure + transaction
基本問題是
不管是 select 或 update 動作
「要不要 lock table」?
如果要lock, 則後面掛著一堆 request 在等著搶
如果不lock, 則大家一起送 Transaction, 那麼誰會先搶到?

echen688 iT邦高手 1 級 ‧ 2009-01-20 22:24:36 檢舉

Good point

我推 Google Adsense... 應該有人會誤按

old7ada iT邦研究生 2 級 ‧ 2009-01-21 09:59:46 檢舉

回應antijava 的說法,
筆者認為,不要用程式去lock table,交給 SQL 去做就好。
以MS SQL Server 2000 以後的版本,本身的機制來說,單筆資料的select & update 都不會lock table,只有update會lock column。要到lock table 必須有大量交錯的資料且在同一個table 被同一時間用到。

36
wulala
iT邦新手 5 級 ‧ 2009-01-20 18:46:26

網頁A:
前面100名的User,給予編號後直接導向另一台使用不同網路的Server(網頁B).
101名以後的,直接回覆"謝謝光臨,明天請早"
中間不使用資料庫或硬碟檔案.全部在記憶體處理.

網頁B:
判斷編號是否符合規則,進入訂票程序.

那100名User中間如果中斷或資料不完整, 算User自己棄權.
反正是賠錢賣,沒有真的達到100名完成訂票也沒關係.

看更多先前的回應...收起先前的回應...

重點在於那個「100」名的處理方式
一般直覺的想法是用個「變數 A」或「資料表裡的一個欄位」來存放
若真的這麼做
寫成類似這樣的碼
IF A < 100
THEN A=A+1 '訂到票處理
ELSE '訂不到票處理
那麼
萬一當A=1時
同一時間內有上千人都執行到 IF A<100 (成立)
接著上千人都會執行 A=A+1
結果就是
A = 1234
然後就得有人出面道歉了

symis iT邦新手 3 級 ‧ 2009-01-21 09:12:13 檢舉

這就好像抽號碼牌一樣,例如公司的業務系統,許多人同時在輸入新訂單,而單號是由系統自動編的流水號,請問,如何不讓單號重複?
另舉一例,SeedNet客服電話有個很不錯的系統,就是當客服電話滿線時,系統會回應,您現在等候的順序是第x位,讓我們很清楚知道現況!
...
由此可知,第1個問題的關鍵在於:如何讓系統可以一個接著一個循序的處理user的需求,而不是同時處理。

wulala iT邦新手 5 級 ‧ 2009-01-21 11:37:29 檢舉

變數A要用靜態變數,也就是每個User進來網頁A時,
網頁A都可以將變數A加1,
.
而且變數A必須要鎖執行緒,也就是不允許多個網頁A可以
同時存取變數A,一定要讓他們排隊.
因為要排隊,所以速度要夠快,因此不建議用資料庫欄位來模擬變數A,
.
網頁A轉給網頁B的號碼牌,要作簡單的加密,
例如( 序號10 + 32 -> 轉成ACSII字母 再插入幾個沒有意義的字母中)
網頁B進入訂票程序前,必須先驗證一下加密過的號碼牌是否正確.
.
加密的目的是要預防有人跳過網頁A,直接去網頁B.

網頁B一樣要禁止一樣的的號碼牌重複訂票,預防有人破解加密方式.

to symis
循序處理可以用queue做
不過在Web系統, 似乎很少人用 batch 方式去處理 online request

to wulala
靜態變數鎖執行緒?
在Web系統架構下做得到嗎?我不確定...

wulala iT邦新手 5 級 ‧ 2009-01-22 00:00:06 檢舉

to antijava
我只會.Net的說, 應該是可以.
請參閱 http://msdn.microsoft.com/zh-tw/library/94xkskdf.aspx
但很抱歉,我自己沒有去實作過. (哈, 緊酸~)

30
fillano
iT邦超人 1 級 ‧ 2009-01-21 10:26:04

我覺得最大的可能是,他們的系統也沒考慮那麼多(不管有沒有做lock、transaction、store procedure、cache、queue),反正就用最後存進資料庫裡面的資料做判斷,只取前一百筆,不管實際上是怎樣先來後到、或是在哪個環節拖到、伺服器的覆載是否均衡、線路覆載是否均衡等等。反正在系統裡做掉,沒人知道公不公平,他們自己也不知道。

這樣進來的request就拼命寫入資料庫,之後有沒有訂到,就讀取資料庫看看是第幾筆來判斷,中間過程一律不管,只看結果。(他們應該是用一個新的table等在那裡來處理這種特別的訂票吧?)資料沒寫入?中途負載過大?等等,那就明天再來。

38
tombo
iT邦高手 1 級 ‧ 2009-01-21 10:57:52

弟曾任職於某旅遊公司,該公司經常辦一元火車票啦,一元飛機票的活動。
這種活動會強烈衝擊Infrastructure,如果基礎不夠強壯,軟體再好都沒有用!

1.如何控制170萬人次/秒的點擊而「只」賣出100張票?
只要是夠強壯的SQL Database,要控制只賣100張票是輕而易舉。

2.如何處理170萬人次/秒的點擊而網站不掛點?
這個數值應該是Total的人次,而非Concurrent的Session,不過估算起來也是相當龐大的流量了。

以下八項的負載能力都必須仔細評估,而且必須平衡!
其中一個環節很強,但是某個環節很弱,整體還是很弱!

1.網站頻寬大小?
2.防火牆Concurrent Session Limit?
3.應用系統負載平衡設備的Concurrent Session Limit?
4.多台網站伺服器的負載能力?
5.多台應用伺服器的負載能力?
6.資料庫系統是否能夠承受如此大量的交易量?
7.SAN Storage I/O的速度?
8.Switch Performance是否足夠?

以上這些項目都是環環相扣,我想華航應該沒有做壓力測試吧!

3.如何將網站伺服器的流量上線從5萬提高一倍為10萬?
這個部份用軟體來做,還是得有適當的硬體來搭配。
此外花錢做好基礎建設,軟體就不用這麼費工,基礎還是很重要的!

"只要是夠強壯的SQL Database,要控制只賣100張票是輕而易舉。"

我想請教
什麼 SQL Database 才是夠強壯的
而又是如何可以輕而易舉?

鐵殼心 iT邦高手 1 級 ‧ 2009-01-22 08:57:55 檢舉

程式裡面加一行

IF 身分證字號 不等於 某一組字串 THEN 下一位

就可以了吧

22
pantc328
iT邦高手 1 級 ‧ 2009-01-21 11:45:08

170萬/次! 以我程設師的立場看待,這是不可能的,怎麼算機票/位不可能那麼多.以台灣環境來看,訂票需求量也不可能那麼大.一天用線上訂票方式有辦法到幾萬張就不錯了.所以這應該是網站遭受攻擊.所以要請網管去分析流量來源,在去找因應對策,而不是頻寬不足,買頻寬,硬碟不足買硬碟的方式,這樣根本不能解決問題.

我想華航不會為了這種偶一為之的行銷情況而去做什麼系統大翻修
更何況
這也不是我想問的主題

22
nikwu43
iT邦好手 1 級 ‧ 2009-01-21 23:01:04

感覺是有人用連點程式吧...
或是用按鍵精靈規則寫好一直點...
170萬人次咧...
真正的想要去買人的人不多吧...
比較多的是圖利者吧...

jamesjan iT邦高手 1 級 ‧ 2009-01-22 08:20:05 檢舉

我比較好奇的是
如果華航的登錄網頁是時間到了才顯示出來
這樣程式可以在一秒鐘之內寫完嗎?

nikwu43 iT邦好手 1 級 ‧ 2009-01-22 13:00:05 檢舉

如果是這些圖利者的話...
網站上需要什麼資料他們大概都知道...
按鍵精靈是可以一次寫很多規則的...
他只要先KEY好...
在大家都在慢慢KEY的時候...
圖利者早就不知道已經跑到那個頁面了...

26
bestlong
iT邦研究生 4 級 ‧ 2009-01-23 10:51:38

為了短暫有限的銷售商品提供大量的服務資源,本來就不是合理的行為。因為投入成本不會大於預計收入,所以就算事先知道一定會爆量也不會採取大幅的改善行動。

基本上這類具有爆量特質的網路銷售活動,本就不應該在標準系統上採取定時開始搶奪的模式,因為資源的有限性是很難避免的。

頻寬、硬體、軟體等方面不外乎就是尋求加大、加快、分散負載來解決。已經有很多人回應解決方式,但是應付短期需求你能夠投入多少。

要迴避機器人軟體的問題,不要在標準系統上處理,應建立新介面且越晚發佈越好。

時間分離也是解決方向,所以建議採用其他的銷售模式例如先登記後抽籤或者是競標來分散流量。不過這要企畫人員能夠理解接受才行。

jamesjan iT邦高手 1 級 ‧ 2009-01-23 11:16:21 檢舉

能拋棄技術的禁錮,尋求合理/合宜的解決方案
這是許多IT人所欠缺的 b

另一方面,就勁爆度而言
華航這樣的作法,也滿足了免費廣告與媒體版面的需求
媒體公佈的數字真的看看就好

echen688 iT邦高手 1 級 ‧ 2009-01-23 11:39:57 檢舉

bestlong 說得很好, 這其實突顯了許多企業組織商業運作背後的一個老問題: 行銷企畫人員與 IT 部門是否有進行事前良好的溝通與協調?

如果沒有或不足, 很容易就變成一場行銷與公關的災難,其實純然是因為不了解IT技術與資源可能的瓶頸、限制與其可能的後果,例如這一次的事件。

這是我個人的看法。

我要發表回答

立即登入回答