Temos incentivado nossos novos membros a passar pelo tutorial do discobot, e vários deles estão enfrentando um problema que já havíamos experimentado em uma instância anterior do Discourse (ambiente de staging): o certificado no último post demora muito para ser gerado e aparecer de fato, sem nenhuma indicação de que está sendo carregado ou gerado. Por ‘muito tempo’, entendo um período de 10 a 20 segundos — o suficiente para alguém desistir.
Tentei no meta e parece ser instantâneo aqui.
Notei que o certificado pode ser gerado sob demanda usando a URL /discobot/certificate.svg?date=Oct+28+2020&user_id=123, então fiz alguns testes. No início, foi instantâneo. Mas assim que usei IDs de usuários que não fizeram o tutorial recentemente, precisei esperar o período de 10 a 20 segundos (é rápido assim que gerado pela primeira vez, então presumo que haja algum cache). Também obtive alguns erros 500 durante o período de espera, que presumo serem algum tipo de timeout, pois funcionou na próxima atualização.
Nos /logs, estou vendo um aviso que não sei se está relacionado:
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'
Entendo que o certificado é gerado localmente, sem nenhuma solicitação de rede externa?
A máquina é uma t3a.medium (4 GB de memória) e o fórum não está particularmente ocupado (~0,4 de carga, ainda há muita memória livre). Durante a espera pela geração do certificado, a CPU não parece ter mudado em nada, então isso não parece ser o gargalo.
Não somos os únicos enfrentando isso (não tenho certeza se isso está relacionado), mas não vejo nada lá que possa ajudar.
Não tenho certeza se estou no caminho certo, mas se eu atualizar a URL do certificado algumas vezes, eventualmente recebo um erro dizendo para diminuir a velocidade. Existe algum mecanismo de limitação de URL que possa estar interferindo aqui se muitas pessoas estiverem gerando certificados no mesmo caminho de URL? Possivelmente não, mas estou sem ideias do por que isso está acontecendo. Qualquer dica é bem-vinda.

