Расходы, связанные с сервером, на стороне сервера
Если я правильно понимаю принцип Server-Sent Events, каждый раз, когда клиент регистрируется в EventSource, он фактически открывает новое HTTP-соединение с ресурсом, управляющим событием. В отличие от других HTTP-запросов, соединение остается в живых, поэтому серверный процесс/поток, выделенный этому клиенту, продолжает работать до тех пор, пока клиент не отключится.
Что делать, если у нас 1000 клиентов, подключенных к приложению с использованием SSE? Будет ли у нас 1000 процессов/потоков (что-то одно и то же), работающих одновременно, для обработки SSE? Я предполагаю, что ошибаюсь, но если это не так, это действительно более эффективно, чем обычный метод опроса AJAX, где, по крайней мере, серверу не нужно одновременно запускать много процессов/потоков?
Ответы
Ответ 1
Да, каждый клиент держит соединение открытым, насколько это возможно. При использовании 1000 одновременных пользователей вы должны открыть 1000 TCP/IP-соединений.
Однако, зависит ли каждое соединение от потока от сервера.
Apache обычно поддерживает поток для каждого подключения, поэтому он довольно дорогостоящий. С Apache лучше всего отключить KeepAlive и использовать опрос.
OTOH с серверами на основе событий, такими как node.js, вы можете иметь только один процесс, который управляет всеми подключениями, поэтому стоимость каждого соединения намного ниже, и вы сможете легко открывать тысячи подключений.
Прохладная вещь SSE заключается в том, что вы можете использовать ее для проведения опроса. Он имеет директиву retry:
, которая указывает, как долго клиент должен ждать до повторного подключения (опроса). Просто отправьте это и закройте соединение, если хотите опрос.
Ответ 2
Это зависит от модели потока на сервере. Apache по умолчанию используется один поток (или процесс) для каждого соединения, поэтому даже если потоки не очень много (как ожидается, с помощью SSE), они сидят там, используя ресурсы.
Серверы, такие как Nginx, имеют немного другую модель, каждый поток обрабатывает несколько запросов асинхронно. Такие вещи, как SSE и WebSockets, намного эффективнее.
Apache можно сделать в выполнять больше как Nginx и аналогичные серверы.