使用多進程解決高併發帶來的問題是進程安全鎖,框架經常會因爲部分代碼的報錯而導致死鎖或內存佔用不釋放等諸多問題。而使用單進程的服務器框架,通過線程池來做消息輪詢和任務執行,能夠避開鎖帶來的諸多問題。
框架的初衷
-
衆核時代的並行編程
-
免費的晚餐已經結束了(The Free Lunch Is Over -- Herb Sutter, 2005)
-
E5420(2.5GHz 2004) VS E5-2620v3(2.4GHz 2014)
-
我們獲得了更多的核心、更多的線程、更大的緩存、更大的帶寬。我們得不到更高的主頻。
Erlang
-
1998年Erlang開源
-
2006年傳入國內C++程序員圈 Erlang China User Group始於2007,現改名爲Effective Cloud User Group
-
並行和分佈式 Erlang採用的Actor模式使其增長並行處理,錯誤處理機制和儲存管理爲分佈式服務,Erlang並不擅長存儲密集型數值計算。
Actor模式
-
一切都是Actor 一切都是Object?並行的面向對象模式!創建actor/處理消息/發送消息。發送的消息和發送者解耦、異步通訊。
-
沒有Actor的語言提供的框架 Akka by Scala、CAF: C++ Actor Framework by C++、Remact.Net by .net
Skynet
-
2010 年想法
-
2011年12月基於Erlang的第一版本實現
-
2012年7月基於C重寫
-
2012年8月1日開源發佈
-
2014年4月22日 v0.1.0
-
2014年11月28日 v0.9.1
CodeBase
-
5000行C核心代碼 消息分發、Actor調度、Timer管理、基於epoll/kqueue的socket庫(支持TCP/UDP)
-
1000行C核心服務代碼
-
1000行Lua核心庫
-
5000行Lua外圍庫 Redis/MySQL/MongoDB Driver crypt、sproto、sharedata,etc
-
單進程+可選Lua沙盒
-
可選分佈式結構
-
MIT License
消息調度模塊
消息調度模塊
1.對於從事遊戲客戶端開發的朋友,界面開發很繁瑣,客戶端技術更新很快,很少能接觸底層開發,想轉型做遊戲服務端開發的朋友,學習skynet可以瞭解服務器的整體架構流程,基礎組件以及服務端的編程思維。
2.對於從事小遊戲開發,skynet是一個輕量級遊戲服務器框架,同時學習服務端,能進行全棧開發
關於Skynet這裏給大家推薦一個學習視頻,裏面詳細講解了以下知識點內容,視頻鏈接:https://ke.qq.com/course/2806743?flowToken=1030833
異步編程
-
coroutine VS callback
-
Lua5.2 coroutine的內存開銷僅208字節 C線程很難減少棧的內存開銷
-
coroutine對異常有良好的支持 javascript需要promise模式
-
服用coroutine避免過頻的GC
-
遠程過程調用RPC 小心異步過程中的狀態改變
-
快速失敗模式
Actor沙盒
-
C模塊 動態庫*.so
-
Lua State != Erlang Process
-
Lua 沙盒隔離(30+20K內存佔用)
-
Lua5.2(Lua JIT 2.0可選) 命令式語言、輕量coroutine、良好的C交互性能
-
Lua庫+服務 異步socket庫、Launcher、DB Driver
-
共享數據(sharedata/STM)
通訊協議
-
進程內消息傳遞 文本協議(C服務)、自定義序列化庫(Lua服務)、內存數據結構(自定義)
-
跨進程消息傳遞 自定義協議、sproto、google proto buffers、json, etc
-
廣播和組播
分佈式解決方案
-
skynet 支持兩種分佈式方案 harbor模式用於拓展計算能力的不足、cluster模式提供彈性、可以一起使用
-
如非必要、在一臺機器解決 使用cluster做弱關聯
-
不做熱更新、只做熱修復 A/B滾服、定期維護、減少複雜度
MMORPG 服務器性能
MMORPG
-
E5-2620v1(2.0 GHz)*2,32G RAM 開啓超線程,系統可見24個核心。
-
10K個TCP長連接
-
200人相互面積傷害,延遲在可接受範圍。 計算複雜度O(n^2) Lua編寫、CPU平均開銷0.5%每人,系統上限2400%,<5M RAM/人
-
多核的優勢在於處理時間平滑
陌陌爭霸
-
E5-2420v1 到 E5-2650v3
-
初期壓力測試單機20K用戶 承載能力隨業務複雜而下降,承載能力隨核心數增加線性上升。
-
全服峯值接近200K用戶 登錄操作無明顯延遲,對手搜索(全局單點)無明顯延遲。
典型手遊集羣
電信手遊集羣
-
不按硬件分服
-
玩家在登錄處獲取令牌
-
玩家登錄任意agent池
-
邏輯服處理排行榜
-
根據運營需要在線調整
-
統一使用數據庫集羣
-
避免單點
調試與優化
-
內建性能分析模塊
-
Lua模塊內建監控協議
-
替換CRT內存管理庫(jemalloc)
-
進程內消息傳遞減少拷貝
-
優化向自身發送的消息
-
合併timer請求
-
高性能要求的服務使用C/C++編寫(慎用)
-
爲Lua編寫C模塊:AOI、尋路、組播、公式計算
-
優化登錄、找到熱點、避免單點