Python 扩展websocket游戏应用服务器

Python 扩展websocket游戏应用服务器,python,nginx,websocket,lua,Python,Nginx,Websocket,Lua,我正在用websocket(蟒蛇3+高速公路)开发一款实时多人游戏 游戏将在室内进行。单个房间中的玩家应该分组在一起,以允许发送消息、玩游戏等。因此,它或多或少类似于聊天服务器 我很难将其扩展到多服务器场景。我做了一些搜索,但对找到的结果不满意 我想到的一种方法是使用nginx+lua 因此,当玩家加入一个特定的房间时,它会在消息中发送房间id。使用nginx+lua,我计划决定应该访问哪个应用服务器实例。结果是,同一个房间中的所有玩家最终都会出现在同一个实例中 有几个问题: nginx+lua

我正在用websocket(蟒蛇3+高速公路)开发一款实时多人游戏

游戏将在室内进行。单个房间中的玩家应该分组在一起,以允许发送消息、玩游戏等。因此,它或多或少类似于聊天服务器

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

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

因此,当玩家加入一个特定的房间时,它会在消息中发送房间id。使用nginx+lua,我计划决定应该访问哪个应用服务器实例。结果是,同一个房间中的所有玩家最终都会出现在同一个实例中

有几个问题:

  • nginx+lua能否拦截websocket消息,然后传递连接
  • 这将涉及反向代理层中的硬编码逻辑。后端连接也将被硬编码。有没有办法让它们充满活力

  • 任何关于这是否是一个好主意的建议以及更好设计的建议都将受到欢迎。

    如果房间ID在URL中,您可以使用openresty对其进行解析,然后将代理传递目标更改为所需的后端。 为此,您需要在nginx中定义一个变量,然后在access_by_lua中设置它,最后代理传递给新变量

    您可以通过将房间ID->后端服务器地址映射存储在您喜爱的数据库中并使用openresty读取来动态查找,甚至可以使用openresty的共享dict缓存映射,这样它就不会影响数据库

    因此,在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,因为它可以直接处理WebSocket。

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

    您可以通过将房间ID->后端服务器地址映射存储在您喜爱的数据库中并使用openresty读取来动态查找,甚至可以使用openresty的共享dict缓存映射,这样它就不会影响数据库

    因此,在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,因为它可以直接处理WebSocket