多個遊戲程序伺服器的管理
多程序VS多執行緒
在之前的文章中,已經提到了目前伺服器的主流框架是多程序或者多執行緒的架構(遊戲伺服器的中心節點)。
多程序伺服器可以分散式部署,總體會更加靈活。此外,多程序的情況下,我們可以更加肆無忌憚的使用靜態資料;但多執行緒情況下,靜態資料訪問要麼加鎖,要麼就只能儘量避免。另外,多程序如果發生異常崩潰等突發情況,不至於整個伺服器組玉石俱焚。所以,一般我還是推薦使用多程序的架構。
但是多程序伺服器架構,在win下有一些坑點
- 日誌會分別列印到不同的控制檯和檔案中(多個程序寫一個檔案更慢更坑),查日誌需要對比著進行,並不直觀。
- 會在工作列啟動多個程序,看了比較心煩,當然可以選擇隱藏起來,但同時就沒法通過控制檯實時看到日誌了。
於是,我們想到是不是可以寫一個shell程序,隱藏伺服器程序ui(工作管理員中仍然可見)的情況下,收集所有日誌,達到實時監控的目的。
核心的問題
隱藏介面的方式啟動程序,並重定向該程序的標準輸出。
通過C#的Process類,加上適當的配置,我們就可以啟動一個“看不見”的程序了。接著,呼叫我們自己實現LogTextManager,並非同步讀取來自於被啟動程序的日誌。
public static void StartProcess(string pname, LogShowDevice dev, string parm = "") { Process process = new Process(); process.StartInfo.FileName = pname; if (!string.IsNullOrEmpty(parm)) { process.StartInfo.Arguments = parm; } process.StartInfo.UseShellExecute = false; // 是否使用外殼程式 process.StartInfo.CreateNoWindow = true; //是否在新視窗中啟動該程序的值 process.StartInfo.RedirectStandardOutput = true; // 重定向輸入流 process.OutputDataReceived += (s, _e) => LogTextManager.AddLog(_e.Data); process.Start(); process.BeginOutputReadLine(); processList.Add(new ProcessInfoData { Process = process, ProcessId = process.Id, Dev = dev}); }
最後,LogTextManager再根據情況回顯資料,我們就可以完成一個簡單的程序啟動器+日誌顯示器的功能了
其他必須功能
嚴重級別刪選和程序刪選
這很容易想到,我們現在只能看到所有程序日誌的合集。但如果除錯時,我們可能只想看某個伺服器的log,又或者某種嚴重級別的log。所以,我們需要實現設定功能,可以對這兩個條件進行刪選。
複製日誌內容
這也是Console程式的一個槽點。用過的同學都知道,win視窗程式複製,需要點選左上角->屬性->選中,然後選則文字後右鍵,充滿了濃濃的DOS風情。
在我們的shell程式中,我們就可以在選中日誌行,右鍵顯示具體文字了。在這裡,我們的做法是呼叫notepad顯示選中的多行資訊,非常方便。
定製日誌顏色
這個定製功能可能不是必須的,但也可以為這個shell的實用性大大增色。此外,通過C#元件PropertyView實現這個功能,該功能的實現也是非常容易的。
高階功能支援
伺服器組控制
基本的控制功能,包括啟動或者關閉伺服器組,並且可以檢測伺服器執行中,就無法再次開啟等等。有點類似於守護程序,甚至當某個程序掛了時,也可以扮演raise up的角色,重啟程序,保證伺服器組可用。
讀取/修改伺服器引數
有時,我們會遇到這樣的情況,除錯期間我們希望可以在執行時修改伺服器的一些引數,比如邏輯時間,經驗倍率,掉落倍率(重啟伺服器比較耗時)。通過這個shell程式來做這樣的工作就會非常合適。通訊的方法一般是socket等,這裡就不用詳細列舉了。
執行狀態的視覺化
這也是控制檯shell化帶來的紅利,我們可以把各個程序效能的資料(cpu,記憶體,網路消耗)等等,立即視覺化繪製圖表。如果需要做效能測試,應該會非常有用。