今天參加了一個和某網游開發團隊的交流, 感受到了網游開發和 Web 開發之間的巨大差異, 所以我寫了本篇博文.
傳統的網游開發者可能由于更大的精力放在游戲邏輯上面, 并且因為游戲客戶端是一個高度內聚邏輯復雜的終端程序, 所以網游開發者在開發服務器端的時候, 也容易把客戶端的經驗放在服務器端, 很少考慮動態可擴展性和服務容災性.
Web 開發的一些經驗對網游服務器開發是非常有用的:
1. 服務(子系統)無狀態化,
2. 所以服務可以采用 Web 模式來開發, 也即 Web Server + 腳本語言 + 存儲
服務(子系統)無狀態化是整個系統動態可擴展性和服務容災性的保證. 例如在 Web 系統中, 一個全靜態內容的網站是無狀態的, 只要部署了多個服務器, 那么用戶訪問任何一臺服務器都 OK. 這個例子說明了服務無狀態化是系統可擴展性和容災性的保證, 同時也隱含了一個要求: 數據是同步的.
網游程序員會立即提出疑問, 你舉的例子是靜態網站, 但網游服務器的子系統可不是那樣的, 能實現無狀態化嗎? 比如, 用戶連接到了某臺網游服務器, 這臺服務器上面會保存有這個用戶的很多信息數據, 如果用戶斷開連接再連到另一臺服務器, 那他的數據不是全丟了嗎?
其實, 如果把服務分成邏輯(指令)+存儲/狀態(數據), 那就可以把有狀態的服務改造成無狀態的服務. 因為一般的網游服務器把邏輯和存儲綁在一起, 所以做不到無狀態化, 所以, 也就無法動態地增加了減少服務器.
一旦把邏輯和存儲分開(如 PHP + MySQL), 就可以使用 Web 技術來開發網絡游戲服務器. 邏輯本身肯定是無狀態的, 所以可以任意添加和減少服務器和實例. 而存儲本身經過開發, 也可以做到無狀態, 如 MySQL 集群和其它的存儲群集. 把一個有狀態的服務改成無狀態的服務, 可以通過簡單地把邏輯和存儲分離即可.
原文轉自:http://blogread.cn/it/article/6765