扩展websocket游戏应用服务器



我正在开发一个实时多人游戏与websocket (Python3 + autobahn)

游戏将在房间里进行。一个房间里的玩家应该被分组在一起,以便发送信息、玩游戏等。所以它或多或少有点像聊天服务器。

我很难将其扩展到多服务器场景。我做了一些搜索,但对我找到的结果并不满意。

我想到的一种方法是使用nginx + lua。

所以我们的想法是当玩家加入一个特定的房间时,它将在消息中发送房间id。使用nginx + lua,我打算决定它应该去哪个应用服务器实例。结果是,同一房间的所有玩家最终都会出现在相同的情况下。

几个问题:

    nginx + lua可以拦截websocket消息然后通过连接吗?
  1. 这将涉及反向代理层中的硬编码逻辑。后端连接也将被硬编码。有没有办法让它们变得动态?

对于这是否是个好主意的任何建议,以及对更好的设计的建议,我们都很感激。

如果房间ID在URL中,您可以使用openrest来解析它,然后将proxy_pass目标更改为所需的后端。要做到这一点,你需要在nginx中定义一个变量,然后在access_by_lua中设置它,最后代理传递给新变量。

你可以通过将房间ID ->后端服务器地址映射存储在你最喜欢的数据库中并使用openresty读取它来动态查找,甚至使用openresty的共享字典来缓存映射,这样它就不会冲击数据库。

那么在nginx.conf的location块中你应该有这样的内容:

set $target '';
access_by_lua '
  --[[
    - parse the url/headers
    - lookup the room ID in the database
  --]]
  ngx.var.target = host
'; 
proxy_pass http://$target;

另一个选择取决于你的游戏将移动一些逻辑本身开放,因为它可以直接处理websockets。

相关内容

  • 没有找到相关文章

最新更新