Эта тема в частности давно меня беспокоила. Я спрашивал, почему загрузка занимает от 1 до 3 минут, если она вообще происходит?
Увидев, что кто-то подтвердил эту проблему в этом сообщении, я решил разобраться: я удалил все закладки из темы, содержащей 4500 сообщений.
Она загрузилась мгновенно, как и любое другое сообщение.
Затем я задался вопросом: как ещё я могу это проверить?
Независимо от того, закладывал ли я в закладки первое или последнее сообщение, загрузка всё равно занимала некоторое время, хотя и не минуты, а около 10 секунд.
Эффект усиливался в темах с большим количеством сообщений; мне кажется, есть определённый порог около 4000 сообщений, из-за которого время загрузки становится таким медленным.
Я проверил это на других темах с более чем 4000 сообщений.
Чем больше закладок у темы, тем дольше она загружается.
Я предполагаю, что чем больше закладок у темы с большим количеством сообщений, тем дольше она загружается.
Чтобы воспроизвести: откройте тему с очень большим количеством сообщений и добавьте одно сообщение в закладки. Жаль, что для добавления сообщения в закладки в упомянутой теме требуется вход в систему, а тема с наибольшим количеством ответов на этом сайте содержит всего 925 сообщений.
Если вам потребуется дополнительная информация, спрашивайте.
Однако я создал локально тему с 5000 сообщениями и добавил закладку, и она загружается за одинаковое время независимо от того, есть ли в теме закладка или нет . Мне придётся продолжить поиск… Код, который загружает закладки пользователя в теме, находится здесь:
А код, который ищет закладку для каждого сообщения, находится здесь:
Мне это не кажется чем-то безумным или требующим больших ресурсов. user_post_bookmarks обращается к базе данных только один раз, так как результат кэшируется (memoized), поэтому здесь нет проблемы N+1. Также вот код представления темы, чтобы проверить наличие закладки на уровне темы:
Я так не думаю. Форум Roblox находится на версии Version bump to v2.6.0.beta3 · discourse/discourse@2a268bd · GitHub. С тех пор было совершено только два коммита, связанных с закладками, и оба — от меня; ни один из них не касается загрузки или сериализации закладок темы.
Должно быть, здесь играет роль какое-то другое странное совпадение, полагаю?
Сгенерированный SQL-запрос содержит LIMIT 1, из-за чего индекс index_posts_on_topic_id_and_post_number никогда не используется, что приводит к значительным задержкам. Мне не удалось воспроизвести эту проблему локально, так как в моей локальной базе данных практически нет записей; по сути, чем больше постов в вашем форуме Discourse в целом, тем серьезнее становится эта проблема. Исправление будет предоставлено в ближайшее время.