12306 说:有时候,能排队也是一种幸福!
不知道大家發現一個現象沒有,無論 12306 網站崩潰成什么樣子,火車站售票大廳的售票窗口都是正常的!這說明什么呢?這說明鐵道部有個內部網絡, 12306 僅僅是個入口而已。如果我們把鐵路內部網比作信息的高速公路,12306 網站就是高速公路上的收費站。
?
說到高速公路,這兩天有很多新聞,據說很多高速公路入口處變成了停車場,有人在上面做操、有人遛狗、還有生孩子的、隨地大小便的、犯心臟病的等等等等,總之是一片混亂,崩潰!但是入口處再怎么亂,進入了高速公路,基本上還是比較順暢的。?
?
仔細看看竟然和12306的情況一摸一樣,12306 就是為了防止內部網絡癱瘓而設立的一道調度關卡,結果和高速公路一樣悲劇,都是內部順暢,入口處卡住了。
?
下面我們就把高速入口和12306看做一個問題,分析分析怎么解決:
?
方案一:拆分,每個車次都設立一個車票服務器。
?這個方案理論上絕對可以解決問題,但現實中根本不可能。想象一下,為全國任何兩個城市之間都建設一條單獨的高速公路,并設置單獨的出入口,當然不會擁堵了,但是可能嗎?就算不考慮成本問題,鐵路公路部門從管理運營其他方面考慮,也不會同意拆分的。
?
方案二:分布式,大緩存區。
?現在很多人都沒搞清楚問題的實質,一上來就是分布、緩存之類的。高速公路入口難道沒有分布嗎?難道沒有緩存區嗎?
先說分布式的問題:每個大城市上高速都不止一個入口吧,這應該是一種分布式處理吧?有人說入口不夠多,其實再多的入口也沒用,因為不管你分布多少入口,最終所有的流量還是要匯集到那么幾條主干道上去。只要流量是一瞬間大量出現的,最終還是會堵在某個地方,只不過變成了外面不堵里面堵而已。
再說緩存的問題:?每個高速入口處都有一個小廣場,停個百八十兩車沒問題,這不就是緩存區嗎?有人說緩存區不夠大,好吧,建個能停十萬輛車的廣場,再配套上醫院、飯店、旅館、公園之類的, 這個緩存區夠大了吧,有用嗎?入口處就那么幾個路政人員,他二十四小時不停地發卡,結果工作人員口吐白沫手抽筋了(請查找相關新聞),這是什么?這不就是系統崩潰了嗎?入口的處理能力有限,再大的緩存區又有什么用???
?
方案三:排隊
現在唯一的方法可能就是排隊了,但是傳統的排隊能解決問題嗎?人的耐心都是有限的,一般人等個二三十分鐘可能還行,如果讓你從日出等到日落,估計任何人都崩潰了。崩潰了怎么辦?有人就開始加塞搶道、有人直接上了應急車道、有人準備原地調頭,有一個人做就有兩個人做,然后就是一片混亂,緩存區徹底癱瘓了,進也進不去,出也出不來,所有人就塞在那里,動彈不得。和12306一摸一樣。在這樣一個人多、資源少、素質也不太高(比如說買一張票,幾十個人一塊刷)的環境中,傳統的排隊好像也不太現實。
?
思考題:火車站進站為什么很少崩潰?
?有一個問題不知道大家想過沒有,過年過節時候的火車站,也是檢票進站,那人山人海的,流量可比高速公路入口大多了,為什么火車站進站很少聽說有崩潰的?
秘密就在于火車票上面的那個發車時間!
比如你的車票發車時間是12:00,現在是8:00,時間還早,你不會堵在檢票口處死等吧!你可以先去網吧上上網、逛逛商店、吃個飯、會會網友之類的。等到時間到了,鬧鐘提醒你了,你再往火車站趕。
?
原先是幾十萬人依賴一個入口,現在是火車站和乘客都依賴一個發車時間,依賴反轉了。一旦反轉,就會發生很多變化:變化1:檢票系統對流量的處理就變被動為主動,原先是來多少就得處理多少;現在是通過調度,讓流量按照時間一波一波的來。
變化2:原先的緩存區僅僅只有候車大廳那么大一點;現在整個城市都是火車站的緩存區,只到登車前才進入候車大廳。
變化3:原先的侯檢、排隊是一種混亂的、無秩序的、讓人無法忍受的排隊;現在雖然也是一種排隊,但是是一種有秩序的、有調度的、體驗良好的排隊。?
?通過上面的分析,問題的癥結已經很清楚了:
1、內部網絡為了保證安全、穩定和統一調度,必須設置入口關卡;就像高速公路入口、火車站檢票口之類的。這一點無法改變!?
2、 入口的處理能力是有限的,而且只能一個一個放行,強度大了可能還會口吐白沫、手腳抽筋(系統崩潰)。這一點也是無法改變的。
3、入口對任務的處理是被動的,來多少就得處理多少,沒有調度,直到系統崩潰為止。這一點是唯一能夠改變的地方。
?
解決方案:依賴反轉
高速公路入口或者12306網站,他們作為入口之所以會經常癱瘓的原因就是上面的第三條:對任務的處理是被動的,來多少就得處理多少,沒有調度。
既然找到了問題所在,解決起來就比較簡單了。
?
先說高速公路的例子:
假如你和我兩個人明天都是要9:30上高速,按照原來的流程,我們兩個人會在高速公路入口處排隊,當然還有很多其他人。
現在, 我們提前一天將任務提交給高速公路管理部門,第二天9:05我收到短信,告訴我可以出發了;9:13分你收到短信,可以出發了。當然,時間可能不會像你要求的那么準確,但是絕對比大家都擠到入口處等待節省時間。
?
再說 12306 的例子:
上億次的請求被幾千臺外圍的服務器攔截處理以后,怎么辦?一塊向入口擠嗎?千萬不要!!
把所有的請求被緩存下來,然后就啥也不用管了。千萬不要向中央服務器提交,因為入口就那么幾個,主干道可能就那么一條道。
龐大的流量依賴幾個有限的資源,必然會造成混亂。
?
那怎么辦?依賴反轉啊!你們別來找我,我去找你們!中心服務器主動從外圍服務器上獲取請求數據,然后統一調度處理,處理完畢以后再通知用戶。
?
額外的好處:用戶再也不用找幾十個親戚朋友不停地刷新頁面了!
為什么?因為原先刷新頁面的目的是為了擠進入口去,刷的次數越多,進去的可能性越大。
現在,你刷多少次也沒用,你的數據只是被緩存起來,而不會被處理。什么時候處理,由中心服務器統一調度。?
秩序恢復了,體驗變好了,大家的素質看上去好像也提高了。
?
?其實,有時候,能排隊也是一種幸福!
?
?本文轉自左洸博客園博客,原文鏈接:http://www.cnblogs.com/myqiao/archive/2012/10/03/2710899.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的12306 说:有时候,能排队也是一种幸福!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [leetcode][math] Add
- 下一篇: python3 的 zip