1. 程式人生 > 實用技巧 >分散式遊戲閘道器--fooking

分散式遊戲閘道器--fooking

>>> hot3.png

這個專案醞釀很久了,但是一直以來比較忙,加上游戲癮比較大,所以也拖了蠻久時間才開發完第一個版本!主要是做一個分散式的遊戲閘道器,負責訊息的轉發,專案地址: http://git.oschina.net/scgywx/fooking

222447_G7Ft_140911.jpg

不是什麼

1、不是框架
2、不是擴充套件
3、不是Http server

是什麼

fooking是一個分散式遊戲閘道器,主要用於承載長連線,將客戶端的資料包完整的轉發給後端,後端服務處理完之後由fooking轉發給客戶端。
好像聽起來有點像nginx+fpm?嗯!沒錯,如果是單純的request/response,跟nginx類似;
但在遊戲中經常出現要主動推資料給客戶端,而沒有request,比如:A發訊息給B,B是沒有request的,只有response.

嗯哼?就這些功能?聽上也沒什麼吸引力啊。。
當然不只如此,他包括:
1、分散式閘道器配置,只需要簡單配置就能動態新增閘道器,以提供更多的連線數量;
2、SESSION維持,每個連線會有唯一sessionid,後端只需要指定sessionid傳送訊息即可,不用關心這個連線在哪臺機器上;
3、組播,N個使用者加入到一組,只需要向組名傳送訊息即可,不用關心這個組有多少人(當然你非要自己去迴圈session傳送我也阻止不了你);
4、伺服器狀態監控,可以觀察到當前有多少組伺服器,總共有多少連線,每臺伺服器上有多少連線,哪些空閒,哪些繁忙;
5、客戶端連線與斷開事件通知;
6、後端無語言限制,遵循fastcgi協議即可;

優勢

1、節約硬體,遊戲通常剛開區壓力比較大,過段時間人少了就沒多少壓了,配置多臺伺服器完全可以迴圈開服;
2、後端無痛熱更,例如php-fpm重啟或者是熱更程式碼,客戶端完全沒有察覺;
3、開發方便,跟開發web一樣,只需將要傳送的資料直接輸出即可(需要新增Content-Length用於確定包大小,詳見協議說明)

4、PHP錯誤能在log檔案裡一覽無餘,並且錯誤不會對fooking有任何影響

架構

fooking由一個router與多個gateway組成,所有gateway都會去連線router,後端主動推送的訊息由router派發給gateway,然後由gateway轉發客戶端.
request/response模式下不需要router干預,僅僅是gateway與backend(php-fpm)通訊.

協議

閘道器為什麼會有協議?既然是訊息轉發,就必須將一個包完整的發到後端,而不是讓後端來檢測包是否完整;
協議分為兩種,一種是前端協議,一種是後端協議
前端協議是指客戶端與fooking的互動協議,這個很簡單,32位int + data(準備下個版本支援lua進行自定義協議).
後端協議是使用Fastcgi,這就意味著,後端無所謂什麼語言,只需要遵循fastcgi協議即可,我是phper,當然推薦使用fpm;
注: 後端返回的資料必須有Content-Length標識返回資料長度,否則一律視為不返回資料到客戶端,
另外資料是由後後向前切取,比如輸出內容為abcdef,而Content-Length: 3,那麼客戶端會收到def..

編譯

在fooking目錄下執行make即可,啟動需要cd src

配置

具體的配置請詳見src/config.lua與src/router.lua

啟動router

./fooking router.lua

啟動gateway

./fooking config.lua

example

已做了個簡單的聊天室,位於example/chat
使用方法:
1、使用nginx或者apache將目錄指向example/chat目錄,並修改index.html的伺服器IP與埠(需要訪問index.html和chat.swf)
2、執行python flash.py(flash的安全沙箱,因為客戶端是使用flash socket)
3、配置router.lua和config.lua,然後啟動router和gateway
4、訪問localhost/index.html


轉載於:https://my.oschina.net/scgywx/blog/354334