Загрузка тем с множеством ответов происходит медленно или не происходит вовсе, если у пользователя есть в них закладки

У нас уже какое-то время наблюдается повторяющаяся проблема на нашем форуме Discourse, и нам наконец удалось сузить круг её причин и надёжно воспроизвести её.

Вот шаги для воспроизведения:

  1. Создайте тему с тысячами ответов.

  2. Добавьте в закладки один из постов в этой теме.

  3. Откройте тему.

Теперь тема загружается очень долго. В некоторых случаях происходит тайм-аут, и вместо страницы отображается ошибка Nginx (502 Bad Gateway).

Вот приблизительное время загрузки на нашем форуме:

  • Для темы с примерно 1000 ответами дополнительное время загрузки после создания закладки составляет несколько секунд. Это заметно, но не является серьёзной проблемой.

  • Для темы с примерно 4000 ответами время загрузки обычно составляет 20–30 секунд, а иногда происходит тайм-аут вместо успешной загрузки страницы.

  • Для темы с более чем 9000 ответами в большинстве случаев происходит тайм-аут. В некоторых случаях страница загружается, но только после 30+ секунд.

Обратите внимание, что эти темы загружаются без каких-либо проблем, если в них нет закладок. Проблема возникает только у пользователей, у которых есть закладки в конкретной теме, и как только они удаляют закладку, тема снова загружается нормально.

5 лайков

Я не смог воспроизвести вашу проблему в темах с 30 000 и 10 000 ответов на моём форуме. :man_shrugging:

4 лайка

Если это не слишком неудобно, не могли бы вы попробовать установить таймер напоминания при создании закладки на шаге 2 в описании воспроизведения и посмотреть, изменится ли что-либо? Именно это в конечном итоге сделало проблему воспроизводимой для меня (в моём случае — установка напоминания на «понедельник»).

Из-за этого мой .json-запрос, связанный с ID закладочного сообщения, начал возвращать ответ 302 после 30 секунд ожидания, как показано на изображении ниже. (Это происходит при клике на ссылку закладки в моём меню профиля).

По совпадению я также заметил, что поисковые запросы начали вести себя аналогичным образом, хотя и проявлялось это лишь в сильном замедлении, при поиске чего-либо в любой подформе, включая те, в которых вообще нет закладочных сообщений:

[Удалённое изображение медленных поисковых запросов из инструментов разработчика Chromium, так как разрешался только 1 встраиваемый элемент]

Исходя из моего предыдущего опыта, это пахнет каким-то SQL N+1-проблемом, но я недостаточно хорошо разбираюсь ни в коде Discourse, ни в самом Ruby, чтобы сказать, не проявляется ли циклическая JSON-модель или что-то подобное точно так же.

3 лайка

Ты можешь воспроизвести это, @martin?

2 лайка

Спасибо за сообщение об этой проблеме. Я постараюсь воспроизвести её и исправить на этой неделе.

2 лайка

Это исправлено в:

cc @Macaw, который создал связанную тему Bookmarking a Post on a Large Topic creates Absurd Loading Times

6 лайков