在Twisted和Django之间共享数据库

Ben*_*ner 9 python database django twisted

我正在开发一个多人游戏服务器,它使用Django作为网络服务器(HTML前端,用户身份验证,游戏可用,排行榜等)和Twisted来处理玩家和游戏之间的连接以及与游戏本身的接口.游戏服务器,网络服务器和数据库可以在不同的机器上运行.

构建共享数据库的"最佳"方式是什么,支持对数据库模式的更改.我应该尝试在Twisted框架中加入Django的ORM并使用延迟来使其无阻塞吗?我是否应该坚持创建和维护两个独立的数据库模式/接口,一个在Django的模型中,另一个在使用twisted.enterprise.row?

同样,使用用户身份验证,我应该使用twisted的用户身份验证功能,还是尝试将Django模块包含在游戏服务器中以处理游戏端的用户身份验证?

std*_*err 10

首先,我要确定为什么你需要Django和Twisted.假设你习惯使用twisted.web和auth很容易就足够了,你将能够为前端和后端应用重用你的数据库层.

或者你可以用另一种方式来看待它,Twisted在游戏服务器上做得更好?您是否希望支持更多玩家(更多同时连接)或其他什么?考虑一下,如果必须使用twisted内的线程来阻止数据库访问,那么您很可能无法有效/可靠地支持数百个并发线程.记住python有一个Global Interpreter Lock,因此线程不一定是最好的扩展方式.

您还应该考虑为什么要使用SQL数据库和ORM.您的游戏是否具有最适合存储在关系数据库中的数据?也许值得研究像MongoDB或其他键值或对象数据库来存储游戏状态.许多这些NoSQL商店都有用于Django的阻塞驱动程序和用于Twisted的非阻塞驱动程序(例如txmongo).

也就是说,如果您已经开始使用Django和Twisted,那么有一些技术可以将阻塞数据库访问嵌入到非阻塞的Twisted服务器中.

  1. adbapi(使用扭曲的线程池)
  2. 使用reactor.deferToThread直接使用扭曲的线程池
  3. Storm ORM有一个提供Twisted支持的分支(它在内部处理deferToThread调用)
  4. SAsync是一个试图使SQLAlchemy以异步方式工作的库
  5. 通过RPC与管理阻塞DB的进程进行交互

因此,您应该能够通过扭曲导入Django ORM对象并且非常小心地调用reactor.deferToThread来管理Django ORM对象.在扭曲中使用这些对象时存在许多可能的问题,因为某些ORM对象在访问/设置属性时可以发出SQL等.

我意识到这不一定是你所期待的答案,但也许更多关于你希望完成什么以及为什么选择这些特定技术的细节将让人们得到更好的答案.