Python 当web后端不仅仅是回复请求时,我的应用程序应该如何构造?

Python 当web后端不仅仅是回复请求时,我的应用程序应该如何构造?,python,architecture,rabbitmq,web-frameworks,gevent,Python,Architecture,Rabbitmq,Web Frameworks,Gevent,我正在创建一个网站,允许玩家排队为多人视频游戏寻找类似技能的玩家。简单web后端仅修改数据库并使用模板创建响应,但除此之外,我的后端还必须: 在玩家排队或玩游戏时,与他们实时通信(通过gevent socketio) 在后台运行计算以找到平衡的游戏,随着等待时间的增长,慢慢降低游戏质量(并在找到游戏时通过SocketIO通知玩家) 通过UDP套接字监控正在进行的游戏(如果玩家断开连接,请向队列请求替换),并最终使用结果更新数据库 我知道我将如何单独做这些事情,但我想知道我应该如何分离这些组件

我正在创建一个网站,允许玩家排队为多人视频游戏寻找类似技能的玩家。简单web后端仅修改数据库并使用模板创建响应,但除此之外,我的后端还必须:

  • 在玩家排队或玩游戏时,与他们实时通信(通过gevent socketio)
  • 在后台运行计算以找到平衡的游戏,随着等待时间的增长,慢慢降低游戏质量(并在找到游戏时通过SocketIO通知玩家)
  • 通过UDP套接字监控正在进行的游戏(如果玩家断开连接,请向队列请求替换),并最终使用结果更新数据库
我知道我将如何单独做这些事情,但我想知道我应该如何分离这些组件并让它们进行通信。我认为我的web框架(Flask)不应该参与这些其他事情

因为我已经必须使用gevent,所以我目前正计划为每个任务启动单独的Greenlet。这将适用于我的所有任务(计算可能除外),因为它们通常会等待某些事情发生。但是,这根本无法扩展,因为我无法运行更多的Flask实例。一切都取决于仅在单个线程中运行的greenlet


这是最好的方法吗?有没有其他方法来处理分离这些任务(特别是对于我将来可能使用的没有协同程序的语言)?我听说过RabbitMQ/ZeroMQ和Cellery以及其他类似的工具,但我不确定如何以及是否使用它们来解决这个问题。

我的第一个想法是,可以使用面向服务的体系结构来分离这些任务。这些服务中的每一个都可以在单独的端口(或机器(或机器池))上运行Flask应用程序,并使用简单的HTTP相互通信。故障可能是这样的:

  • GameService:处理来自玩家的传入连接,并通过socketio与他们通信
  • GameFinderService:接受来自GameService的POST请求,开始为玩家X寻找游戏。接受来自GameService的GET请求,为玩家X获得下一个最佳游戏。您可以使用Redis作为每个连接玩家的短时间游戏队列的后备存储,每次GameStatusService(以下)通知我们更改时,该队列都会更新
  • GameStatusService:通过UDP监控正在进行的游戏,当发生显著事件时,例如创建新游戏、玩家断开连接等,它会将更改通知GameFinderService。然后,GameFinderService将为每个连接的玩家适当地更新其队列

Redis非常好,因为它是一个数据结构存储,允许您维护短生命周期和长生命周期的数据结构,例如队列,而不需要太多开销。

我认为。HTTP不是必需的。使用简单的纯文本或序列化的sr结构的Socketio就足够了。