当主题包含许多回复且用户已将其加入书签时,主题加载缓慢或根本不加载

我们的 Discourse 论坛长期存在一个反复出现的问题,我们最终成功定位并能够可靠地复现该问题。

复现步骤如下:

  1. 准备一个包含数千条回复的主题

  2. 在该主题中书签某条帖子

  3. 打开该主题

此时,该主题加载时间会显著变长。在某些情况下,加载会超时,并返回 Nginx 错误(502 Bad Gateway)。

以下是我们论坛中的一些大致加载时间数据:

  • 对于约有 1,000 条回复的主题,创建书签后额外增加的加载时间为几秒。虽然可察觉,但并非严重问题。

  • 对于约有 4,000 条回复的主题,加载时间通常为 20–30 秒,有时甚至超时,导致页面无法正常加载。

  • 对于超过 9,000 条回复的主题,大多数情况下会超时。偶尔能够加载,但往往需要 30 秒以上。

请注意,如果这些主题中没有书签,它们可以正常加载。该问题仅出现在对特定主题拥有书签的用户身上;一旦他们移除书签,主题即可恢复正常加载。

5 个赞

我在论坛上有 30000 和 10000 条回复的主题中无法复现您的问题。:man_shrugging:

4 个赞

如果不太麻烦的话,能否您在复现步骤第2步设置书签时,尝试设置一个定时提醒,看看是否会有变化?正是这个方法最终让我成功复现了问题(具体而言,在我的情况下是设置了“周一”的提醒)。

这导致与书签帖子 ID 相关的 .json-request 在尝试 30 秒后开始返回 302 状态码,如下图所示。(在我点击个人资料菜单中的书签链接时出现。)

巧合的是,我还注意到搜索查询也开始表现出类似的行为,尽管只是变得极其缓慢,而且是在任何子论坛中搜索任何内容时都会发生,包括那些根本没有书签帖子的子论坛:

[已编辑:来自 Chromium 开发者工具的慢速搜索查询截图,因仅允许一个嵌入]

根据其他经验,这听起来像是某种 SQL N+1 问题,但我对 Discourse 代码和 Ruby 本身都还不够精通,无法确定是否可能是循环 JSON 模型或类似情况导致了同样的表现。

3 个赞

你能复现这个问题吗,@martin

2 个赞

感谢您报告此问题,我本周将尝试复现并修复。

2 个赞

此问题已在以下提交中修复:

cc @Macaw,他创建了相关话题 Bookmarking a Post on a Large Topic creates Absurd Loading Times

6 个赞