python - Socket.io connections distribution between several servers -
i'm working on db design tool (python, gevent-socket.io). in these tool multiple users can discuss 1 db model, receiving changes in runtime. support feature, i'm using socket.io. i'd extend number of servers handle socket.io connection easily. simplest way set nginx choose server basing of model id.
i'd module approach, model id divided number of servers. if have 3 nodes, model 1 handled on first, 2 - on second, 3 - on third, 4 - on first again etc.
my request model loading looks /models/, no problem here - argument can parsed find server handle it. after model page loaded, js tries establish connection:
var socket = io.connect('/models', { 'reconnection limit': 4000 });
it accesses default endpoint, server receives following requests:
http://example.com/socket.io/1/xhr-pooling/111111?=1111111
to handle it, create application way:
socketioserver((app.config['host'], app.config['port']), app, resource='socket.io', transports=transports).serve_forever()
and then
@bp.route('/<path:remaining>') def socketio(remaining): app = current_app._get_current_object() try: # hack: set app instead of request make available in namespace. socketio_manage(request.environ, {'/models': modelsnamespace}, app) except: app.logger.error("exception while handling socket.io connection", exc_info=true) return response()
i'd change
http://example.com/socket.io/<model_id>/1/xhr-pooling/111111?=1111111
to able choose right server in ngnix. how it?
update
i check user permissions when tries establish connection. i'd in socketio(remaining) method, but, again, need know model trying access.
update 2
i implemented permission validator, taking model_id http_referer. seems, it's part of request contains identifier of model (example of values: http://example.com/models/1/).
the first idea - tell client side available servers current time. furthermore can generate server list client side priority, put them in javascript generated array order. answer means servers can answer on models, can control server loading changing servers ordering in generated list new clients.
i think more flexible way. if want - can parse query string in nginx , route request on underlying server - have table "model id-server port" relations
upd: thinking task. , find 1 solution. when generate client web page can inline servers count in js somewhere. then, when requesting model updates, use parameter founded
serverid = modelid%serverscount;
that server identificator routing in nginx. in nginx config can use simple parsing query string, , routing request server can find serverid parameter.
in "metalanguage" be
- get parameter serverid var $servportsuffix
- route request localhost:80$servportsuffix
or routing idea.
you can add additional parameters socket.io via
io.connect(url, {query: "foo=bar"})
Comments
Post a Comment