我正在开发一个多人游戏服务器,它使用 Django 作为网络服务器(HTML 前端、用户身份验证、可用游戏、排行榜等)和 Twisted 来处理玩家和游戏之间的连接以及与游戏本身的交互。游戏服务器、网络服务器和数据库可能运行在不同的机器上。
构建共享数据库的“最佳”方式是什么,以一种支持对数据库模式进行更改的方式。我是否应该尝试将 Django 的 ORM 合并到 Twisted 框架中并使用 deferreds 使其成为非阻塞的?我是否应该坚持创建和维护两个独立的数据库模式/接口(interface),一个在 Django 的模型中,另一个使用 twisted.enterprise.row?
同样,对于用户身份验证,我应该利用 twisted 的用户身份验证功能,还是尝试将 Django 模块包含到游戏服务器中以在游戏端处理用户身份验证?
最佳答案
首先,我要确定为什么您需要 Django 和 Twisted。假设您熟悉使用 twisted.web 和 auth 的 Twisted 就足够了,您将能够为前端和后端应用重用数据库层。
或者您可以换个角度来看,作为游戏服务器,Twisted 在哪些方面做得更好?您是希望支持更多玩家(更多同时连接)还是其他?考虑一下,如果您必须在扭曲中使用线程来阻止数据库访问,那么您很可能无法有效/可靠地支持数百个并发线程。请记住 python 有一个全局解释器锁,因此线程不一定是扩展的最佳方式。
您还应该考虑为什么要使用 SQL 数据库和 ORM。您的游戏是否有真正最适合存储在关系数据库中的数据?也许值得研究一下用于存储游戏状态的 MongoDB 或其他键值或对象数据库。这些 NoSQL 存储中的许多都有用于 Django 的阻塞驱动程序和用于 Twisted(例如 txmongo)的非阻塞驱动程序。
也就是说,如果您执意要同时使用 Django 和 Twisted,可以使用一些技术将阻塞式数据库访问嵌入到非阻塞式 Twisted 服务器中。
- adbapi(使用扭曲线程池)
- 使用reactor.deferToThread直接使用twisted线程池
- Storm ORM 有一个分支提供 Twisted 支持(它在内部处理 deferToThread 调用)
- SAsync 是一个试图让 SQLAlchemy 以异步方式工作的库
- 通过 RPC 与管理阻塞数据库的进程进行扭曲交互
因此,您应该能够自己管理 Django ORM 对象,方法是在扭曲中导入它们并非常小心地调用 reactor.deferToThread。在 twisted 中处理这些对象时可能会出现许多问题,因为某些 ORM 对象在访问/设置属性等时可能会发出 SQL。
我知道这不一定是您期望的答案,但也许更多关于您希望完成的事情以及您选择这些特定技术的原因的详细信息将使人们能够为您提供更好的答案。
关于python - 在 Twisted 和 Django 之间共享数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051408/