我正在开发一个多人游戏服务器,它使用Django作为网络服务器(HTML前端,用户身份验证,游戏可用,排行榜等)和Twisted来处理玩家和游戏之间的连接以及与游戏本身的接口。游戏服务器,网络服务器和数据库可以在不同的机器上运行。
以支持对数据库架构进行更改的方式构建共享数据库的“最佳”方法是什么。我应该尝试在Twisted框架中加入Django的ORM并使用延迟来使其无阻塞吗?我是否应该坚持创建和维护两个独立的数据库模式/接口,一个在Django的模型中,另一个在使用twisted.enterprise.row?
同样,使用用户身份验证,我应该使用twisted的用户身份验证功能,还是尝试将Django模块包含在游戏服务器中以处理游戏端的用户身份验证?
答案 0 :(得分:10)
首先,我要确定为什么你需要Django和Twisted。假设你习惯使用twisted.web和auth很容易就足够了,你将能够为前端和后端应用重用你的数据库层。
或者你可以用另一种方式来看待它,Twisted在游戏服务器上做得更好?您是否希望支持更多玩家(更多同时连接)或其他什么?考虑一下,如果必须使用twisted内的线程来阻止数据库访问,那么您很可能无法有效/可靠地支持数百个并发线程。记住python有一个Global Interpreter Lock,因此线程不一定是最好的扩展方式。
您还应该考虑为什么要使用SQL数据库和ORM。您的游戏是否具有最适合存储在关系数据库中的数据?也许值得研究像MongoDB或其他键值或对象数据库来存储游戏状态。许多这些NoSQL商店都有用于Django的阻塞驱动程序和用于Twisted的非阻塞驱动程序(例如txmongo)。
也就是说,如果你已经开始使用Django和Twisted,那么有一些技术可以将阻塞数据库访问嵌入到非阻塞的Twisted服务器中。
因此,您应该能够通过扭曲导入Django ORM对象并且非常小心地调用reactor.deferToThread来管理Django ORM对象。在扭曲中使用这些对象时有许多可能的问题,因为某些ORM对象在访问/设置属性时可以发出SQL等。
我意识到这不一定是你所期待的答案,但也许更多关于你希望完成什么以及为什么选择这些特定技术的细节将使人们能够得到更好的答案。
答案 1 :(得分:2)
我只是避免使用Django ORM,它不是全部,在Django上下文之外访问会很痛苦(见证了Django支持多个数据库所需的工作)。 Twisted数据库访问总是需要线程(即使使用twisted.adbapi),并且线程允许您访问您选择的任何ORM。 SQLalchemy将是一个不错的选择。