У меня есть веб-служба на основе Haskell, которая выполняет вычисления, которые для некоторого ввода могут занять очень долгое время. ( "действительно длинный" здесь означает более минуты)
Поскольку для выполнения этого вычисления весь процессор доступен на сервере, я помещаю входящие запросы в очередь (ну, фактически, стек по причинам, связанным с типичным клиентом, но который помимо точки), когда они поступают, и обслуживать их, когда заканчивается текущий текущий расчет.
Моя проблема заключается в том, что клиенты не всегда ждут достаточно долго, а иногда и заканчивают на своем конце, отключают и пробовали другой сервер (ну, они снова пытаются и попадают в локоть, и обычно получают другой экземпляр), Кроме того, иногда расчет, который запрашивал веб-клиент, станет устаревшим из-за внешних факторов, и веб-клиент будет убит.
В таких случаях мне бы хотелось узнать, что веб-клиент ушел, прежде чем вытащить следующий запрос из стека и начать (дорогой) расчет. К сожалению, мой опыт работы с snap заставляет меня думать, что в этой системе нет способа спросить: "является ли клиентское TCP-соединение еще подключенным?" и я не нашел никакой документации для других веб-фреймворков, которые охватывают случай "отсоединенный клиент".
Итак, существует ли веб-инфраструктура Haskell, которая позволяет легко обнаружить, отключен ли веб-клиент? Или, если это не так, есть ли, по крайней мере, это возможно?
(Я понимаю, что во всех случаях может быть абсолютно невозможно убедиться, что TCP-клиент все еще существует, не отправляя данные на другой конец, однако, когда клиент фактически отправляет RST-пакеты на сервер и серверную инфраструктуру не позволяет программному коду определить, что соединение ушло, что проблема)
Кстати, хотя можно было бы предположить, что обработчик warp onClose
позволит вам сделать это, это срабатывает только тогда, когда ответ готов и написанное клиенту, поэтому бесполезно как способ прервать текущий расчет. Также не представляется возможным получить доступ к принятому сокету, чтобы установить SO_KEEPALIVE
или аналогичный. (Есть способы доступа к первому гнезду для прослушивания, но не к принятому)