Python 当web后端不仅仅是回复请求时,我的应用程序应该如何构造?
我正在创建一个网站,允许玩家排队为多人视频游戏寻找类似技能的玩家。简单web后端仅修改数据库并使用模板创建响应,但除此之外,我的后端还必须:Python 当web后端不仅仅是回复请求时,我的应用程序应该如何构造?,python,architecture,rabbitmq,web-frameworks,gevent,Python,Architecture,Rabbitmq,Web Frameworks,Gevent,我正在创建一个网站,允许玩家排队为多人视频游戏寻找类似技能的玩家。简单web后端仅修改数据库并使用模板创建响应,但除此之外,我的后端还必须: 在玩家排队或玩游戏时,与他们实时通信(通过gevent socketio) 在后台运行计算以找到平衡的游戏,随着等待时间的增长,慢慢降低游戏质量(并在找到游戏时通过SocketIO通知玩家) 通过UDP套接字监控正在进行的游戏(如果玩家断开连接,请向队列请求替换),并最终使用结果更新数据库 我知道我将如何单独做这些事情,但我想知道我应该如何分离这些组件
- 在玩家排队或玩游戏时,与他们实时通信(通过gevent socketio)
- 在后台运行计算以找到平衡的游戏,随着等待时间的增长,慢慢降低游戏质量(并在找到游戏时通过SocketIO通知玩家)
- 通过UDP套接字监控正在进行的游戏(如果玩家断开连接,请向队列请求替换),并最终使用结果更新数据库
这是最好的方法吗?有没有其他方法来处理分离这些任务(特别是对于我将来可能使用的没有协同程序的语言)?我听说过RabbitMQ/ZeroMQ和Cellery以及其他类似的工具,但我不确定如何以及是否使用它们来解决这个问题。我的第一个想法是,可以使用面向服务的体系结构来分离这些任务。这些服务中的每一个都可以在单独的端口(或机器(或机器池))上运行Flask应用程序,并使用简单的HTTP相互通信。故障可能是这样的:
- GameService:处理来自玩家的传入连接,并通过socketio与他们通信
- GameFinderService:接受来自GameService的POST请求,开始为玩家X寻找游戏。接受来自GameService的GET请求,为玩家X获得下一个最佳游戏。您可以使用Redis作为每个连接玩家的短时间游戏队列的后备存储,每次GameStatusService(以下)通知我们更改时,该队列都会更新
- GameStatusService:通过UDP监控正在进行的游戏,当发生显著事件时,例如创建新游戏、玩家断开连接等,它会将更改通知GameFinderService。然后,GameFinderService将为每个连接的玩家适当地更新其队列
Redis非常好,因为它是一个数据结构存储,允许您维护短生命周期和长生命周期的数据结构,例如队列,而不需要太多开销。我认为。HTTP不是必需的。使用简单的纯文本或序列化的sr结构的Socketio就足够了。