Tivemos um problema recorrente em nosso fórum Discourse por um tempo e finalmente conseguimos identificá-lo e reproduzi-lo de forma confiável.
Aqui estão os passos para reproduzir:
Tenha um tópico com milhares de respostas
Marque uma postagem nesse tópico como favorita (bookmark)
Abra o tópico
O tópico agora leva muito tempo para carregar. Em alguns casos, o tempo esgota e recebemos um erro do Nginx em vez disso (502 Bad Gateway).
Aqui estão alguns tempos de carregamento aproximados do nosso fórum:
Para um tópico com cerca de 1.000 respostas, o tempo extra de carregamento é de alguns segundos após a criação do bookmark. Perceptível, mas não um grande problema.
Para um tópico com cerca de 4.000 respostas, o tempo de carregamento geralmente é de 20 a 30 segundos e, às vezes, o tempo esgota em vez de carregar a página com sucesso.
Para um tópico com mais de 9.000 respostas, o tempo esgota na maioria das vezes. Em alguns casos, ele carrega, mas apenas após 30 segundos ou mais.
Observe que esses tópicos carregam sem nenhum problema se não houver bookmarks neles. O problema ocorre apenas para usuários que têm bookmarks em um tópico específico e, assim que eles removem o bookmark, o tópico carrega normalmente novamente.
Se não for muito incômodo, você poderia tentar definir um lembrete agendado ao marcar o bookmark na etapa 2 da descrição da reprodução e verificar se algo muda? Foi isso que finalmente tornou o problema reproduzível para mim (especificamente, ao definir um lembrete para “segunda-feira” no meu caso).
Isso fez com que minha solicitação .json relacionada ao ID da postagem marcada começasse a retornar 302 após 30 segundos de tentativa, conforme mostrado na imagem abaixo. (Ocorre quando clico no link do bookmark no meu menu de perfil).
Por coincidência, também notei que as consultas de busca começaram a apresentar um comportamento semelhante, embora apenas ficassem extremamente lentas, ao pesquisar qualquer coisa em qualquer subformulário, incluindo aqueles sem nenhuma postagem marcada.
[Imagem censurada de consultas de busca lentas nas ferramentas de desenvolvedor do Chromium, pois apenas 1 embed era permitido]
Por outras experiências, isso me parece algum tipo de problema de SQL N+1, mas não sou suficientemente versado nem no código do Discourse nem no próprio Ruby para saber se, talvez, um modelo JSON cíclico ou algo similar se manifestaria da mesma maneira.