## 結構規劃
### 項目概況
這是一個網絡答題項目,深圳某區公安分局組織了一次學生安全教育專題活動,該活動是在區電視臺一個節目直播的,直播時間是星期天晚上19:00,節目時長1個小時,定于節目結束后,也就是晚上8:00開放答題。全區約有50萬學生(包括幼兒園、小學、中學)。公安分局已經提前一星期在微信公眾號上做了推送,并部署全區學校,通過學校要求每個學生觀看,并作為家庭作業完成。也就是說,這50萬學生都是要進入系統答題的,因為要完成作業嘛,況且,還會抽取前200名學生發放大禮包!
不得不說,該區公安分局在這方面做的很好,節目準備非常充分,事后看,節目效果也是非常好,稱贊!
50萬學生,我們設想一下,電視節目一結束,全部都會在很短時間內涌入答題網站,這是一次很高并發量的訪問,可想而知,服務器是有很大壓力的。
項目開發沒有難度,是一個簡單的答題網站,使用PHP開發,使用Redis進行數據存儲、session存儲、成績計算、成績排名,后臺隊列把成績寫入數據庫。總之,在代碼上進行了也是進行了大量優化的,不是本文主要目的,本文主要講述的是騰訊云服務器的部署。
事實上,節目還沒開始,當地電視臺的網站就垮了,因為推送的網絡直播地址是電視臺自己的網站,沒有做好這么大并發量的準備工作。后來,學生們都是通過電視看的直播。直播結束后,電視臺把錄播節目放在了視頻網站上,又有一部分學生通過視頻網站觀看了節目。
這么大的并發量,如何應對?
### 結構設計
因為沒有自己的硬件服務器,計劃使用騰訊云完成這次搭建工作。騰訊云產品線很完善,控制臺非常易于使用,功能完善,這個要給騰訊云一個贊。

:-: 服務器拓撲結構圖
一、使用DNS輪詢,將網站域名解析到多個負載均衡服務器的IP上。這樣,客戶端請求訪問域名時,會隨機的被DNS服務器分配給不同的IP地址,并且客戶端會對該IP地址解析結果進行一定時間的緩存,于是,大量的客戶端請求就被比較均勻的分配到了三臺負載均衡主機上。
二、使用負載均衡。由于對騰訊云的負載均衡服務器性能不確定,所以不能僅依賴一臺負載均衡主機,因此采用創建多臺負載均衡主機的方案,以消除負載均衡主機性能瓶頸,并且,負載均衡主機會自動屏蔽故障服務器,提升整個系統的可用性。
三、使用文件存儲服務保存網站程序文件。騰訊云的文件存儲是nfs(網絡文件系統),可以在web服務器啟動時掛載,實現多個web服務器使用同一套網站程序,簡化代碼發布工作。WEB服務器開啟OPCache,多服務器訪問同一個nfs也沒有壓力。
四、使用騰訊云MySQL服務器存儲用戶數據和用戶成績。騰訊云MySQL支持主從配置,可以搭配成讀寫分離的結構。由于本項目的數據庫寫入是后臺任務寫入的,不占用服務器性能,所以其實MySQL的壓力不大,不需要讀寫分離。
五、使用Redis服務器存儲session、學生成績、排名。學生答卷提交后,保存在Redis里,提交答卷后會看到排行榜,也是由Redis計算所得。
六、使用騰訊云CDN加速靜態資源。網站的圖片、js、css等靜態資源,全部走騰訊云CDN,以分擔服務器的帶寬壓力和文件系統壓力。
七、使用騰訊云CVM云主機,安裝Nginx和PHP-FPM,提供Web服務
綜上所述,一個客戶端的一次請求大概是這樣的:
1、發起請求,DNS解析域名,隨機分配一個負載均衡主機的IP給客戶端
2、客戶端訪請求負載均衡主機,負載均衡主機根據Web服務器的健康狀況,把請求隨機分配給一個web服務器處理。
3、Web服務器從OPCache或者文件服務器獲取程序并執行,期間會訪問MySQL和Redis服務器,最后把結果返回給客戶端
4、客戶端得到動態網頁內容,并從CDN服務器加載圖片、js、css等靜態資源,顯示網頁