我正在开发数据库设计工具(python、gevent-socket.io)。在这些工具中,多个用户可以讨论一个数据库模型,在运行时接收更改。为了支持这个特性,我使用了 socket.io。我想扩展轻松处理 socket.io 连接的服务器数量。最简单的方法是设置 nginx 根据模型 ID 选择服务器。
我想要模块方法,其中模型 ID 除以服务器数量。因此,如果我有 3 个节点,模型 1 将首先处理,2 - 在第二个,3 - 在第三个,4 - 在第一个等等。
我的模型加载请求看起来像 /models/,所以这里没有问题 - 可以解析参数以找到服务器来处理它。但是模型页面加载后,JS尝试建立连接:
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()
我想把它改成
http://example.com/socket.io/<model_id>/1/xhr-pooling/111111?=1111111
能够在 ngnix 中选择正确的服务器。怎么做?
更新
我还想在尝试建立连接时检查用户权限。我想用 socketio(remaining) 方法来做,但是,我需要再次知道他试图访问什么模型。
更新 2
我实现了权限验证器,从 HTTP_REFERER 获取 model_id。似乎,它只是包含模型标识符的请求的一部分(值示例:http ://example.com/models/1/ )。