Python Socket.io连接在多个服务器之间的分布
我正在开发DB设计工具(python,gevent socket.io)。在这些工具中,多个用户可以讨论一个数据库模型,在运行时接收更改。为了支持此功能,我使用socket.io。我想扩展一些可以轻松处理socket.io连接的服务器。最简单的方法是设置nginx以根据模型ID选择服务器 我喜欢模块方法,模型ID除以服务器数量。所以,如果我有3个节点,模型1将在第一个节点上处理,2对第二个节点,3对第三个节点,4对第一个节点,等等 我的模型加载请求看起来像/models/,所以这里没有问题-可以解析参数以找到服务器来处理它。但加载模型页面后,JS尝试建立连接:Python Socket.io连接在多个服务器之间的分布,python,socket.io,gevent-socketio,Python,Socket.io,Gevent Socketio,我正在开发DB设计工具(python,gevent socket.io)。在这些工具中,多个用户可以讨论一个数据库模型,在运行时接收更改。为了支持此功能,我使用socket.io。我想扩展一些可以轻松处理socket.io连接的服务器。最简单的方法是设置nginx以根据模型ID选择服务器 我喜欢模块方法,模型ID除以服务器数量。所以,如果我有3个节点,模型1将在第一个节点上处理,2对第二个节点,3对第三个节点,4对第一个节点,等等 我的模型加载请求看起来像/models/,所以这里没有问题-可以
var socket = io.connect('/models', {
'reconnection limit': 4000
});
它访问默认端点,因此服务器接收以下请求:
http://example.com/socket.io/1/xhr-pooling/111111?=1111111
为了处理它,我以以下方式创建应用程序:
SocketIOServer((app.config['HOST'], app.config['PORT']), app, resource='socket.io', transports=transports).serve_forever()
然后
@bp.route('/<path:remaining>')
def socketio(remaining):
app = current_app._get_current_object()
try:
# Hack: set app instead of request to make it available in the namespace.
socketio_manage(request.environ, {'/models': ModelsNamespace}, app)
except:
app.logger.error("Exception while handling socket.io connection", exc_info=True)
return Response()
@bp.route(“/”)
def socketio(剩余):
app=current\u app.\u get\u current\u object()
尝试:
#Hack:设置app而不是request,使其在名称空间中可用。
socketio_manage(request.environ,{'/models':ModelsNamespace},app)
除:
app.logger.error(“处理socket.io连接时出现异常”,exc_info=True)
返回响应()
我想换成
http://example.com/socket.io/<model_id>/1/xhr-pooling/111111?=1111111
http://example.com/socket.io//1/xhr-pooling/111111?=1111111
能够在ngnix中选择正确的服务器。怎么做
更新
我还喜欢在尝试建立连接时检查用户权限。我想用socketio(remaining)方法来实现这一点,但我还是需要知道他试图访问的模型
更新2
我实现了权限验证器,从HTTP\u REFERER获取模型id。看起来,这只是包含模型标识符的请求的一部分(值的示例:)。第一个想法是告诉客户端当前可用的服务器。 此外,您可以按优先级为客户端生成服务器列表,只需按顺序将它们放入javascript生成的数组中即可。 这个答案意味着您的服务器可以在任何型号上进行应答,您可以通过更改新客户端生成列表中的服务器顺序来控制服务器加载 我认为这是一种更灵活的方式。但如果您愿意,您可以在nginx中解析查询字符串,并在任何底层服务器上路由请求,只需为“model id server port”关系创建一个表即可 Upd:只想着你的任务。并找到另一个解决方案。当您生成客户端网页时,可以在js中的某个地方使用内联服务器。然后,当您请求模型更新时,只需使用另一个参数
serverId = modelId%ServersCount;
这将是nginx中路由的服务器标识符。
然后在nginx配置中,您可以使用简单的解析查询字符串,并通过serverId参数将请求路由到服务器
在“元语言”中,它将是
io.connect(url, {query: "foo=bar"})
你是说不同的nginx服务器还是不同的数据库服务器?我有一个处理Socket.io连接的应用程序。我运行了这个应用程序的几个实例,并设置nginx在它们之间平均分配请求。因此,我有几个烧瓶应用程序和一个ngnix在他们面前。谢谢你的答复。当客户端请求某个页面,而服务器返回该页面时,您可以将其编写为常规请求。但这里我有更复杂的情况——我使用socket.io库,它创建请求而不是我,所以我在这里没有控制权。此外,我的节点是有状态的,所以我不能在不同的服务器上处理相同型号的用户。您可以传递url并向其传递多个参数。您不需要控制socket io中的某些内容,请看这里如何将传统参数传递给socket IOTS,以便链接到本文
io.connect(url,{query:“foo=bar”})
是我需要的。现在,我可以使用附加的GET参数来确定模型的ID是什么以及哪个服务器应该处理它。请在您的帖子中添加关于修改socket.io请求的信息,我将结束这个问题。