Мы активно предлагаем нашим новым участникам пройти обучающий курс discobot, и довольно многие сталкиваются с проблемой, которую мы уже наблюдали в предыдущем (тестовом) экземпляре Discourse: сертификат в последнем сообщении генерируется и появляется очень долго, без каких-либо указаний на то, что он загружается или генерируется. Под «очень долго» я имею в виду период в 10–20 секунд — этого достаточно, чтобы кто-то потерял терпение. Я проверил на meta, и там всё происходит мгновенно.
Я заметил, что сертификат можно сгенерировать по требованию, используя URL /discobot/certificate.svg?date=Oct+28+2020&user_id=123, поэтому я провёл несколько тестов. Сначала всё было мгновенно. Но как только я начал использовать идентификаторы пользователей, которые недавно не проходили обучающий курс, мне приходилось ждать 10–20 секунд (после первого генерирования оно происходит быстро, поэтому я предполагаю, что где-то есть кэш). Также во время ожидания я получал некоторые ошибки 500, которые, по-видимому, были вызваны каким-то таймаутом, поскольку при следующем обновлении страницы всё работало.
В логах (/logs) я вижу предупреждение, не знаю, связано ли оно с проблемой:
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'
Я так понимаю, что сертификат генерируется локально, без каких-либо внешних сетевых запросов?
Сервер — t3a.medium (4 ГБ памяти), форум не особенно загружен (~0,4 нагрузки, ещё много свободной памяти). Во время ожидания генерации сертификата загрузка процессора не менялась, так что это, по-видимому, не является узким местом.
Мы не единственные, кто сталкивается с этим (не уверен, связано ли это с этим), но я не вижу там ничего, что могло бы помочь.
Не уверен, что я на правильном пути, но если я несколько раз обновлял URL сертификата, то в итоге получал ошибку с предложением замедлиться. Существует ли какой-то механизм ограничения частоты запросов по URL, который может мешать здесь, если многие люди генерируют сертификаты по одному и тому же пути URL? Возможно, нет, но я не понимаю, почему это происходит. Любые подсказки будут приняты с благодарностью.

