Django DB 查询变为 'None',如在 long-运行 管理命令中使用 DEBUG=True 所见

Django DB query becomes 'None' as seen with DEBUG=True inside a long-running management command

我在几种模式下使用 Django 2.2,其中一种是长 运行ning 管理命令,它在 Supervisord 下 运行s 处理入站 Slack 消息。经过数周的测试,此方法运行良好。然而,今天我目睹了一些我无法解释的令人不安的事情。

我 运行 在测试环境中进行所有这些操作,因此我将 DEBUG 设置为 True 并且我的记录器调试级别已调高。正因为如此,我可以看到每个数据库查询并清楚地知道问题发生的位置。

该任务已经 运行 正常运行了大约 17 个小时,这与它过去 运行 成功的时间(很多天)相比是微不足道的。发生的事情是,应该发送到数据库的实际查询开始为空白或空。它在数据库日志中显示为 'None'。查询是一个简单的对象过滤器:

if not bool(SlackChannel.objects.filter(id=event['channel'])):
    return

这是它开始显示的样子:

2020-05-29 10:58:36,001 DEBUG utils (0.000) None; args=('SKFHJ7H5S6',)

如果一切正常,应该是这样的:

2020-05-29 10:58:36,001 DEBUG utils (0.000) SELECT `item`.`id`, `item`.`name`, `item`.`info` FROM `item` WHERE `item`.`id` = 'SKFHJ7H5S6'; args=('SKFHJ7H5S6',)

一旦进入这种模式,它就可以完美重现。然后当我稍后重新启动该过程时,问题消失了一段时间,但最终又回来了。从那以后,我一遍又一遍地注意到相同的模式。

另请注意.. 我在这个任务中有 2 个线程。查询在另一个线程中继续正常工作(尽管这些查询针对的是完全不同的对象),即使在出现此问题的线程开始出现之后也是如此。此外,我的其他 Django 任务 + 网络服务器都继续正常工作。

这可能是什么原因造成的?

在与 Slack Client API 开发人员 some back and forth 以及一些额外的测试之后,我得出的结论是,这很有可能是由于 Slack Client 之间的交互不良造成的和姜戈。这可能是由于异步,因为 Django 2.2 不支持异步,即使我是 运行 处于“同步模式”的 Slack 客户端。

Slack 客户端开发人员建议的解决方案可能是将 Django 的消息处理与使用 Q 的消息接收分离,我同意这一点。然而,已经实施了一种不同的方法,一个似乎在 > 99% 的时间都有效的更快的解决方案是让 Supervisord 每小时自动重启该过程。如果您要从头开始使用这 2 个模块构建解决方案,您应该考虑 Q 方法。