經過長期迭代,伺服器版本從 1.0 升級至 3.6,架構從「一客戶端一執行緒」演進為異步處理網路,但實戰經驗仍嫌不足,特向社群專家請教優化方向。
客戶端分為 PC 端與車載終端,Session 層需分別維護兩端狀態。網路部分設計如下:

啟動 HandleCar 與 HandleUser 的 StartListen 執行緒分別接收終端與客戶端資料。終端每 10 秒發送一包資料,處理流程:

在 AnylizeGpsData 中,需查詢資料庫該終端所屬路線的所有線上用戶(透過 Session 中的 Socket),轉發資料並存庫。目前做法是「來一包就查一次線上用戶」,疑似效能瓶頸。
每包資料都查詢資料庫獲取線上用戶列表,嚴重拖垮資料庫效能。建議:在記憶體中維護「路線 → 線上用戶 Session」的索引結構,避免頻繁查庫。
終端連接時使用反射創建物件,高併發下會增加 GC 壓力。建議:改用物件池或工廠模式預先暖機,減少反射調用。
架構改進方向:
SocketAsyncEventArgs + 物件池模式(參考 .NET 3.5 增強 API)ConcurrentDictionary 或 Redis 等分散式快取-=)IDisposable 物件(Socket、DbConnection 等)正確釋放GC.GetTotalMemory)期待社群大神具體指導,後續將分享優化成果。