Nginx 负载平衡/路由使用socketio和flask制作的应用程序

Nginx 负载平衡/路由使用socketio和flask制作的应用程序,nginx,flask,socket.io,load-balancing,flask-socketio,Nginx,Flask,Socket.io,Load Balancing,Flask Socketio,在部署web应用程序时,我有点不知所措,我想确保我正在构建的一个小应用程序能够与我尝试使用的技术配合使用 我有一些使用flask的经验,但只使用过测试服务器。我的理解是,使用nginx或apache,如果我编写一个flask应用程序,访问我网站的每个用户都可以得到一个不同的flask应用程序实例,这到底是如何工作的,这让我有点困惑 我想制作的应用程序类似于聊天室/类似于“我们之间”的游戏。当用户访问网站时,他们加入一个大的“大厅”,可以加入一个已经存在的“房间”,或者启动一个新房间并生成一个代码

在部署web应用程序时,我有点不知所措,我想确保我正在构建的一个小应用程序能够与我尝试使用的技术配合使用

我有一些使用flask的经验,但只使用过测试服务器。我的理解是,使用nginx或apache,如果我编写一个flask应用程序,访问我网站的每个用户都可以得到一个不同的flask应用程序实例,这到底是如何工作的,这让我有点困惑

我想制作的应用程序类似于聊天室/类似于“我们之间”的游戏。当用户访问网站时,他们加入一个大的“大厅”,可以加入一个已经存在的“房间”,或者启动一个新房间并生成一个代码/ID,他们可以传递给他们的朋友,以便他们的朋友可以加入同一个会话(我认为socketio“房间”可以用于此)

但是,如果每个客户机都连接到自己的flask实例,那么每个服务器实例都能够看到其他实例上的“房间”吗?假设我的应用程序变得非常流行,并且我想在将来跨多台机器/AWS实例扩展大厅,那么我现在可以做些什么来确保这一点?或者,就flask socketio/nginx堆栈而言,跨多台计算机的扩展相当于跨单个计算机上的实例的扩展


基本上,我如何确保代码的大厅部分是可伸缩的。我是否需要做些什么来确保每个用户都能够与其他用户连接到房间,即使他们获得的是flask应用程序的不同实例?

我将专门就Socket.IO服务回答这个问题。您使用的应用程序或第三方服务的其他功能可能需要它们自己的水平扩展支持

使用Flask SocketIO,从一个实例扩展到两个或多个实例需要一个额外的部分,即消息队列,它通常是Redis或RabbitMQ,尽管还有一些选项

正如您在问题中明确指出的,当整个服务器位于单个实例中时,每个连接的客户机所在的房间等数据都可以在承载应用程序的单个进程的内存中随时可用

当您扩展到两个或多个实例时,您的客户机将被分区并随机分配到您的一个服务器。因此,您很可能会让一个房间中的参与者分布在多个服务器上

为了使事情顺利进行,服务器实例都连接到消息队列,并使用消息来协调复杂的操作,例如向房间广播

简言之,要从一个实例扩展到多个实例,只需部署一个消息队列,并更改Flask SocketIO服务器以指示队列的位置。例如,以下是单实例服务器实例化:

from flask_socketio import SocketIO

socketio = SocketIO(app)
下面是在localhost的默认6379端口上运行Redis消息队列的初始化:

from flask_socketio import SocketIO

socketio = SocketIO(app, message_queue='redis://')
应用程序代码不需要更改,Flask SocketIO通过在队列上发布消息来为您完成实例之间的所有协调


请注意,实例是托管在同一台服务器上还是托管在不同的服务器上并不重要。重要的是它们连接到同一个消息队列,以便能够进行通信。

非常感谢您给出了明确的答案。我将进一步研究flask socketio MQ文档。@Miguel感谢您提供的信息性回复,但我对您回答的一部分感到困惑:“随着flask socketio从一个实例扩展到两个或多个实例,需要一个额外的部分,一个消息队列”……所以我的问题是:这是扩展flask socketio的唯一方法吗,还是这是最推荐的方式?我是uwsgi的长期用户(谢谢!),我的设置遇到了规模问题,并评估了最佳的前进方式。例如,是否不再建议使用nginx代理转发到多个实例?@stephens Socket.IO服务器是有状态的。消息队列允许不同实例与其对等方共享其状态。正如我在回复中提到的,这是必需的。@Miguel谢谢,但我确实理解socketio的状态性质,也许这有点过分,但在这个阶段,共享状态不是我的案例的要求。因此,更具体地说,在共享状态(和实例内协调)不受关注的情况下,在多个uwsgi工作线程上运行flask socketio是否是一种不带MQ的受支持配置?或者,是否有多个烧瓶的SOCKETiO工人在任何情况下都会破坏事情?@ StPrrRS可以自由测试您想使用的任何部署策略,但我不认为在任何情况下将消息队列丢弃为支持的配置。您可能还想阅读有关粘性会话需求的文档(uWSGI的负载平衡不支持)。