2012-12-01 32 views
2

我正在創建一個網站,允許玩家排隊尋找類似技能的多人遊戲視頻遊戲。簡單的網絡後端只修改一個數據庫,並使用模板創建響應,但除此之外,我的後端有:當Web後端不僅僅是回覆請求時,應該如何構建我的應用程序?

  • 溝通與玩家在實時(通過GEVENT-socketio),而他們排隊或播放
  • 在後臺運行的計算來找到平衡的遊戲,慢慢地影響遊戲質量,等待時間長(並通過SocketIO通知玩家在遊戲已發現)通過UDP套接字進行遊戲
  • 監視器(如果玩家斷開連接,詢問隊列替代)並最終更新數據庫結果

我知道我會如何單獨做這些事情,但我想知道如何分開這些組件並讓它們進行通信。我想象我的Web框架(Flask)在其他方面不應該參與其中。

由於我已經必須使用gevent,我目前正計劃爲這些任務中的每一個啓動單獨的greenlet。這將適用於我所有的任務(可能計算例外),因爲它們通常會等待發生的事情。但是,這不會擴展,因爲我無法運行更多的Flask實例。一切都將取決於在單個線程中運行的greenlet。

那麼這是最好的方式?是否有另一種方法來處理分離這些任務(特別是對於將來可能沒有協同程序的語言)?我聽說過RabbitMQ/ZeroMQ和Celery等工具,但我不確定如何以及是否用它們來解決這個問題。

回答

1

我的第一個想法是,您可以使用面向服務的體系結構來分離這些任務。這些服務中的每一個都可以在單獨的端口(或機器(或機器池))上運行Flask應用程序,並使用簡單的HTTP相互通信。細分可能是這樣的:

  • GameService:處理來自玩家的傳入連接並通過socketio與他們進行通信。
  • GameFinderService:接受來自GameService的POST請求以開始爲玩家X尋找遊戲。接受來自GameService的GET請求以獲得用於玩家X的下一個最佳遊戲。您可以使用Redis作爲每個連接播放器的短期隊列遊戲的後備存儲,每當GameStatusService(下文)通知我們進行更改時,遊戲會進行更新。
  • GameStatusService:通過UDP監視正在進行的遊戲,當發生重要事件時新遊戲創建,玩家斷開連接等,它會通知GameFinderService更改。然後,GameFinderService會針對每個連接的玩家適當地更新其隊列。

Redis真的很不錯,因爲它作爲一個數據結構存儲,可以讓您維護短期和長期數據結構(如隊列),而無需太多開銷。

+0

我想。 HTTP不是必需的。使用簡單的純文本或序列化結構的Socketio就足夠了。 – arilou

相關問題