使用多行程解決高并發帶來的問題是行程安全鎖,框架經常會因為部分代碼的報錯而導致死鎖或記憶體占用不釋放等諸多問題,而使用單行程的服務器框架,通過執行緒池來做訊息輪詢和任務執行,能夠避開鎖帶來的諸多問題,
框架的初衷
-
眾核時代的并行編程
-
免費的晚餐已經結束了(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、尋路、組播、公式計算
-
優化登錄、找到熱點、避免單點
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/247691.html
標籤:其他
