#ruby-on-rails #ruby #http
Вопрос:
Я переписывал статью https://www.meziantou.net/handling-aborted-requests-in-asp-net-core.htm и мне интересно, есть ли какая-либо функциональность для обработки прерванных запросов клиентов в Rails.
Я всегда думал, что с такими ситуациями невозможно справиться. Может быть, у кого-то есть какие-то мысли по этому поводу.
Проблема У нас есть устаревший проект, и некоторые http-запросы очень тяжелые и выполняются не асинхронно. Это означает, что клиент может подождать некоторое время, а затем закрыть вкладку или перезагрузить страницу. Но этот тяжелый запрос все еще выполняется на стороне сервера (Ruby on Rails)
Моя идея От клиента: мы можем сгенерировать uniq X-Request-ID и заполнить его в заголовках запросов. Затем на стороне сервера мы можем сохранить этот идентификатор в Redis и установить updated_at=Time.now
. Если приложение rails завершит запрос => удалите идентификатор X-запроса из Redis. После этого от клиента мы можем отправлять запросы на опрос, чтобы обновить время для этого идентификатора uniq. С помощью Sidekiq worker мы можем захватить все идентификаторы, которые больше не обновляются. Можно ли запретить серверу выполнять запрос по X-Request-ID ?
P.S. Я знаю, что это звучит так, как будто лучше использовать веб-сокеты, где мы можем обрабатывать прерывание соединения, но мне нужно сделать это для http-запросов.
Ответ №1:
Вы можете подумать об использовании этой функции JS, чтобы предупредить клиента о том, что он не перезагружает и не прерывает запрос
<script type="text/javascript">
window.onbeforeunload = function() {
return "Dude, are you sure you want to leave? Think of the kittens!";
}
и если пользователь подтвердит прерывание, вы сохраните(кэш содержимого) и отслужите, когда пользователь вернется на страницу.
Комментарии:
1. Я предполагаю, что это не мешает серверу rails продолжать обработку запроса, и процесс на сервере продолжается.