1. 程式人生 > >多個遊戲程序伺服器的管理

多個遊戲程序伺服器的管理

多程序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,記憶體,網路消耗)等等,立即視覺化繪製圖表。如果需要做效能測試,應該會非常有用。