這個階段最大的目標就是按預期時間上線。前端
組團隊不表,10人左右的Web團隊,從接需求,到上線,咱們用了不到三個月。算法
這個階段面臨的最大難題:兩個月就內測!數據庫
怎麼辦?找老戰友刷刷刷!花錢買買買!做爲一羣經驗豐富的老司機,咱們用買零件翻新車的方法。網站內測公測階段,須要知足用戶登陸註冊、關注主播、看視頻、發彈幕、加房管、領任務、送免費竹子等核心功能,採用了複用模塊+主業務全新開發的策略。瀏覽器
複用模塊得益於團隊的前360技術背景,根據直播秀場類項目上的技術積累,利用PHP框架Pylon、發版工具Rigger,在老戰友的幫助下,從新搭建了一套QBus消息組件,長鏈接系統,改進的Redis、MongoDB和MySQL集羣,視頻雲服務,敏感詞服務,搜索服務,這個項目纔有了強大的基礎支撐,纔有可能在兩個月時間就上線。緩存
雖然是個新項目,咱們並未作一個一籃子應用,把全部接口放在一個項目,而是按功能模塊分好項目,每人負責一個,對主站panda.tv項目提供內網API,部署方便互不影響,開發效率也比較高。安全
熊貓TV架構第一原則是高可用服務器
架構目標(SLA)網絡
根據以往新項目經驗,預估支撐1000TPS ,百萬日活用戶,單房間10萬左右在線彈幕;平均響應時間在100ms,99.9%在1s內;千萬級別數據量;99.9%的可用性(整年宕機在9小時如下)。架構
架構選型併發
四層負載均衡:LVS,目前基本是業界標配,若是使用雲服務的話能夠用廠商提供的負載均衡,如阿里雲SLB和亞馬遜ELB等,這種第三方依賴都須要嚴格引流壓測確認DB層、緩存層、Web層是否
有坑;
設計實現
機器配置採用6核16G的虛擬機。服務部署單獨的XEN虛擬機集羣,互不影響,進行多機房互備,機房間光纖專線內網互通。
120臺虛擬機分給十多個業務,主站用了40+,三個IDC——電信聯通移動同時使用,流量大的主機房在電信,其餘兩個機房部署Redis、MySQL從庫,寫都在電信。預估的註冊在線人數百萬級,QPS萬級。接口使用PHP-FPM對外服務,單機性能平均500QPS+,內測邀請制,內測一個月期間十幾萬人涌入,解決了一些小Bug,而後你們很有信心迎接公測。
這個階段屬於填坑,最主要目標是網站穩定可用。雖然每一個服務都有多機房災備,微服務化也作了較好隔離,但0.1不到一個月便宣告夭折,咱們低估了熊貓TV的明星效應,低估了黑色產業鏈的薅羊毛能力。公測一開始,熊貓就炸了(水友術語,指網站不可用)。
分析:網站因註冊和用戶信息、首頁、房間頁訪問量過大致使FPM進程跑滿,接口和模版渲染耦合,自己佔的調用時長就會過多,服務間斷性不可用,Redis緩存首頁推薦位和用戶信息只需幾百MB,但鏈接數過多,內存佔用到10G+,致使Redis響應緩慢不可用,垃圾號瘋狂註冊,第一天便破百萬,用戶中心出現服務異常,緩存命中率低,進而雪崩。
聊天彈幕爆發,時段很是集中,每日晚8點到凌晨2點爲網站高峯時段,如圖3所示。
這些也是直播網站會一直面臨的核心穩定性問題,針對這些問題,大架構框架沒有變更,加班加點,兩週時間就上線了新一版架構優化。
主站重點接口Lua化:消息限制發送頻率,並改造爲Lua接口,十倍提速,避免佔用主站PHP-FPM資源;贈送竹子也改造爲Lua接口;用戶中心取用戶信息也改成Lua接口,直接從緩存讀。
用戶ID發號器改造,不依賴MySQL自增ID,提升併發性能。
首頁和房間頁靜態化,Worker機抓取生成模版,分鐘級別更新,而後rsync到各個服務器,Nginx直接讀HTML文件生成首頁、房間頁,其餘我的動態信息都走Ajax請求,保證不會出現白屏狀況。
重點Redis增長到10+ Slave,Slave間樹型同步,葉子節點從庫從上級從庫同步,避免一主多從傳輸數據延遲。從庫的增長也避免主庫網絡負荷和鏈接數過多,致使響應延遲過大,服務不可用。
核心業務增長部署服務器,應對集中峯值訪問。
安全性上:全部80接口作XSS校驗,CSRF token防範,對接口作幾十道安全檢測,防止被拖庫,防止Cookie被盜用;反垃圾反盜號反外掛:含敏感詞聊天信息過濾,垃圾IP封禁;註冊和任務都增長圖片驗證碼,識別機器刷用戶刷竹子;房間人氣值採用複雜策略,用算法綜合判斷確認合理性,防刷防掛;主播審覈更加嚴格,身份證銀行卡姓名等信息都要求錄入,能夠追究責任到真人,甚至有視頻驗證,嚴防色情內容。
功能上:創建遊戲娛樂戶外等分類模塊,運營自助增長分類;部署並自行運維第三方搜索服務,支持主播暱稱、標題、房間號等維度搜索,過濾直播狀態、主播地區、封禁狀態等條件;禮物系統抽獎投票等系統上線,增長主播收益渠道,增長互動。
優化效果:整年未出現過白頁、首頁不可訪問狀況,支撐千萬級PV,百萬級日活,單房間最高達到百萬級在線,視頻流量近TB級;接口平均響應時間20ms左右,99.9%在1s內;各個系統數據存儲量破千萬,MongoDB、SSDB等大容量庫很好地支持了業務。
到2.0階段,初期的刷臉靠戰友幫搭建基礎服務和買第三方服務,已不能精細化、定製化地支撐業務快速發展,而此時人員配置也開始完善,熊貓TV開始了全新的2.0自主研發階段。
本階段也屬於穩步發展階段, 最主要的目標是視頻流暢清晰、彈幕互動效果穩定。
接入決策上,接入更多家CDN,並對CDN穩定性作指標考覈和嚴要求:根據卡頓率、延遲時間、首屏時間、聲音視頻同步率等指標,結合運營經驗,建立了一套立體化多維度的CDN-SLA體系,決定給予流量多少,主播級別,主播數量。這樣也增長CDN的危機感,更好服務用戶。
視頻流調度互備上,如圖4所示。
主播推流區分默認配置和管理員配置,推向對他而言網絡情況最好的CDN,CDN自身節點實現各地的複製,CDN之間實現推流互備,一個CDN掛掉,不影響使用,用戶根據PC或手機端區分,從對應配置的CDN拉流看視頻,從而實現最佳觀看效果,Web端用戶也可切換備用線路,當默認CDN出現問題,則選擇從其餘家CDN進行拉流。
這樣就保證觀看的流暢和視頻的總體高可用。
創建鏈接:
下發消息:
使用Golang+Redis全新開發,對消息級別、消息發送和消息內容作了必定優化。級別上區分多種Level消息,在高峯期、網卡被打滿極端狀況下,丟掉部分不重要消息;消息發送進行打包方式發送,一個房間的消息一次批量推送幾十條,減小TCP交互;消息內容去掉無用字段,減小長度,例如禮物消息一條減小了168字節,假設高峯期一個房間十萬人在線,一條禮物消息能節16MB,大主播房間按1000個禮物一小時算,能節省16GB流量,很是可觀,因此必定要注意消息內容的壓縮和縮減。
總體架構上的改變:一年以來用戶量爆炸式增加,達到日活用戶近千萬,PV上億,同時直播主播近萬間,流量峯值TB級別。技術人員也擴充了4倍,隨着王校長驅動開發、尹素婉驅動開發(尹素婉是韓國第一女主播)、PDD驅動開發(PDD是前職業選手,著名LOL主播,彈幕量大,觀衆百萬)等模式的驅動開發,熊貓快速步入2.0時代,技術架構也有了更穩固的改進,新的PHS(Panda High-Perfomace Service熊貓高性能服務體系)設計思路是增長架構層次,明確微服務邊界,基礎組件從外部依賴到內部自研,架構層次宏觀層面分爲端、接入層、平臺服務化、中間層、基礎層五個層次。
包括Web頁、iOS、Android、各類Pad端、網吧彈窗合做、電視盒子合做App、遊戲主機合做App,從各個渠道擴展業務。
從大而統一的panda.tv分流出mall.panda.tv、roll.panda.tv、pay.panda.tv、open.panda.tv等,保證各個接入業務互相隔離。接入層stars.panda.tv、pandagirls.panda.tv嘗試使用NodeJS提供API,前端徹底自行研發,提升效率,性能也比使用咱們的Pylon-PHP框架提升了6倍左右,能夠知足當前流量請求。
架構體系沒有太大的變更,主要採用Golang技術棧作了總體升級。流量突發時PHP-FPM子進程新增緩慢,多進程模型切換代價較大,不能較好服務高峯請求,緩存和DB鏈接池複用困難,咱們重點業務從PHP遷移到Golang;部署上,依賴Nginx+LVS探活實現不停機熱部署;Gobase基礎庫,實現了一套特定業務場景Concurrent Map庫;實現了配置讀取模塊;對MongoDB Client進行了封裝,便於CRUD方式使用和對象映射;Redis鏈接池和CRUD操做封裝,業務不須要協議命令細節,而是正常Get(key)、Set(key)便可;數據訪問層結合配置服務封裝分片與路由來支撐容量水平擴展;封裝Log、HTTP請求和HTTP Param解析等基礎類。
經過對Golang半年的使用,咱們創建了本身的一套技術開發體系:Gvt建立項目和管理依賴,Ansible管理服務器和分發部署,Postman進行文檔編排和代碼測試, Teamcity實現持續集成。
業務上,CDN調度項目TrafficCoop,高性能,靈活配置Web端和移動端CDN信息;API-Proxy項目 ,原生Golang Router,使用OAuth 2.0,提供對外網關,中轉內部服務;禮物系統全面使用Golang+Redis+MongoDB保證穩定性和高峯處理。新業務原則須要快速開發,性能要求較低的業務使用PHP,性能要求高的業務用Golang、NodeJS。
用戶中心則持續演進:支持FaceBook等帳號接入;電話語音驗證碼防外掛,異地IP從新登陸機制防盜,我的身份指紋識別,作到完全防盜號。另外爲提升接口安全性,解決DNS劫持等問題對服務HTTPS化,各業務根據須要跟Ops申請HTTPS證書或SAN(多域名)證書。
視頻效果優化:接入更多CDN廠商,進行評測對比,及時反饋問題,督促其合理設置緩存值,實現視頻播放流暢化。
Flash調整彈幕展示策略:實現既能有滿屏感,又不會因同屏彈幕過多卡住瀏覽器,達到觀看和互動的平衡。
文本反做弊:機器學習訓練房間彈幕內容,模型上對廣告、色情、敏感詞、黑白名單等進行打分評定。
增長圖片牆鑑黃服務:30秒刷新房間截圖,接入多家鑑黃API,合理評分,快速發現直播內容異常。
圖牀自建:圖片存儲從Cassandra遷移到公有云對象存儲,節省運維成本,直接使用第三方CDN,加速圖片訪問。
Kafka隊列自建:基礎組專人開發維護,更快更好解決問題;竹子經驗計數、用戶關係等從SSDB遷移到Redis Cluster,保證性能無瓶頸,數據量暴增無壓力。
Spark Streaming平臺搭建:彈幕內容分析與輿情,CDN質量實時監控,用戶行爲實時感知。
另一個比較大的架構變更是業務機房遷移。實現了DB遷移,公有云互備。二十多人演練數十次,按照兩頁的遷移清單,全部業務從新部署,DB從新導入,停機維護一整夜,全部服務從原有機房一次性成功遷移到兩個公有云上。
熊貓TV架構改進思路是應對峯值流量高度集中的直播需求,總結幾條經驗:
熊貓TV因快速上線和爆炸式增加,從嚴重依賴外部服務,到自主自建核心業務,彎路走了很多,也對直播技術有了更深的理解,積累了豐富的經驗,技術團隊也從20人左右快速擴展到百人團隊,爲熊貓TV在百家直播平臺中挺立飛奔奠基了技術基礎。將來咱們會在如下方面繼續努力:
直播面臨的核心問題是網站穩定可用、視頻流暢清晰、彈幕互動效果穩定。直播技術看似簡單,一家視頻雲能夠幫助創業公司一兩個月就構建出一個直播App,但其中的運營難點、技術難點、流量帶寬問題都須要謹慎處理,但願本文能幫助直播行業技術人員跳過一些坑,架構設計時做爲技術參考。