17.使用多个工作站

优质
小牛编辑
142浏览
2023-12-01

Flask-SocketIO从2.0版本起带有负载均衡器支持多个工作站。部署多个工作站给了使用Flask-SocketIO的应用程序有能力在多进程和多主机之间传播客户端链接,这种方式的扩展支持极大规模的并发客户端。

使用多个Flask-SocketIO工作站需要两个依赖:
* 负载均衡器必须要配置成总是将所有的HTTP请求从一个给定的客户端转发到同样的工作站中。这有时会作为sticky session被提及。对于nginx,使用这个ip_bash指示来达到上述要求。Gunicorn不能用于多工作站,因为它的负载均衡算法并不支持粘性会话(sticky session)。
* 一旦每个服务器只拥有一个客户端连接,在Redis、RabbitMQ等例子中,消息队列将会被使用,来协调复杂的操作,比如:广播和房间。

当使用消息队列的时候,有许多额外的依赖包需要被安装:
* 对于Redis,redis包必须被安装(pip install redis)。
* 对于RabbitMQ,kombu包必须要被安装(pip install kombu)。
* 对于其它Kombu支持的消息队列,Kombu documentation里可以找到需要的依赖。
* 如果使用了eventlet或者gevent,那么通常需要使用猴子(Monkey)修补Python标准库来强制消息队列包使用协同友好的函数和类。

为了启动多个Flask-SocketIO服务器,你必须首先确保消息队列服务正在运行。为了开启一个Socket.IO服务器,使他连接到一个消息队列,需要添加参数message_queue到构造函数SockIO:
socketio=SocketIO(app,message_queue='redis://')
参数message_queue的值就是队列服务所使用的连接URL。对于一个运行在同一个作为服务器的主机中的Redis队列来说,可以使用redis://这样的URL。同样,对于一个默认的RabbitMQ队列可以使用amqp://开头的URL。Kombu包有一个文档章节阐述了对于所有支持队列的URL格式。