Hello Stackoverflowers,
我们正在开发一个使用Python作为后端的在线棋盘游戏(想在线垄断)网站。
我们将Django用于非实时内容(身份验证,播放器配置文件,排名......)。聊天服务器使用socket.io和Tornodo实现。游戏服务器部分是导致我们出现问题的原因。
我们目前(可能会改变)也使用Tornado和socket.io,每个Tornado实例位于(可能)不同服务器上的gameX.site.com地址并同时托管多个游戏(很像聊天服务器)事实上,除了消息不会发送给所有用户,而只发送给同一游戏中涉及的消息。)
导致我们麻烦的是如何在游戏进行时更新Django实例(游戏日志,分数等)。此外,我们还想使用Django进行身份验证,因为每个玩家都会要求Django服务器加入游戏,并为其提供一次性ID /密码。显然,我们必须以某种方式将这些信息传达给游戏服务器。
首先,选择的解决方案是使用类似Redis的东西作为双向消息队列,Django会将/密码发布到Redis,然后Tornado会在传入连接上查询Redis。 Django cron也会每隔一分钟左右运行一次,以处理等待的消息。但我们担心频繁且可能长时间运行的cron会阻碍主站点,因为PostgreSQL数据库与Django托管在同一台服务器上(某些游戏服务器也可能在同一台机器上运行)。
我们还可以等待玩家请求更新排名以处理过去的游戏结果,但我们担心这种无限期的延迟会扭曲整体排名(和体验),并可能导致数据丢失。
我们可以使用Celery / RabbitMQ在Tornado进程中使用Django ORM更新Main数据库,但是可以使用相同的解决方案将临时ID /密码传递给游戏服务器吗?看起来你不能向Celery发布消息并在另一方面检索它。
感谢您的见解。