У нас уже какое-то время наблюдается повторяющаяся проблема на нашем форуме Discourse, и нам наконец удалось сузить круг её причин и надёжно воспроизвести её.
Вот шаги для воспроизведения:
Создайте тему с тысячами ответов.
Добавьте в закладки один из постов в этой теме.
Откройте тему.
Теперь тема загружается очень долго. В некоторых случаях происходит тайм-аут, и вместо страницы отображается ошибка Nginx (502 Bad Gateway).
Вот приблизительное время загрузки на нашем форуме:
Для темы с примерно 1000 ответами дополнительное время загрузки после создания закладки составляет несколько секунд. Это заметно, но не является серьёзной проблемой.
Для темы с примерно 4000 ответами время загрузки обычно составляет 20–30 секунд, а иногда происходит тайм-аут вместо успешной загрузки страницы.
Для темы с более чем 9000 ответами в большинстве случаев происходит тайм-аут. В некоторых случаях страница загружается, но только после 30+ секунд.
Обратите внимание, что эти темы загружаются без каких-либо проблем, если в них нет закладок. Проблема возникает только у пользователей, у которых есть закладки в конкретной теме, и как только они удаляют закладку, тема снова загружается нормально.
Если это не слишком неудобно, не могли бы вы попробовать установить таймер напоминания при создании закладки на шаге 2 в описании воспроизведения и посмотреть, изменится ли что-либо? Именно это в конечном итоге сделало проблему воспроизводимой для меня (в моём случае — установка напоминания на «понедельник»).
Из-за этого мой .json-запрос, связанный с ID закладочного сообщения, начал возвращать ответ 302 после 30 секунд ожидания, как показано на изображении ниже. (Это происходит при клике на ссылку закладки в моём меню профиля).
По совпадению я также заметил, что поисковые запросы начали вести себя аналогичным образом, хотя и проявлялось это лишь в сильном замедлении, при поиске чего-либо в любой подформе, включая те, в которых вообще нет закладочных сообщений:
[Удалённое изображение медленных поисковых запросов из инструментов разработчика Chromium, так как разрешался только 1 встраиваемый элемент]
Исходя из моего предыдущего опыта, это пахнет каким-то SQL N+1-проблемом, но я недостаточно хорошо разбираюсь ни в коде Discourse, ни в самом Ruby, чтобы сказать, не проявляется ли циклическая JSON-модель или что-то подобное точно так же.