Erlang最大的優點是方便,很多基礎功能都已經集成到Erlang語言中。之前用C++寫服務器的時候,管理TCP連接很繁瑣,需要寫一大堆代碼來實現。底層的框架需要寫很多代碼實現,這樣既浪費時間,又會有很多BUG。但是用Erlang就方便多了,底層的一切你都不需要考慮,你只需要考慮,服務器的架構以及業務邏輯。從此讓你徹底從底層的泥潭中解脫。我從去年年底開始了解學習Erlang,到現在我已經徹底愛上了Erlang。好了,廢話不多說,開始詳細介紹下我設計的這個服務器架構吧。
首先看下整個架構的布局,如下圖:
如上圖所示,整個架構由四部分組成,分別是連接管理服務器、賬號服務器、游戲服務器以及數據服務器。
連接管理服務器既網關服務器,主要作用是管理與客戶端的網絡連接,將服務器組與外網隔離。只有連接服務器中會監聽網絡連接,連接管理服務器與其他類型的服務器器組成Erlang集群。互相之間通過Erlang消息進行同步。連接管理服務器中會有一個負載平衡節點,用來負責對連接服務器中的所有節點做負載均衡。連接服務器中還有N個網關節點,用來管理客戶端連接以及消息傳遞,網關節點的數量通過負載可動態增加。
賬號服務器,管理整個平台的賬號,對客戶端做登陸驗證,如果項目正式上線還要負責充值的工作。賬號服務器由N個節點組成,根據負載可動態增加節點數量。整個架構的數據庫都采用Erlang自帶的Mnesia分布式數據庫,這個數據庫既可以做永久保存也可以做Cache,對游戲服務器再合適不過了。Mnesia作為數據永久保存方案,唯一的不足是做數據統計不是很方便。像關系型數據庫,有很強大的SQL做支持,做統計那是相當的方便。雖然有不足之處,但是帶來的好處也是顯而易見的,那就是簡單,以及天生對分布式的支持。我在這里為什么不選用MySQL之類的數據庫,原因就是Mnesia簡單易用,正好符合了KISS原則。我信奉的原則就是KISS,只要能實現我需要的功能,那么實現的越簡單越好。復雜意味着不可靠,為什么說不可靠呢,可能有些人覺得我太絕對了,在軟件項目中人越多那隨之帶來的各種BUG也就越多。復雜的系統一定要多人的合作才可以完成,這個是不容置疑的。而且每個人對項目的理解不同,對軟件開發的理解也不盡相同,雖然可以統一項目組中每個人的代碼風格,但是沒有辦法統一每個人的思考方式。
游戲服務器,游戲的所有邏輯都在游戲服務器中實現,對於我現在要做的這款飛行類的頁游而言,已經足夠了。游戲服務器由N個節點組成,根據負載可動態增加節點數量。游戲數據庫也是用Mnesia實現,但是和賬號數據庫是分離的,他們之間不需要知道互相的存在,從上圖也可以看出。如果項目到后期變的更復雜,那游戲服務器這里可以分出單獨的節點做復雜的計算,甚至可以把這樣的節點單獨的隔離到其他的物理機,保證游戲的響應速度。
總結,架構的游戲世界是個統一的游戲世界,所有用戶都在同一個世界中。所有服務器中的節點都是通過負載動態增加的,部署的時候可以部署到同一個物理機上也可以部署到不同的物理機上。做了這么多年的C++服務器,感覺用C++寫服務器要實現的東西太多了,要考慮的東西也太多了,讓人很累。雖然說是為了效率考慮,但是我覺得如果C++代碼寫不好,最終的效率反而更不好。我認為一個中級的Erlang程序寫出來的服務器可以和一個高級的C++寫的服務器程序相媲美,但是培養一個Erlang高手和培養一個C++高手的代價顯然是不一樣的。
