О принципе работы long-polling, socket

Рейтинг: 2Ответов: 2Опубликовано: 10.11.2014
  1. Заголовок keep-alive... Когда браузер отправляет запрос через ajax, то сервер (apache) не закрывает соединение на протяжении 5 секунд. Так вот, соединение на протяжении этого времени считается открытым, а почему тогда при повторной отправке браузер опять формирует заголовки и прочее? В чем разница? Дело в том, что если браузер и сервер не закрывают соединение на протяжении 5 секунд, тогда зачем заморачиваться long-polling? Какое тогда между двумя этим запросами отличие? Помимо того, что с long-polling результат придет быстрее.
  2. В предыдущем вопросе я упомянул long-polling, хотя особо не представляю, как он работает. Пример: у меня имеется чат и сообщения которые хранятся в БД, то-есть, браузер отправляет запрос на сервер, где сам запрос в БД (для проверки новых сообщений) помещен в бесконечный цикл, и если новые данные имеются, после этого сервер осуществляет ответ. Я правильно понял принцип? А не ляжет ли сервер от такого "Бесконечного" количества запросов в БД, ну, предположим, я буду отправлять цикл в сон каждые 500 миллисекунд, но тем не менее. Как в идеале это должно работать?
  3. Сокеты работают по такому же принципу (я имею в виду проверки новых данных), как я описал во втором вопросе?
  4. Сколько максимум может длиться (по времени) запрос AJAX (версия HTTP/1.1). Ну, к примеру, если на сервере установить sleep на 20 минут. Это вообще нормально столько времени не закрывать соединения? Каждый браузер ведет себя по-разному? Пробовал в гугл хром 38 версия, соединения держится более 10 минут, а дольше не пробовал.

Ответы

▲ 5Принят
  1. при keep-alive в одном подключении просто несколько полноценных запросов. Они как бы "независимы". Просто время на установление подключения для мелких запросов занимает существенное время. При long-pulling запрос уходит, а ответ приходит позже. (в первом случае сервер присылает ответ сразу и не ждет).

  2. Сервер не обязан опрашивать базу каждые пол секунды. Плюс могут применяться различные оптимизации.

    А не ляжет ли сервер от такого "Бесконечного" количество запросов в БД

    а это зависит от Вашего кода. База может лечь и от одного запроса. А может обслуживать тысячи запросов в секунду.

  3. с сокетами все проще. И keepalive, и longpolling работают поверх http (обычно). А http работает поверх сокетов. Поэтому через сокеты можно сделать перечисленное выше, так и сделать другими методами.

  1. Сколько максимум может длиться (по времени) запрос AJAX (версия HTTP/1.1).

    В теории - бесконечно. Я не видел ограничений

    Ну, к примеру, если на сервере установить sleep на 20 минут. Это вообще нормально столько времени не закрывать соединения?

    Да, если это нужно.

    Каждый браузер ведет себя по разному? Пробовал в гугл хром 38 версия, соединения держится более 10 минут, а дольше не пробовал.

    Да, это все сильно браузерозависимо.

▲ 4
  1. Keep-alive в HTTP/1.0 экономит клиенту время на поднятие соединения, а серверу - ресурсы на прием соединения. Разные серверы дают разный таймаут на Keep-Alive.
  2. Да там в некотором роде "бесконечный цикл". Но вас ведь не смущает, что все запущенные программы на вашем компьютере находятся в бесконечном цикле. И нет нужды дергать БД непрерывно. Да и не обязательно текущие сообщения чата вообще держать в БД.
  3. Да, общая схема такая. Вычитывание данных -> Реакция.
  4. Опять-таки у разных браузеров разные дефолтные значения таймаутов.