在Twisted和Django之间共享数据库

9
我正在开发一个多人游戏服务器,使用Django作为Web服务器(HTML前端、用户认证、可用游戏、排行榜等),Twisted处理玩家和游戏之间的连接,并与游戏本身进行接口交互。游戏服务器、Web服务器和数据库可能运行在不同的机器上。
最佳的方案是如何架构共享数据库,以支持数据库模式的未来更改?应该尝试将Django的ORM合并到Twisted框架中,并使用deferreds使其非阻塞吗?还是应该创建和维护两个独立的数据库模式/接口,一个在Django模型中,另一个使用twisted.enterprise.row?
同样,在用户认证方面,我应该利用Twisted的用户认证功能,还是尝试将Django模块包含到游戏服务器中,以处理游戏方面的用户认证?

请注意,twisted.enterprise.row已经被弃用了将近三年,并且很快可能会被移除。 - Jean-Paul Calderone
2个回答

10
首先,我会确定为什么您需要同时使用Django和Twisted。假设您熟悉Twisted的使用,使用twisted.web和auth将足够轻松,并且您可以重用数据库层以用于前端和后端应用程序。
或者,您可以从另一个角度考虑,作为游戏服务器,Twisted做得更好在哪里?您希望支持更多玩家(更多同时连接)还是其他方面?请注意,如果您必须在Twisted中使用线程来进行阻塞式数据库访问,则很可能无法高效/可靠地支持数百个同时线程。请记住,Python有全局解释器锁定,因此线程不一定是扩展的最佳方式。
您还应该考虑为什么要使用SQL数据库和ORM。您的游戏中是否有最适合存储在关系型数据库中的数据?也许考虑使用像MongoDB或另一个键值或对象数据库来存储游戏状态会更好。许多这些NoSQL存储都具有用于Django的阻塞式驱动程序和用于Twisted的非阻塞式驱动程序(例如txmongo)。
话虽如此,如果您一定要同时使用Django和Twisted,那么有几种将阻塞DB访问嵌入到非阻塞Twisted服务器中的技术。
1. adbapi(使用Twisted线程池) 2. 直接使用Twisted线程池,使用reactor.deferToThread 3. Storm ORM具有提供Twisted支持的分支(它在内部处理deferToThread调用) 4. SAsync是一个试图使SQLAlchemy以异步方式工作的库。 5. 通过RPC让Twisted与管理阻塞DB的进程交互
因此,您应该能够通过导入它们并非常小心地对reactor.deferToThread进行调用来自己管理Django ORM对象。在Twisted中使用这些对象时可能会产生许多可能的问题,因为一些ORM对象在访问/设置属性时可能会发出SQL等。
我意识到这不一定是您所期望的答案,但也许更详细地说明您希望实现什么以及为什么选择这些特定技术将使人们能够为您提供更好的答案。

你也可以看一下这个类似的问题:https://dev59.com/dHA75IYBdhLWcg3w8-BJ - stderr
+1 对“为什么不只用一个堆栈”的看法表示赞同。Twisted非常适合comet类型的东西,我会建议也用它来提供HTTP服务。我就是这么做的。 - jpsimons

2

我建议避免使用Django ORM,它并不是那么好用,而且在Django上下文之外访问会很麻烦(可以看到为了使Django支持多个数据库所做的工作)。Twisted数据库访问总是需要线程(即使使用twisted.adbapi),而线程可以让你选择任何ORM。SQLalchemy是一个不错的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接