@@ -8,7 +8,7 @@ socketio documentation
8
8
9
9
:ref: `genindex ` | :ref: `modindex ` | :ref: `search `
10
10
11
- This project implements an Socket.IO server that can run standalone or
11
+ This project implements a Socket.IO server that can run standalone or
12
12
integrated with a Python WSGI application. The following are some of its
13
13
features:
14
14
@@ -49,6 +49,10 @@ written in JavaScript.
49
49
Getting Started
50
50
---------------
51
51
52
+ The Socket.IO server can be installed with pip::
53
+
54
+ pip install python-socketio
55
+
52
56
The following is a basic example of a Socket.IO server that uses Flask to
53
57
deploy the client code to the browser::
54
58
@@ -106,8 +110,8 @@ Rooms
106
110
107
111
Because Socket.IO is a bidirectional protocol, the server can send messages to
108
112
any connected client at any time. To make it easy to address groups of clients,
109
- the application can put clients into rooms, and then address messages to all
110
- the clients in a room.
113
+ the application can put clients into rooms, and then address messages to the
114
+ entire room.
111
115
112
116
When clients first connect, they are assigned to their own rooms, named with
113
117
the session ID (the ``sid `` argument passed to all event handlers). The
@@ -204,6 +208,65 @@ methods in the :class:`socketio.Server` class.
204
208
When the ``namespace `` argument is omitted, set to ``None `` or to ``'/' ``, the
205
209
default namespace, representing the physical connection, is used.
206
210
211
+ Using a Message Queue
212
+ ---------------------
213
+
214
+ The Socket.IO server owns the socket connections to all the clients, so it is
215
+ the only process that can emit events to them. A common need of larger
216
+ applications is to emit events to clients from a different process, like a
217
+ a `Celery <http://www.celeryproject.org/ >`_ worker, or any other auxiliary
218
+ process that works in conjunction with the server.
219
+
220
+ To enable these other processes to emit events, the server can be configured
221
+ to listen for events to emit to clients on a message queue such as
222
+ `Redis <http://redis.io/ >`_ or `RabbitMQ <https://www.rabbitmq.com/ >`_.
223
+ Processes that need to emit events to client then post these events to the
224
+ queue.
225
+
226
+ Another situation in which the use of a message queue is necessary is with
227
+ high traffic applications that work with large number of clients. To support
228
+ these clients, it may be necessary to horizontally scale the Socket.IO
229
+ server by splitting the client list among multiple server processes. For this
230
+ type of installation, the server processes communicate with each other through
231
+ ta message queue.
232
+
233
+ The message queue service needs to be installed and configured separately. By
234
+ default, the server uses `Kombu <http://kombu.readthedocs.org/en/latest/ >`_
235
+ to read and write to the queue, so any message queue supported by this package
236
+ can be used. Kombu can be installed with pip::
237
+
238
+ pip install kombu
239
+
240
+ To configure a Socket.IO server to connect to a message queue, the
241
+ ``client_manager `` argument must be passed in the server creation. The
242
+ following example instructs the server to connect to a Redis service running
243
+ on the same host and on the default port::
244
+
245
+ redis = socketio.KombuManager('redis://localhost:6379/')
246
+ sio = socketio.Server(client_manager=redis)
247
+
248
+ For a RabbitMQ queue also running on the local server, the configuration is
249
+ as follows::
250
+
251
+ amqp = socketio.KombuManager('amqp://guest:guest@localhost:5672//')
252
+ sio = socketio.Server(client_manager=amqp)
253
+
254
+ The arguments passed to the ``KombuManager `` constructor are passed directly
255
+ to Kombu's `Connection object
256
+ <http://kombu.readthedocs.org/en/latest/userguide/connections.html> `_.
257
+
258
+ If multiple Sokcet.IO servers are connected to a message queue, they
259
+ automatically communicate with each other and manage a combine client list,
260
+ without any need for additional configuration. To have a process other than
261
+ the server connect to the queue to emit a message, the same ``KombuManager ``
262
+ class can be used. For example::
263
+
264
+ # connect to the redis queue
265
+ redis = socketio.KombuManager('redis://localhost:6379/')
266
+
267
+ # emit an event
268
+ redis.emit('my event', data={'foo': 'bar'}, room='my room')
269
+
207
270
Deployment
208
271
----------
209
272
@@ -239,16 +302,14 @@ command to launch the application under gunicorn is shown below::
239
302
$ gunicorn -k eventlet -w 1 module:app
240
303
241
304
Due to limitations in its load balancing algorithm, gunicorn can only be used
242
- with one worker process, so the ``-w 1 `` option is required. Note that a
243
- single eventlet worker can handle a large number of concurrent clients.
244
-
245
- Another limitation when using gunicorn is that the WebSocket transport is not
246
- available, because this transport it requires extensions to the WSGI standard.
305
+ with one worker process, so the ``-w `` option cannot be set to a value higher
306
+ than 1. A single eventlet worker can handle a large number of concurrent
307
+ clients, each handled by a greenlet.
247
308
248
- Note: Eventlet provides a ``monkey_patch() `` function that replaces all the
249
- blocking functions in the standard library with equivalent asynchronous
250
- versions. While python-socketio does not require monkey patching, other
251
- libraries such as database drivers are likely to require it.
309
+ Eventlet provides a ``monkey_patch() `` function that replaces all the blocking
310
+ functions in the standard library with equivalent asynchronous versions. While
311
+ python-socketio does not require monkey patching, other libraries such as
312
+ database drivers are likely to require it.
252
313
253
314
Gevent
254
315
~~~~~~
@@ -293,14 +354,14 @@ Or to include WebSocket::
293
354
$ gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 module: app
294
355
295
356
Same as with eventlet, due to limitations in its load balancing algorithm,
296
- gunicorn can only be used with one worker process, so the ``-w 1 `` option is
297
- required. Note that a single eventlet worker can handle a large number of
298
- concurrent clients.
357
+ gunicorn can only be used with one worker process, so the ``-w `` option cannot
358
+ be higher than 1. A single gevent worker can handle a large number of
359
+ concurrent clients through the use of greenlets .
299
360
300
- Note: Gevent provides a ``monkey_patch() `` function that replaces all the
301
- blocking functions in the standard library with equivalent asynchronous
302
- versions. While python-socketio does not require monkey patching, other
303
- libraries such as database drivers are likely to require it.
361
+ Gevent provides a ``monkey_patch() `` function that replaces all the blocking
362
+ functions in the standard library with equivalent asynchronous versions. While
363
+ python-socketio does not require monkey patching, other libraries such as
364
+ database drivers are likely to require it.
304
365
305
366
Standard Threading Library
306
367
~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -351,14 +412,11 @@ multiple servers), the following conditions must be met:
351
412
using eventlet, gevent, or standard threads. Worker processes that only
352
413
handle one request at a time are not supported.
353
414
- The load balancer must be configured to always forward requests from a
354
- client to the same process. Load balancers call this *sticky sessions *, or
355
- *session affinity *.
356
-
357
- A limitation in the current release of the Socket.IO server is that because
358
- the clients are randomly assigned to different server processes, any form of
359
- broadcasting is not supported. A storage backend that enables multiple
360
- processes to share information about clients is currently in development to
361
- address this important limitation.
415
+ client to the same worker process. Load balancers call this *sticky
416
+ sessions *, or *session affinity *.
417
+ - The worker processes communicate with each other through a message queue,
418
+ which must be installed and configured. See the section on using message
419
+ queues above for instructions.
362
420
363
421
API Reference
364
422
-------------
0 commit comments