我正在开发一个多人游戏服务器,它使用Django作为user服务器(HTML前端,用户身份验证,可用游戏,排行榜等)和Twisted来处理玩家和游戏之间的连接,以及与游戏本身的接口。游戏服务器、网络服务器和数据库可以在不同的机器上运行。
以支持数据库架构更改的方式架构共享数据库的“最佳”方式是什么?我是否应该尝试将Django的ORM整合到Twisted框架中,并使用deferreds使其成为非阻塞的?我是否应该坚持创建和维护两个独立的数据库模式/接口,一个在Django的模型中,另一个使用twisted.enterprise.row?
类似地,对于用户身份验证,我是应该利用twisted的用户身份验证功能,还是应该尝试在游戏服务器中包含Django模块来处理游戏端的用户身份验证?
发布于 2011-02-19 23:53:37
首先,我会找出为什么需要Django和Twisted。假设你对Twisted很熟悉,使用twisted.web和auth就足够了,你将能够在前端和后端应用程序中重用数据库层。
或者你可以换一种方式看待它,Twisted作为游戏服务器做得更好的是什么?你是希望支持更多的玩家(更多的同时连接)还是别的什么?考虑到,如果你必须在twisted中使用threaded来进行阻塞数据库访问,那么你很可能无法有效/可靠地支持数百个并发线程。记住,python有一个全局解释器锁,所以线程不一定是最好的扩展方式。
您还应该考虑为什么要使用SQL数据库和ORM。您的游戏中是否有真正适合存储在关系数据库中的数据?也许值得研究一下MongoDB或其他用于存储游戏状态的键值或对象数据库。许多这样的NoSQL商店既有Django中使用的阻塞驱动程序,也有Twisted中使用的非阻塞驱动程序(例如txmongo)。
也就是说,如果您决意要同时使用Django和Twisted,有一些技术可以将阻塞DB访问嵌入到非阻塞Twisted服务器中。
的进程进行扭曲交互
因此,您应该能够自己管理Django ORM对象,方法是以扭曲的形式导入它们,并非常小心地调用reactor.deferToThread。在twisted中使用这些对象时,可能会出现许多问题,比如一些ORM对象在访问/设置属性时可能会发出SQL。
我意识到这不一定是你所期望的答案,但也许更多关于你希望实现什么以及为什么你选择这些特定技术的详细信息会让人们得到更好的答案。
发布于 2011-02-20 00:05:17
我只想避免使用Django ORM,这并不是全部,而且在Django上下文之外访问它将是一件痛苦的事情(看看让Django支持多个数据库所需的工作)。扭曲的数据库访问总是需要线程(即使是使用twisted.adbapi),而线程可以让您访问您选择的任何ORM。SQLalchemy将是一个很好的选择。
https://stackoverflow.com/questions/5051408
复制相似问题