【问题标题】:scaling websocket game application server扩展 websocket 游戏应用服务器
【发布时间】:2016-12-18 23:06:24
【问题描述】:

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

游戏将在房间内进行。单个房间中的玩家应该分组在一起,以便进行消息传递、玩游戏等。所以它或多或少像一个聊天服务器。

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

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

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

几个问题:

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

任何关于这是否是好主意的建议以及更好的设计建议。

【问题讨论】:

    标签: python nginx websocket lua


    【解决方案1】:

    如果房间 ID 在 URL 中,您可以使用 openresty 对其进行解析,然后将 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;
    

    另一个取决于您的游戏的选择是将一些逻辑本身移动到 openresty,因为它可以直接处理 websocket。

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 2014-03-01
      • 2011-11-14
      • 2012-10-12
      • 2019-08-13
      • 2015-10-15
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多