仅将我的Django应用程序的模型导入辅助应用程序并查询数据库是否是一个好习惯?它是否有任何性能问题?
实际上,第二个应用程序是一个简单的轻量级Websocket服务器。
最佳答案
我已经回答了,尽管最好在Programmers SE.上使用
Tl; dr:不,这不是一个好习惯,但是不一定会导致性能问题。它的确使一切变得更加复杂。如果可以,请避免使用它。我有一个执行此操作的系统,而我正试图摆脱此设置。
首先,正如Apero在评论中所说:
Django模型只能由Django应用程序使用。您的websocket服务很可能不是用Django编写的,因此您将无法使用这些模型
但是我可以提供一些背景和实用性:
拥有多个系统或应用程序并不一定会导致性能问题,它比拥有多个应用程序实例更能引起性能问题,但请注意以下注意事项。
您的主要问题是系统是否可以打开和维护连接和查询,是否有任何特别长时间运行或密集的查询,以及这些查询在这些不同系统之间如何重叠。您对此很容易看到吗?
我们有一个中型的旧系统CRM数据库(250个用户,平均一天平均3页/秒,在MySQL中大约为30Gb数据),它具有:
8名网络工作者
Django框架管理命令中的30多个cronjobs访问数据库(因此创建它们自己的db连接),有些频率每分钟一次。
4或5个“独立”系统(报告工具,包括超集等),它们再次创建了自己的连接。
我们所有这些都在Amazon Web Services的T2 Micro实例上运行。除非我们正在运行大规模批处理作业(将250k记录插入我们的110m行分析表中,该表设计不当且未正确索引,但这是另外一回事了),否则,它永远不会特别累赘。这样做会在一夜之间运行,因为它趋向于减慢一切。
但是您询问了最佳实践。
This answer is a good overview of some of the pitfalls
在上面描述的示例中,我们在数据库的更新方面有许多重叠的区域。这很不好,并且很难调试发生的事情。是改变记录的财务系统还是CRM?
广泛地说,其他(非CRM)应用程序正在运行报告系统-有效地只是SELECT
语句。考虑到这一点,我到达时的第一件事就是为报告系统准备了一个只读副本,并将其转移到该副本上。现在,即使有人在我们最大的表中运行文本关键字搜索,就更新客户记录和其他INSERT
或UPDATE
查询而言,它也不会影响主CRM系统的性能。