1. 程式人生 > >Go遊戲伺服器開發的一些思考(二十八):登入流程(一)

Go遊戲伺服器開發的一些思考(二十八):登入流程(一)

過程與不確定因素

帳號登入是一個跨多個服務程序的一段持續的互動過程。

如IO遊戲,會涉及到的遊戲伺服器有:

  • 登入伺服器
  • 資料庫伺服器
  • 快取伺服器
  • 中心伺服器(很多別名,如CenterServer、WorldServer;也可能是redis、etcd之類的)
  • 遊戲伺服器(很多別名,如RoomServer、CellServer、GameServer)
  • 閘道器伺服器

在這個過程中,可能會有很多意外、或者惡意行為:

  • 同個帳號在多個終端登入
  • 同個帳號登入報文被持續多次傳送
  • 登入過程中,某服務程序失效
  • 登入過程中,終端連線已斷開

因此不嚴謹的登入邏輯會出各種問題。

這裡提供了3種方法來確保登入過程健壯:

  1. 多段登入
  2. 服務無狀態化
  3. 時序圖推導

多段登入

顯然,登入過程越長、涉及的服務程序越多,那麼不確定因素風險越大。

仔細觀察這些服務程序,如果伺服器架構合理,那麼通常可以把伺服器架構按功能區塊化(俗稱“微服化”)。

那麼根據“分而治之”的原理,如果能把整個登入過程拆成多塊,每塊登入相對獨立,做成多段式登入。則有下面的好處:

  • 登入複雜度被降冪,登入過程變簡單了
  • 多段登入後,即使某段登入不成功,也只會讓某部分遊戲功能失效

這裡舉例下IO遊戲的多段登入,通常會這樣做劃分:

  • 遊戲大廳段登入(該段保證了能正常進遊戲大廳)
  • 遊戲房間段登入(該段保證了能正常進房間遊戲)
  • 跨服閘道器段登入(該段保證了能正常跨服操作,如跨服聊天等)

服務無狀態化

多服務程序間通訊,之所以容易產生BUG。其中的一大原因為,差的程式碼實現,會在多個程序中儲存同一個帳號相關的資料。因此容易發生服務程序間資料不同步。

所有型別伺服器都是可以做成無狀態化的,這樣登入過程的複雜度又降了一個冪次。

時序圖推導

涉及到多服務程序互動過程的,如果直接編碼,從程式碼上Review這個過程是否正常。通常會很困難。

如果有工具能把整個過程清晰的描繪出來,那麼檢查其中的錯誤,會方便很多。整個過程的流程都確定OK後,再做編碼,可以事半功倍。

這個工具就是時序圖

後續文章介紹

接下來的文章,將根據上面分析的3段登入,給每段設計一個嚴謹完整的登入過程。