Закрытие соединений с источником событий с помощью Apache - PullRequest
0 голосов
/ 04 декабря 2018

У меня возникла проблема с 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;
});

Но закрытие, похоже, ничего не делает.Я думал об отправке запроса, чтобы заставить сервер закрыть соединение, но я не уверен, как бы это реализовать.

...