我正在创建一个网站,允许玩家排队寻找类似技能的多人视频游戏玩家。简单的 Web 后端仅修改数据库并使用模板创建响应,但除此之外,我的后端还必须:
- 在排队或玩游戏时与玩家实时交流(通过 gevent-socketio)
- 在后台运行计算以找到平衡的游戏,随着等待时间的增加逐渐降低游戏质量(并在找到游戏时通过 SocketIO 通知玩家)
- 通过 UDP 套接字监控正在进行的游戏(如果玩家断开连接,请向队列请求替代)并最终使用结果更新数据库
我知道我将如何单独做这些事情,但我想知道我应该如何分离这些组件并让它们通信。我想我的网络框架(Flask)根本不应该参与这些其他事情。
由于我已经必须使用 gevent,我目前正计划为这些任务中的每一个启动单独的 greenlet。这将适用于我的所有任务(计算可能除外),因为它们通常会等待某些事情发生。但是,这根本无法扩展,因为我无法运行更多 Flask 实例。一切都依赖于在一个线程中运行的greenlets。
那么这是最好的方法吗?是否有另一种方法来处理分离这些任务(尤其是我将来可能使用的没有协程的语言)?我听说过 RabbitMQ/ZeroMQ 和 Celery 等工具,但我不确定如何以及是否使用它们来解决这个问题。