2015-05-23 5 views
2

Как каждый сайт объясняет, что в SSE одно соединение остается открытым между клиентом и сервером «С SSE клиент отправляет стандартный HTTP-запрос с запросом потока событий, и сервер сначала отвечает стандартным ответом HTTP и удерживает соединение открытым »События, отправленные сервером SSE - Клиент продолжает отправлять запросы (например, объединение)

И затем, когда сервер решает, что он может отправлять данные клиенту, а то, что я пытаюсь реализовать SSE, я вижу, что запросы на скрипач посылаются каждой парой секунд

Для меня это похоже на длительный опрос, и ни одно соединение не было открыто.

Кроме того, это не то, что сервер принимает решение послать данные клиенту, и он посылает его, но он отправляет данные только тогда, когда клиент посылает следующий запрос

Если я ответить с «Retry: 10000» даже жесткое что-то произошло то, что сервер хочет уведомить прямо сейчас, получит клиент только на следующий запрос (через 10 секунд), который для меня на самом деле не похож на соединение, которое хранится открыто, и сервер отправляет данные, как только захочет в

fiddler sse

ответ

3

Ваш ремонт лежит er немедленно закрывает соединение. SSE имеет встроенную функцию повтора для того, когда соединение потеряно, так что вы видите, это:

  • Клиент подключается к серверу
  • Сервер myteriously умирает
  • Клиент ждет две секунды, то автоматически воссоединяется
  • Сервер myteriously умирает
  • Клиент ждет две секунды, то автоматически воссоединяется
  • ...

Чтобы исправить сценарий на стороне сервера, вы хотите пойти против всего, что ваши родители научили вас правильному и неправильному, и преднамеренно создать бесконечный цикл. Таким образом, он будет в конечном итоге выглядит примерно так:

validate user, set up database connection, etc. 
while(true){ 
    get next bit of data 
    send it to client 
    flush 
    sleep 2 seconds 
    } 

Где get next bit of data может быть опрос таблицы БДА для новых записей с последним опросом, или отсканировать каталог файловой системы для новых файлов и т.д.

с другой стороны, если процесс на стороне сервера является анализом затянувшимся данных, ваш сценарий может вместо этого выглядеть следующим образом:

validate user, set-up, etc. 
while(true){ 
    calculate next 1000 digits of pi 
    send them to client 
    flush 
    } 

Это предполагает, что высчитывает линия занимает по меньшей мере половину второй бежать; и вы начнете забивать сокет множеством небольших пакетов данных без каких-либо преимуществ (пользователь не заметит, что они получают 10 обновлений/секунду вместо 2 обновлений/секунду).

+0

Большое спасибо за ваш ответ. Я начал понимать вещи и пришел к такому же выводу, но позже я разместил еще один вопрос. Просьба взять добычу в нем: http: // stackoverflow.com/questions/30421318/does-signalr-server-sent-events-implementation-Occupy-thread-for-every-connection – yanivps

+0

Я хочу сказать, что использование этого бесконечного цикла на сервере и сохранение потока, используемого для каждого клиента, выглядит так: сервер, который после того, как несколько клиентов не смогут ответить на любой запрос – yanivps

+0

Я не знаю внутренности signalR, но я попытался ответить на ваш другой вопрос. У вас более двух потоков (ну, если вы не настроили веб-сервер, чтобы разрешить только два одновременных подключения). Как правило, проблема заключается в том, что память, необходимая для того, чтобы держать каждый сокет открытым, а не потоком/процессом доступности, и вы попадаете на лимит между серверами между 200 и 2000 одновременными клиентами. Это компромисс: SSE дает вам более низкую задержку, за счет необходимости держать больше ресурсов открытым. –