12306訂票助手插件拖垮GitHub事件的緣由
事件起因
春節臨近,12306訂票難的問題再一次被引向風口浪尖。而這一次,各家瀏覽器廠商不失時機的推出了“春節專版”。這些林林總總瀏覽器的共同特點,是集成了一位網友iFish(木魚)的“訂票助手”插件。
不湊巧的是,這個插件的早期版本使用GitHub的Raw File服務作為CDN,并對返回403錯誤代碼的請求使用非常暴力的5秒重試。于是,在1月15日的時候,第一個訂票小高峰到來的時候,GitHub被間接的DDos。
GitHub的運維工程師Jesse Newland在發現服務器負載異常之后,不得不禁用了這個代碼所在Repo的Raw服務,并在Repo里報告了一個issue —— 他發現12306引用了這個Repo里的一個資源,由于訪問量巨大,這個資源對GitHub的服務產生了負面的影響,希望有人可以聯系到12306的工程師去除這個引用。
身在大洋彼岸的GitHub工程師在解決了GitHub的服務問題之余,顯然不太清楚中國的兩點情況:
- 春運是什么,12306是什么
- 12306的工程師是不可能被聯系到的
大家疑問
大家的質疑,存在于兩點:
- 為什么一個瀏覽器插件需要從GitHub引用資源?
- GitHub的負載能力這么弱嗎?
疑難解釋
第一個問題,還是讓插件作者木魚自己來解釋:
引入自動更新。
由于12306訂票助手是個很特殊的東西,依賴于鐵道部的網站而存,并且其運行極度依賴網站本身的功能以及頁面結構,所以隨著鐵道部的改進,很容易失效(雖然他們的前臺樣子從開始到現在,一年多了幾乎就沒變過……他喵的為什么我又要用年做單位說時間,真傷心)。因此為了保證功能的正常,訂票助手在很早的版本開始就引入了自動更新機制(1.4開始)。最開始的更新都是放在自己網站上的,并且區分了Firefox和Chrome。 最初的助手是以UserScript的模式出現的,調試在Firefox下調試。在Firefox下時,Scriptish提供了支持跨域的GMxmlHttpRequest功能,可以直接用ajax訪問我的網站。但是在Chrome下,則沒有這樣的便利,不支持跨域ajax,所以用的是引入script腳本的方式檢測更新。在后來Firefox和Chrome分支完全合并后(最開始針對不同的瀏覽器分離的,后來發現同步實在太麻煩了),舍棄了一些特異的功能(如GMxmlHttpRequest),為一些功能做了適配(如桌面通知),更新也就用下來了。 但是后來不知道什么時候開始,這個更新機制突然失效了。為啥呢,這要從另一件事開始說起。 那就是12306的HTTPS。 作為一個日點擊14億的網站,網宿科技的CDN還是很給力的,根據我收集到的資料,其加速節點上百個。但是,作為一個訂票的網站又要CDN的,為什么會用HTTPS協議還是一個自簽發的根證書,實在太讓人費解。任何一個了解網絡知識的人都知道,HTTPS協議下服務器的負載能力要比HTTP的低很多,何況訂票又不是什么機密的數據。 總會有人跳腳出來說訂票啊多機密,我總是很反對,哪門機密了,車次還是余票數據? 這個HTTPS帶來了很大的麻煩。 不知道哪個版本Chrome引入的安全機制,對于一個HTTPS網站,其所有引用的資源(Script和StyleSheet之類的),也必須位于HTTPS的服務器上,否則拒絕執行。而我并沒有HTTPS服務器,因此,Chrome下自動更新華麗地掛了。 然后是Firefox。Firefox下播放不了音樂,我一直以為是Firefox不支持,后來才發現是Firefox的安全機制在作怪:HTTPS的網頁拒絕播放來自于HTTP的多媒體文件。 這倆奇葩讓我傷透了腦筋。然后無意中瞥見GitHub竟然是HTTPS的,So…… 轉移過去,變成了順理成章的事情,我求爹爹告奶奶沒求來一臺HTTPS的服務器,雖說有免費的SSL證書什么的但是我去申請的時候,連那提供商的網站自己都證書錯誤了。 于是事情都解決。 |
而第二個問題,GitHub的負載能力為什么這么弱,原因在于GitHub根本不適合作為CDN服務。著名博客比特客棧的文藝復興,對此做了詳細解釋:
|
針對這個問題,原文作者直中要害的提供了兩個層面的解決方案:
1、使用GitHub作為CDN的正確之道:
那么,Github作為CDN的正道是什么?Github Pages。通過加入gh-pages branch,你可以修改和發布自己repo的文件。值得提醒,Pages雖然免費,并非資源無限,詳見官方Disk Quota的描述——“雖然我們沒設上限,但請各位合理使用。”
Github輕描淡寫的說合理使用,而不是嚴明規章到MB、GB,其實是一種潛意識的相互信任。這是一種在貧富懸殊供求關系緊張的中國日益缺少的東西,12306訂票助手的存在就是一種印證:乘客不相信12306,12306不相信乘客,最后逼出一個12306訂票助手,每天乃至每半天更新一次來滿足中國人訂票回家的需求。 |
2、HTTPS下如何引用HTTP資源:
請問Google Reader,是怎么在HTTPS域下播放優酷與土豆等非HTTPS的視頻?我們在去年9月發現了同樣的問題,Google自己是這樣解決的——
Chrome 21之后,在SSL加密頁面embed非SSL的Flash會怎樣呢?會被默默的屏蔽掉,只留下一句console報告。那Google Reader是怎么繞過這個問題看優酷與土豆視頻的?他們iframe了一個非SSL頁面,再在里面引用flash(引用頁連域名都是不同的) 同理也適用于Javascript,這也是12306訂票助手當前的解決辦法(Firefox除外)。不再需要SSL下的CDN了。 |
不是結束
也許一切自有冥冥天意。Jesse Newland,這位在“訂票助手”Repo中發出警告的GitHub員工,早在2012年12月份,就已受InfoQ之邀,確定參加2013QCon大會。除了分享GitHub的架構演進之外,Jesse還會分享他負責的項目——GitHub ChatOps運維機器人。不過看來這次大會的演講,他將不得不加入關于12306插件的話題。
訂票助手的作者木魚,不堪忍受各界觀光團紛紛造訪他本開源在GitHub上的訂票助手代碼倉庫,最終刪除了項目。但他表示仍將繼續精簡/改進這款訂票插件。
因為這個插件,鐵道部甚至投訴至工信部,要求其責令各家瀏覽器提供商停止提供附帶搶票功能的瀏覽器的下載。不過就本文發表前,各家瀏覽器廠商均表示尚未接到相關通知。
這一切還都不是結束。