扩展 WebSocket 游戏应用服务器

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

游戏将在房间内进行。同一房间内的玩家应该被分组,以便于消息传递、游戏玩法等等。因此,它更或多或少像一个聊天服务器。

我在将其扩展到多服务器方面遇到了一些困难。我进行了一些搜索,但是对我找到的结果并不满意。

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

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

一些问题:

  1. nginx + lua 能否拦截 WebSocket 消息然后传递连接?
  2. 这将涉及在反向代理层中硬编码逻辑。而后端连接也将被硬编码。有没有办法使它们动态化?

欢迎任何关于这是否是好的设计想法的建议,还有更好的设计方案的建议。

点赞
用户4554496
用户4554496

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

您可以通过将房间 ID -> 后端服务器地址映射存储在您喜欢的数据库中并通过 openresty 读取它来使查找动态化,甚至可以使用 openresty 的共享字典来缓存映射,使其不会使数据库受到过多的压力。

因此,在 nginx.conf 的位置块中,您应该有类似以下的东西:

set $target '';
access_by_lua '
  --[[
    - 解析 URL/头文件
    - 在数据库中查找房间 ID
  --]]

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

根据您的游戏,另一种选择是将一些逻辑本身移动到 openresty 中,因为它可以直接处理 WebSocket。

2016-08-12 09:49:25