2016-08-12 33 views
1

我發展與WebSocket的實時多玩家遊戲(Python3 +高速公路)縮放的WebSocket遊戲應用服務器

這場比賽將在客房內播放。單個房間中的玩家應該組合在一起以允許消息傳遞,遊戲等等。因此它或多或少像聊天服務器。

我很難將其擴展到多服務器場景。我做了一些搜索,但不滿意我找到的結果。

我想出的一個方法是用nginx + lua。

所以這個想法是,當一個玩家加入一個特定的房間時,它會在消息中發送房間ID。有了nginx + lua,我打算決定應該去哪個應用服務器實例。結果是同一個房間裏的所有玩家最終都會以同樣的方式結束。

幾個問題:

  1. 能nginx的+盧阿攔截WebSocket的消息,然後通過連接?
  2. 這將涉及反向代理層中的硬編碼邏輯。後端連接也將被硬編碼。有沒有辦法讓它們變成動態的?

任何暗示這是否是好主意的建議都可以作爲更好設計的建議。

回答

0

如果房間ID在URL中,您可以使用openresty解析它,然後將proxy_pass目標更改爲所需的後端。 爲此,您可以在nginx中定義一個變量,然後將其設置在access_by_lua中,最後將代理傳遞給新變量。

您可以通過在您喜歡的數據庫中存儲房間ID - >後端服務器地址映射並使用openresty讀取它,甚至使用openresty的共享字典來緩存映射,使其不會影響數據庫。

所以在你nginx.conf的位置塊,你會碰到這樣的:

set $target ''; 
access_by_lua ' 
    --[[ 
    - parse the url/headers 
    - lookup the room ID in the database 
    --]] 

    ngx.var.target = host 
'; 
proxy_pass http://$target; 

取決於你的遊戲另一種選擇是將一些邏輯本身來openresty,因爲它能夠處理的WebSockets直。