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

  1. get parameter serverid var $servportsuffix
  2. route request localhost:80$servportsuffix

or routing idea.

you can add additional parameters socket.io via

io.connect(url, {query: "foo=bar"}) 

Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

javascript - addthis share facebook and google+ url -

ios - Show keyboard with UITextField in the input accessory view -