Nous avons incité nos nouveaux membres à suivre le tutoriel de discobot, et plusieurs d’entre eux rencontrent un problème que nous avions déjà observé dans une instance Discourse précédente (staging) : le certificat du dernier message prend beaucoup de temps à être généré et à s’afficher, sans aucune indication qu’il est en cours de chargement/génération. Par « beaucoup de temps », j’entends une période de 10 à 20 secondes, ce qui est suffisant pour que quelqu’un abandonne. J’ai fait un test sur meta et cela semble être instantané ici.
J’ai remarqué que le certificat peut être généré à la demande via l’URL /discobot/certificate.svg?date=Oct+28+2020&user_id=123, alors j’ai effectué quelques tests. Au début, c’était instantané. Mais dès que j’ai utilisé des identifiants d’utilisateurs qui n’avaient pas fait le tutoriel récemment, j’ai dû attendre les 10 à 20 secondes (c’est rapide une fois généré la première fois, donc je suppose qu’il y a un cache quelque part). J’ai également reçu quelques erreurs 500 pendant la période d’attente, que je suppose être un type de timeout, car cela a fonctionné au prochain rafraîchissement.
Dans /logs, je vois un avertissement dont je ne sais pas s’il est lié :
Failed to process hijacked response correctly : Net::ReadTimeout
traceback
/usr/local/lib/ruby/2.6.0/net/protocol.rb:217:in `rbuf_fill'
/usr/local/lib/ruby/2.6.0/net/protocol.rb:191:in `readuntil'
/usr/local/lib/ruby/2.6.0/net/protocol.rb:201:in `readline'
/usr/local/lib/ruby/2.6.0/net/http/response.rb:40:in `read_status_line'
/usr/local/lib/ruby/2.6.0/net/http/response.rb:29:in `read_new'
/usr/local/lib/ruby/2.6.0/net/http.rb:1509:in `block in transport_request'
/usr/local/lib/ruby/2.6.0/net/http.rb:1506:in `catch'
/usr/local/lib/ruby/2.6.0/net/http.rb:1506:in `transport_request'
/usr/local/lib/ruby/2.6.0/net/http.rb:1479:in `request'
rack-mini-profiler-2.0.2/lib/patches/net_patches.rb:9:in `block in request_with_mini_profiler'
rack-mini-profiler-2.0.2/lib/mini_profiler/profiling_methods.rb:39:in `step'
rack-mini-profiler-2.0.2/lib/patches/net_patches.rb:8:in `request_with_mini_profiler'
/var/www/discourse/lib/final_destination.rb:370:in `block in safe_get'
/var/www/discourse/lib/final_destination.rb:414:in `block in safe_session'
/usr/local/lib/ruby/2.6.0/net/http.rb:920:in `start'
/usr/local/lib/ruby/2.6.0/net/http.rb:605:in `start'
/var/www/discourse/lib/final_destination.rb:411:in `safe_session'
/var/www/discourse/lib/final_destination.rb:362:in `safe_get'
/var/www/discourse/lib/final_destination.rb:131:in `get'
/var/www/discourse/lib/final_destination.rb:152:in `get'
/var/www/discourse/lib/file_helper.rb:55:in `download'
/var/www/discourse/plugins/discourse-narrative-bot/plugin.rb:113:in `fetch_avatar'
/var/www/discourse/plugins/discourse-narrative-bot/plugin.rb:98:in `block in generate'
/var/www/discourse/lib/hijack.rb:56:in `instance_eval'
/var/www/discourse/lib/hijack.rb:56:in `block in hijack'
/var/www/discourse/lib/scheduler/defer.rb:94:in `block in do_work'
rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/lib/scheduler/defer.rb:89:in `do_work'
/var/www/discourse/lib/scheduler/defer.rb:79:in `block (2 levels) in start_thread'
Je suppose que le certificat est généré localement, sans aucune requête réseau externe ?
La machine est une t3a.medium (4 Go de mémoire) et le forum n’est pas particulièrement chargé (~0,4 de charge, encore beaucoup de mémoire libre). Pendant l’attente de la génération du certificat, le CPU ne semblait pas changer du tout, donc ce n’est probablement pas le goulot d’étranglement.
Nous ne sommes pas les seuls à rencontrer ce problème (je ne sais pas si celui-ci est lié), mais je n’y vois rien qui puisse aider.
Je ne sais pas si je suis sur la bonne voie, mais si je rafraîchis plusieurs fois l’URL du certificat, j’obtiens éventuellement une erreur me demandant de ralentir. Existe-t-il un mécanisme de limitation de débit des URL qui pourrait interférer ici si beaucoup de personnes génèrent les certificats au même chemin d’URL ? Probablement pas, mais je suis à court d’idées sur la raison pour laquelle cela se produit. Toute aide est la bienvenue.

