【问题标题】:Should I implement revisioning using database triggers or using django-reversion?我应该使用数据库触发器还是使用 django-reversion 来实现修订?
【发布时间】:2015-01-05 05:18:49
【问题描述】:

我们正在考虑在我们的应用程序中实施审核日志,但不确定如何正确执行。
我知道 django-reversion 可以工作并且效果很好,但是使用它是有成本的。
即使保存在同一个事务中,Web 服务器在保存记录时也必须对数据库进行两次往返,因为至少在 postgres 中,更改会写入数据库并且提交事务会使更改可见。
因此,如果我们不使用当前的异步 I/O,这将阻止 Web 服务器,直到将修订保存到数据库中。即使我们使用异步 I/O 生成修订数据也会占用 CPU 时间,这又会阻止 Web 服务器处理其他请求。

我们可以改用数据库触发器,但我们的 DBA 声称将此类工作卸载到数据库将使用用于处理更多事务的资源。 对这类工作使用数据库触发器是个坏主意吗?

我们可以使用负载平衡器扩展 Web 服务器,也可以使用读/写副本扩展数据库。
我们在这里是否缺少任何权衡?
什么可以帮助我们做出决定?

【问题讨论】:

    标签: django database postgresql architecture


    【解决方案1】:

    您需要考虑您网站中数据库的使用模式。

    这可能对您来说是独一无二的,但是大多数网络应用程序读取的频率远高于它们写入到数据库的频率。事实上,看到优化完成是相当普遍的,以帮助扩展 Web 应用程序,这会权衡更复杂的“保存”操作以获得更快的读取。一个例子是denormalisation,其中一些来自相关记录的数据在每次保存时被复制到父记录,以避免重复执行复杂的聚合/连接查询。

    这只是一个例子,但除非你知道你的具体情况不同,否则我想说不要担心在保存方面做一些额外的工作。

    一个警告是考虑从修订系统中排除某些模型。例如,如果您使用 Django 数据库支持的会话,会话记录会保存在每个请求中。您应该避免在那里做不必要的工作。

    至于通过触发器与 Django 应用程序来实现......我认为这里的主要考虑因素与性能无关:

    • Django 应用程序解决方案更“明显”和“可维护”...该应用程序将在您的 pip 需求文件和 Django INSTALLED_APPS 中,其他开发人员很明显它就在那里并且正在工作,不需要有人记住移动到新服务器时在数据库服务器上运行自定义 SQL
    • 使用 db 触发器解决方案,您可以确定它会在记录被更改时运行以任何方式...而使用 Django 应用程序,任何通过 psql 控制台更改记录的人都会绕过它。即使在 Django ORM 中,某些批量操作也会绕过模型保存方法/保存信号。然而,有时这是可取的。

    我要指出的另一件事是,您的生产网络服务器将是多进程/多线程的......所以虽然,是的,冗长的数据库写入会阻塞网络服务器,它只会阻塞 当前进程 .您的网络服务器将有其他进程能够同时处理其他请求。所以它不会阻塞整个网络服务器。

    再说一次,除非您有一种使用模式,您预计 并发写入 到数据库的频率很高,否则我想说可能不用担心。

    【讨论】:

    • 我们的 REST API 的读取率确实高于写入率,但我们的后端服务正好相反。他们至少有 90% 的时间都在写作。我们的后端服务之一不断写入数据,并且应该修改数据,这就是我担心性能的原因。
    • 好吧,那么我猜触发器在数据库端可能会更高效一些,因为它们无需通过客户端连接发送额外的查询即可运行
    • 数据库触发器会比 django-reversion 更好地扩展吗?为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多