Go遊戲伺服器開發的一些思考(二十八):登入流程(一)
阿新 • • 發佈:2019-01-09
過程與不確定因素
帳號登入是一個跨多個服務程序的一段持續的互動過程。
如IO遊戲,會涉及到的遊戲伺服器有:
- 登入伺服器
- 資料庫伺服器
- 快取伺服器
- 中心伺服器(很多別名,如CenterServer、WorldServer;也可能是redis、etcd之類的)
- 遊戲伺服器(很多別名,如RoomServer、CellServer、GameServer)
- 閘道器伺服器
在這個過程中,可能會有很多意外、或者惡意行為:
- 同個帳號在多個終端登入
- 同個帳號登入報文被持續多次傳送
- 登入過程中,某服務程序失效
- 登入過程中,終端連線已斷開
因此不嚴謹的登入邏輯會出各種問題。
這裡提供了3種方法來確保登入過程健壯:
- 多段登入
- 服務無狀態化
- 時序圖推導
多段登入
顯然,登入過程越長、涉及的服務程序越多,那麼不確定因素風險越大。
仔細觀察這些服務程序,如果伺服器架構合理,那麼通常可以把伺服器架構按功能區塊化(俗稱“微服化”)。
那麼根據“分而治之”的原理,如果能把整個登入過程拆成多塊,每塊登入相對獨立,做成多段式登入。則有下面的好處:
- 登入複雜度被降冪,登入過程變簡單了
- 多段登入後,即使某段登入不成功,也只會讓某部分遊戲功能失效
這裡舉例下IO遊戲的多段登入,通常會這樣做劃分:
- 遊戲大廳段登入(該段保證了能正常進遊戲大廳)
- 遊戲房間段登入(該段保證了能正常進房間遊戲)
- 跨服閘道器段登入(該段保證了能正常跨服操作,如跨服聊天等)
服務無狀態化
多服務程序間通訊,之所以容易產生BUG。其中的一大原因為,差的程式碼實現,會在多個程序中儲存同一個帳號相關的資料。因此容易發生服務程序間資料不同步。
所有型別伺服器都是可以做成無狀態化的,這樣登入過程的複雜度又降了一個冪次。
時序圖推導
涉及到多服務程序互動過程的,如果直接編碼,從程式碼上Review這個過程是否正常。通常會很困難。
如果有工具能把整個過程清晰的描繪出來,那麼檢查其中的錯誤,會方便很多。整個過程的流程都確定OK後,再做編碼,可以事半功倍。
這個工具就是時序圖
後續文章介紹
接下來的文章,將根據上面分析的3段登入,給每段設計一個嚴謹完整的登入過程。