Закрытие соединений с источником событий с помощью Apache
Я открыл вопрос с Flask-SSE здесь, но я подумал, что я бы попросил более широкую аудиторию.
Я разрабатываю веб-приложение, используя Flask, Apache, и сервер отправляет события на стороне сервера с помощью Redis и Flask-SSE.
Flask-SSE поддерживает открытые долгосрочные сеансы TCP для получения событий, но как я могу убедиться, что эти соединения закрыты, когда клиент уходит со страницы? Эти соединения задерживаются и в конечном итоге потребляют все доступные процессы Apache и соединения MySQL.
У меня не было проблем с реализацией SSE с использованием этой библиотеки, однако мне интересно, как заставить клиента закрывать соединения. Состояние сервера Apache показывает много открытых соединений, и это удерживает открытыми многие процессы.
Srv PID Acc M CPU SS Req Conn Child Slot Client Protocol VHost Request
0-0 7653 0/22/22 W 62.77 15499 0 0.0 1.47 1.47 XXX.XXX.82.252 http/1.1 EXAMPLE.COM:443 GET /commands?channel=images150 HTTP/1.1
1-0 7654 1/15/15 W 2.75 16422 0 7.8 1.95 1.95 XXX.XXX.82.252 http/1.1 EXAMPLE.COM:443 GET /commands?channel=images150 HTTP/1.1
2-0 7655 0/15/15 W 1.27 16418 0 0.0 0.52 0.52 XXX.XXX.82.252 http/1.1 EXAMPLE.COM:443 GET /commands?channel=images150 HTTP/1.1
3-0 7656 0/23/23 W 244.03 16089 0 0.0 0.16 0.16 XXX.XXX.82.252 http/1.1 EXAMPLE.COM:443 GET /commands?channel=images150 HTTP/1.1
4-0 7657 0/16/16 W 123.45 16416 0 0.0 0.34 0.34 XXX.XXX.82.252 http/1.1 EXAMPLE.COM:443 GET /commands?channel=images150 HTTP/1.1
5-0 7734 0/15/15 W 138.78 16089 0 0.0 0.81 0.81 XXX.XXX.82.252 http/1.1 EXAMPLE.COM:443 GET /commands?channel=images150 HTTP/1.1
6-0 7735 1/31/31 W 2.81 72 0 3.8 1.38 1.38 XXX.XXX.42.137 http/1.1 EXAMPLE.COM:443 GET /commands?channel=images152 HTTP/1.1
Многие из них с того же IP-адреса, а это означает, что каждый раз, когда пользователь переходит на страницу, которая подписывается на EventSource, он занимает другой слот.
Я добавил раздел "beforeunload", чтобы попытаться закрыть источник событий, когда пользователь уходит со страницы.
$(window).on('beforeunload', function () {
event_source.close();
event_source = null;
});
Но закрытие, похоже, ничего не делает. Я думал об отправке запроса, чтобы заставить сервер закрыть соединение, но я не уверен, как бы это реализовать.