
作者 | 羅松(西流)
來源 |
阿裡巴巴雲原生公衆号導讀:本文将通過剖析一個個具體的場景案例,以期望給相關的遊戲開發同學帶來共鳴,同時也希望能給非遊戲行業的同學帶來一些啟發。
一、前言
1. 遊戲客戶上雲關注點
遊戲行業是一個富有創意又競争激烈的市場,被稱為第九藝術。遊戲客戶上雲主要關注以下 4 個方面:
- 快速疊代,全球部署
快速疊代是遊戲行業的通用需求,包括開發效率、運維效率、架構解耦;同時遊戲可能也會出海,是以也需要海外部署或全球部署戰略。
- 高并發、高彈性
每個遊戲上線時都會經曆新開服、營運拉新等階段,遊戲本身也有日常峰谷,再加上偶爾的活動營運,也會産生峰值,是以在遊戲行業高并發高彈性也是一個通用需求。
- 穩定、可靠、安全
要保證遊戲的公平性和使用者的玩家體驗,防止作弊,是以需要保證遊戲的穩定可靠與安全。
- 資料、運維、成本控制
遊戲上線後,通過日志收集資料對使用者行為進行分析,根據分析結果針對不同的玩家實施不同的運維政策,将營運重點放在中間的搖擺玩家上,進而做到精準定位、控制成本。
2. 認識函數計算
下文将要介紹的案例主要與函數計算相關,是以在此先對阿裡雲 Serverless 産品——函數計算做一下簡單介紹。
函數計算:隻需要專注業務代碼,面向函數極簡程式設計(各種程式設計語言),豐富的雲産品間內建與事件驅動方式提供端到端解決方案。
- 專注業務代碼
如上圖所示,對于遊戲開發者來說,使用函數計算,就隻需要選擇一個你最擅長的代碼,編寫這段代碼,上傳到計算平台,就可以完成開發任務。之後可以通過 API/SDK 調用這個函數,也可以通過雲産品事件源去觸發函數。
上圖是一個簡單的例子,用 Java 函數寫一個“Hello World”,把它設定成 Java8 的執行環境,256MB 的記憶體,設定完上傳到函數計算,開發任務就完成了,之後主動調用函數即可,無需關注任何基礎設施。
這裡單獨介紹一下“雲産品事件源觸發函數”。除了主動觸發函數,還可以用雲産品來觸發。比如使用阿裡雲的對象存儲 OSS,上傳一個 zip 包到 OSS Bucket 的某個目錄,希望上傳之後可以自動觸發一個函數,然後這個函數可以把 zip 包自動進行解壓,雲産品事件源觸發就可以實作這種效果。另外還有其他很多事件源,比如日志的事件源、 MNS 消息事件源、定時觸發事件源等。
- 100< 代碼量
面向函數極簡程式設計,隻需要關注核心代碼。還支援各種程式設計語言,對開發者非常友好,開發者可以選一個自己最擅長的語言,寫完後上傳到函數計算即可。
- 100ms 極緻彈性
如果觸發函數,同時過來 10 個、 100 個、1000 個甚至 1 萬個請求都不用擔心,函數計算會百毫秒級彈出執行環境,每個執行環境去執行函數邏輯代碼,再把函數執行的結果傳回,幫助線上業務應對各種突發流量。
- 100% 資源使用率
在計費方面,函數計算是按執行環境的記憶體和執行時間計費,計費粒度可達毫秒級,隻為請求産生的資源消耗買單,資源使用率達 100%,降低成本。
二、Serverless 遊戲場景實踐案例
1. 高彈性戰鬥結算業務
戰鬥結算是強 CPU 密集型,結算系統每日需要大量的計算力,尤其是開服或者活動期間突然湧入的大量玩家,導緻需要的計算量瞬間幾倍增長,同時需要結算系統保持穩定的延時來保證玩家的使用者體驗。
以 SLG 遊戲或者回合制遊戲場景為例,一場戰鬥結束後,為了使用者體驗,用戶端需要先行結算,展示這一回合的結果,比如打赢了彈出勝利動畫,打輸了彈出失敗動畫。如果純粹依賴用戶端,很可能會出現用戶端作弊的情況(比如作弊器),是以最後的結算肯定還是由伺服器做結算。
随着遊戲策劃團隊想法的增加,遊戲越來越複雜,比如 buff、debuff、暴擊等等。随着遊戲越來越好玩,結算系統會越來越複雜,遊戲程序很可能會出現卡頓現象,而最好的解決方案就是把戰鬥結算這一 CPU 密集型的邏輯抽離出來。這一方案也尤其适用于新開服、活動期間以及每日有日常峰谷的情況等。
如上圖,當客戶把戰鬥結算遷移到函數計算上後,明顯可以看到, 即使 TPS 在日常峰谷呈 90° 直線上升,但是 Latency 延時仍然基本穩定在 200~300 毫秒之間,,充分保證了使用者的玩家體驗。
在這個場景中,函數計算的核心價值是:
- 彈性高可用:百毫秒級伸縮擴容,無需預留任何資源。
- CI/CD 和版本灰階能力:每當遊戲策劃有新想法時,戰鬥結算函數必然會更新,可以通過直接給這個函數設定版本和别名,進而非常安全地灰階到下一個版本的戰鬥結算函數。
這是遊戲場景裡非常經典的例子,将 CPU 密集型的邏輯抽離出來放到函數計算上,在不影響 Game server 的伺服器的同時,又具備了百毫秒伸縮擴容的能力,保證了玩家使用者體驗。
2. Serverless 實作超大規模遊戲營銷
遊戲廠商與廣告商聯合投放大量網際網路廣告,該業務場景無法準确預估營運流量,高并發、高彈性的背景服務對業務結果至關重要。且大量的營銷資料和原始日志需要進行離線分析,驅動營運政策更新。
遊戲廠商的需求是:第一,遊戲需要大規模營銷,波峰波谷無法預估;第二,遊戲需要快速上線,對開發效率要求較高。
解決方案如上圖,将函數埋點到網頁裡面,點選時自動觸發這個函數,函數再把點選傳過來的使用者消息持久化到 kafka。這一步函數 TPS 非常高,預估是幾萬或者十萬級别。第二步,通過 kafka connector 把消息持久化以後,connector 可以有 batch 操作,比如把 50 次點選的資料 batch 成 1 個再發給另外一個函數,相當于後面的這個函數變成了 1/50 的調用量,另外這個函數是異步觸發,加上 batch 操作,起到削峰填谷的作用,因為隻需要把消息寫入到資料庫就可以完成任務,隻要不丢資料就好。同時這個函數列印的日志也可以用 SLS 進行分析或者寫入資料庫 RDS/ADP 進行玩家畫像的分析。
客戶壓測資料如下圖所示,第一個函數 TPS 上升到十幾萬,第二個削峰填谷後變成不到 3 萬。
- 事件驅動,解耦架構難點;
- 彈性高可用,削峰填谷;
- 快速開發上線,1 天完成開發和壓測。
3. Serverless 實作安卓遊戲 APK 包按管道分發
UC 的遊戲分發平台的遊戲 APK 包需要根據實時請求中的參數擷取管道号,并将管道号寫入 APK 檔案固定位置, UC 有每天有大量的且不同管道的下載下傳請求,能實時讓使用者斷點下載下傳指定管道的 APK 遊戲包。
以阿裡内部 UC 遊戲分發平台為例,在對象存儲裡面放了一個原始包,其他包在檔案固定位置加一些東西就可以。但是 UC 管道每天有不同的下載下傳請求,通過 Channel=UC/小米/華為到 CDN,CDN 直接回源到函數計算, 比如在函數計算看到回源是小米,從 OSS 拿到原始包把小米管道資訊寫進去,再把這個包直接返還給 CDN, 其他管道包同理, 隻要被下載下傳過一次,都被緩存到 CDN。
這個案例中,函數計算的核心價值是:
- CDN 直接回源到彈性高可用的函數計算服務(FC);
- 降低成本,按需付費。客戶不需要為峰值預留計算資源,流量單價降價 40%。
4. Serverless 實作快速多管道遊戲打包
在發行遊戲之前,通常會針對不同的發行管道,将遊戲母包和不同的管道資料包建構成管道包。在這個建構過程中,如果使用手工方式,存在易出錯、效率低、高成本的痛點。
- 效率低:針對不同的管道去打包,傳統的做法是固定買幾台打包機,打包機可能大部分時間浪費,每周就打幾次;
- 高成本:管道越接越多,打包機隻有幾台,想檢視管道包情況,可能需要打一晚上第二天才能看到。随着管道越增越多,打包機也需要不斷增加,閑置成本也越來越高;
- 易出錯:如何給打包機配置設定任務,排程系統需要自己開發,如果打包機出現了異常,需要自己去解決打包機的問題。
這個場景下,引入 Serverless 工作流,如下圖所示:
工作流定義:第一步,把母包從 OSS 上下載下傳下來;第二步,并行去打包這些包,每個管道包有一個并行的任務;第三步,打包完以後,進行後處理。
在這個場景下,函數計算的核心價值是:
- 任務自動化:事件一鍵觸發、自動運作,工作流完整跟蹤記錄整個打包流程,提高打包成功率;
- 打包并行化:多個管道包建構過程并行,提高打包效率,同時支援配置模闆化;
- 低成本: 按量付費,計算資源使用率高。
5. Serverless 實作遊戲服務快速全球部署
阿裡雲作為國内第一家與 Terraform 內建的雲廠商,生态支援較完整(Serverless 重度依賴雲服務,中國支援較完整)。由于遊戲不可能使用很多其他的雲服務,而使用 Terraform 可以實作快速多雲部署。
6. 實踐案例總結
- CPU 密集接口
- 戰鬥結算;
- 社交類遊戲中,遊戲内截圖、遊戲直播視訊線上截圖、離線轉碼等;
- 聊天敏感詞檢測過濾,聊天翻譯;
- 排行榜等。
- 遊戲活動營運
- 激活碼生成、消耗等一些封測營運活動;
- 遊戲打包發行、廣告買量、活動頁、營運平台等業務平台。
- 使用者基本業務資料處理
三、阿裡雲函數計算現狀
1. 函數計算是國内企業 Serverless 架構落地、業務創新的首選産品
2020 年中國雲原生使用者調查報告,阿裡雲 Serverless 使用者占比是 66%。CNCF 2019 年中國雲原生報告中顯示,函數計算是國内企業 Serverless 架構落地和業務創新的首選産品。
2. 阿裡雲函數計算産品全景
函數計算是國内生态最完整、功能最豐富的 Serverless 産品,開發者一步上雲、一鍵 Serverless 化将成為現實。
圖:阿裡雲函數計算産品全景
- 系統層面:支援了各種語言,開發者可以選一個自己最喜歡的語言,同時也支援了容器鏡像,擁抱容器生态;
- 執行個體類型:預設選擇百毫秒彈性執行個體,也可以選擇性能執行個體(比如強 CPU 密集型的音視訊轉碼);
- 觸發層:可以 API Gateway 或者 SDK 直接觸發,也可以用 Kafka、OSS、CDN 等事件源觸發;
- 工具層:有全新的 Serverless-Tool、Fun、開發者架構等等;
- 可觀測性:包括日志、監控、 Metrics、告警、Tracing 等;
- 應用中心:有非常好的落地案例,可以快速體驗經典案例。
四、附錄參考
- 江娛互動:遊戲領域 Serverless 架構探索之路
- 遊戲打包過程枯燥且工作繁瑣,如何提升打包效率?看鲸旗遊戲的新思路
- 在遊戲營運行業,Serverless 如何解決資料采集分析痛點?
- 函數計算 FC 助力遊戲群采集營銷資料滴水不漏
- 基于 ECI+FaaS 建構遊戲戰鬥結算服
- 娛樂/教育行業:推流、轉碼一站式解決方案
- 零售行業:線上線下業務 Serverless 改造
作者簡介:
羅松(西流),目前負責阿裡雲函數計算産品功能開發:runtime 開發、事件源內建以及工具鍊的開發等,畢業後,從事了兩年手遊開發,經曆過完整的手遊立項、研發、上線流程,17 年投身 Serverless 大潮,緻力于将更好的 Serverless/FaaS 實踐案例落地,打造國内最好的開源開放的 Serverless 社群。
本文整理自【Serverless Live 系列直播】1 月 27 日場
直播回看連結:
https://developer.aliyun.com/topic/serverless/practices
Serverless 電子書下載下傳
本書亮點:
- 從架構演進開始,介紹 Serverless 架構及技術選型建構 Serverless 思維;
- 了解業界流行的 Serverless 架構運作原理;
- 掌握 10 大 Serverless 真實落地案例,活學活用。
下載下傳連結:
https://developer.aliyun.com/topic/download?id=1128