Les sujets se chargent lentement ou pas du tout lorsqu'ils ont de nombreuses réponses et que l'utilisateur y a mis un signet

Nous rencontrons depuis un certain temps un problème récurrent sur notre forum Discourse, et nous avons finalement réussi à l’identifier et à le reproduire de manière fiable.

Voici les étapes pour reproduire le problème :

  1. Avoir un sujet avec des milliers de réponses

  2. Signaler un message dans ce sujet

  3. Ouvrir le sujet

Le sujet prend alors beaucoup de temps à charger. Dans certains cas, il dépasse le délai imparti et nous renvoie une erreur Nginx à la place (502 Bad Gateway).

Voici quelques temps de chargement approximatifs relevés sur notre forum :

  • Pour un sujet avec environ 1 000 réponses, le temps de chargement supplémentaire est de quelques secondes après la création du signalement. Cela se remarque, mais ne pose pas un problème majeur.

  • Pour un sujet avec environ 4 000 réponses, le temps de chargement est généralement de 20 à 30 secondes, et il dépasse parfois le délai imparti au lieu de charger correctement la page.

  • Pour un sujet avec plus de 9 000 réponses, il dépasse le délai imparti la plupart du temps. Dans certains cas, il finit par se charger, mais seulement après plus de 30 secondes.

Notez que ces sujets se chargent sans aucun problème s’ils ne contiennent aucun signalement. Le problème ne survient que pour les utilisateurs qui ont des signalements dans un sujet donné, et dès qu’ils suppriment le signalement, le sujet se charge normalement à nouveau.

5 « J'aime »

Je n’ai pas pu reproduire votre problème avec des sujets comportant 30 000 et 10 000 réponses sur mon forum. :man_shrugging:

4 « J'aime »

Si cela ne vous dérange pas trop, pourriez-vous essayer de définir un rappel programmé lors de la création du signet à l’étape 2 de la description de reproduction et voir si cela change quelque chose ? C’est ce qui a fini par rendre le problème reproductible de mon côté (en l’occurrence, en définissant un rappel pour « lundi » dans mon cas).

Cela a fait en sorte que ma requête .json liée à l’ID du post signet a commencé à renvoyer un 302 après 30 secondes d’attente, comme on peut le voir sur l’image ci-dessous. (Cela se produit lorsque je clique sur le lien du signet dans mon menu de profil.)

Par coïncidence, j’ai également remarqué que les requêtes de recherche commençaient à présenter un comportement similaire, bien qu’elles ne fassent que ralentir considérablement, dès qu’on recherche n’importe quoi dans n’importe quel sous-forum, y compris ceux qui ne contiennent aucun post signet.

[Image censurée de requêtes de recherche lentes depuis les outils de développement de Chromium, car un seul embed était autorisé]

D’après d’autres expériences, cela ressemble à un problème de type SQL N+1, mais je ne connais pas assez bien le code de Discourse ni Ruby pour savoir si un modèle JSON cyclique ou similaire pourrait se manifester de la même manière.

3 « J'aime »

Peux-tu reproduire ce problème, @martin ?

2 « J'aime »

Merci de l’avoir signalé. Je vais essayer de reproduire le problème et de le corriger cette semaine.

2 « J'aime »

Cela a été corrigé dans :

cc @Macaw qui a créé ce sujet connexe Bookmarking a Post on a Large Topic creates Absurd Loading Times

6 « J'aime »