8月27日至30日,一年一度的《英雄聯盟》周年盛典將與廣大玩家共同回憶過往,展望未來。由于多方面因素,本次盛會不支持線下觀賽,但如此盛大的電競盛會怎么能少了各位熱情的召喚師?為此,英雄聯盟聯合云開發為各位玩家打造了一套百萬玩家同時在線的聊天系統——內場觀賽區,可供百萬玩家同時在線交流,全面升級線上觀賽與活動體驗,帶給各位召喚師們既是觀眾、又似故事參與者般奇妙的感受!
內場觀賽區互動界面
玩家只需通過宇宙競技場進入內場觀賽區(PC端/移動端均可訪問),即可與進入云開發與英雄聯盟聯合打造的專屬觀賽區,在觀賽區內,支持玩家邀請小伙伴或隨機偶遇其他玩家共同欣賞比賽,并能進行實時交流,一起為你喜歡的戰隊打call!
線上觀賽也能“開黑”!
這么一套百萬在線的聊天系統,以往需要一定人力、至少一個月以上的時間來打造,而借助云開發,只需1位研發工程師僅用2-3周就完成了開發到上線的全流程!
百萬級聊天系統帶來的三大挑戰
首先,需要介紹本次活動的主要場景需求:
1、百萬并發的在線聊天室
每個虛擬聊天室房間可容納5人觀看比賽,并支持實時互動,包括聊天、發送表情、動作等交互方式,此外聊天室還設有戰隊應援等模塊。
2、房間匹配
玩家每次進入網頁時,系統都會查詢當前房間的匹配情況。
3、百萬并發的實時抽獎活動
觀看直播的各位玩家可在比賽的某個時間節點,點擊頁面中的“寶箱”參與實時抽獎。
上述三個場景面臨的壓力各不相同:
首先,聊天室的場景中,因為涉及聊天信息的存儲和分發,除了對消息推送的實時性考驗外,最大的考驗是對數據存儲層的壓力。對于百萬量級的直播場景,比賽的關鍵時刻往往也是玩家最活躍、進行“刷屏”互動的時候,理論頂峰 100W 的QPS,對后端的存儲壓力無疑是巨大的。
接著,房間匹配場景。正如上文所介紹,進入頁面后第一個邏輯就是查詢當前用戶的歷史房間id,這個貌似沒有很大壓力,但是考慮到極端情況下,如果直播出現卡頓,大量用戶同時刷新頁面,將對系統穩定性帶來巨大的考驗。
最后,實時抽獎環節如何保障百萬級用戶在幾乎同一時間完成“點擊-開獎”的抽獎交互,同樣是一項不小的挑戰。
面對挑戰,云開發如何破局?
那么應對這聊天系統中的三大挑戰,云開發如何一一攻克?
首先,應對聊天室場景的數據壓力:一個字——「拆」!即將聊天信息的數據流,打散至50個環境中,并將系統分為主環境和聊天室環境,主環境用于承載房間匹配、用戶房間查詢、房間數據庫環境映射關系查詢等通用邏輯后臺;而聊天室環境則負責虛擬房間內玩家的實時交互,包括文字消息、表情、動作等等。
聊天室數據拆分整體流程
解決完數據壓力問題,聊天邏輯的實現就比較清晰了:同一個房間的人,根據 roomid 監聽房間的聊天記錄,當有人發送消息、寫入聊天信息后,云開發的實時推送能力會自動推送消息給所有監聽者,聊天室內的玩家就能看到聊天消息了。而表情和動作交互,底層也是將其轉換成 json 對象來進行展現。
聊天記錄的數據結構示例
接著,應對大量用戶同時刷新頁面的高并發風險的方法:一個關鍵詞——「限頻」。具體來說,雖然云開發自帶的云函數有抗高并發的能力,但是因為查詢歷史房間 id 需要操作數據庫,為了保障數據庫層不被擊垮,采用云函數的限頻能力,就可以很好的解決這一問題。前端只要try catch一下,再通過優化 UI 交互,就可以完美應對極端情況的風險,還能很好的節約成本。
最后,針對百萬級用戶在同一時間開啟抽獎的實時性壓力:還是一個關鍵詞——「原生」。利用云開發原生提供的實時數據推送能力能夠完美支撐此場景,開發者只需寫一行代碼 watch 一下后端的數據變化即可,而無需進行其他操作(點擊詳細了解實時數據推送)。
總結
本次《英雄聯盟》9周年盛典活動,云開發利用實時數據推送、彈性擴縮容等能力打造了百萬在線級的實時聊天系統,攻克了數據存儲壓力大、高并發風險和實時性要求高等三大挑戰,抗住百萬流量洪峰,支持活動快速上線,縮減時間與人力成本。
除了本次涉及的直播彈幕和活動抽獎等場景,云開發已成功服務了微信讀書、騰訊游戲年度發布會、創造營2020、貓眼電影等眾多產品的多類營銷活動,以穩定不宕機、靈活擴縮容、安全防刷等優勢持續為客戶提供高質量的服務,歡迎更多開發者使用云開發打造穩定、高質的應用與活動。