我正在开发一个实时多人游戏与websocket (Python3 + autobahn)
游戏将在房间里进行。一个房间里的玩家应该被分组在一起,以便发送信息、玩游戏等。所以它或多或少有点像聊天服务器。
我很难将其扩展到多服务器场景。我做了一些搜索,但对我找到的结果并不满意。
我想到的一种方法是使用nginx + lua。
所以我们的想法是当玩家加入一个特定的房间时,它将在消息中发送房间id。使用nginx + lua,我打算决定它应该去哪个应用服务器实例。结果是,同一房间的所有玩家最终都会出现在相同的情况下。
几个问题:
- nginx + lua可以拦截websocket消息然后通过连接吗?
- 这将涉及反向代理层中的硬编码逻辑。后端连接也将被硬编码。有没有办法让它们变得动态?
对于这是否是个好主意的任何建议,以及对更好的设计的建议,我们都很感激。
如果房间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。