Подтвердить что ты не робот

Масштабирование приложения чата - короткий опрос и длительный опрос (AJAX, PHP)

Я запускаю веб-сайт, на котором пользователи могут общаться друг с другом через браузер (подумайте в чате Facebook). Каков наилучший способ взаимодействия с живым взаимодействием? (Прямо сейчас у меня есть опрос каждые 30 секунд, чтобы обновлять онлайн-пользователей и новые входящие сообщения, а другой опрос, проходящий по страницам чата каждую секунду, для получения новых сообщений.)

Вещи, которые я рассмотрел:

  • HTML5 Web Sockets: не использовал это, потому что он не работает во всех браузерах (только хром).
  • Flash Sockets: не использовал это, потому что я хотел в конечном итоге поддерживать мобильную сеть.

Прямо сейчас, я использую короткий опрос, потому что я не знаю, как будет масштабироваться длинный опрос AJAX. Сейчас я запускаю сервер VPS из servint (работает apache). Должен ли я использовать длительный опрос или короткий опрос? Мне не нужны абсолютно мгновенные ответы (просто "достаточно хорошо" для чат-приложения). Является ли короткий опрос чаще всего несколькими тысячами пользователей, которые собираются убить мой сервер? Как мне масштабировать, пожалуйста, помогите!

4b9b3361

Ответ 1

Несколько примечаний:

  • Опрос каждую секунду является излишним. Приложение будет по-прежнему чувствовать себя очень отзывчивым с несколькими секундами задержки между проверками.
  • Чтобы сохранить ваши ответы на трафик и скорость обмена сообщениями, рассмотрите возможность использования кеша в памяти для хранения недостигнутых сообщений. Вы по-прежнему сохраняете сообщения в db, кеш в памяти просто будет использоваться для запросов для новых сообщений, чтобы избежать запросов к db каждые x секунд каждым пользователем.
  • Тайм-аут чата пользователя после x секунд бездействия, чтобы остановить опрос на вашем сервере. Это гарантирует, что кто-то, покинув окно, не продолжит генерировать трафик. Предложите простой "Еще есть? Продолжайте общаться". ссылку на сеансы с таймаутом и предупредить пользователя перед таймаутом, чтобы они могли продлить время ожидания.
  • Я бы предложил начать опрос, а не комет/длинные опросы/сокеты. Опрос прост в построении и поддержке, и, скорее всего, он будет масштабироваться только в краткосрочной перспективе. Если вы получаете большой трафик, вы можете бросить оборудование и балансировщик нагрузки на проблему масштабирования. Вся сеть основана на опросе - опрос, безусловно, масштабы. Там, где сложность альтернатив, таких как комета/длинный опрос/и т.д., Имеет смысл, но вам нужно много трафика до того, как будет оправдано дополнительное время/сложность разработки.

Ответ 2

Это то, что каждый раз делал когда-то до введения комет и узлов.

Проблема в том, что PHP-запросы на Apache очень дороги. Если ваше чат-приложение проверяет сообщения каждый раз, вы окажетесь в ситуации, когда Apache не располагает достаточными ресурсами для ответа на запросы. Другая область, которая, я думаю, нуждается в улучшении, заключается в улучшении контекста вашего приложения чата.

Почему он обновляется каждую секунду, если не получать новые сообщения? Что делать, если сообщений нет?

Некоторые методы, которые вы можете использовать;

  • Обеспечьте легкую конечную точку для своих клиентов, которая имеет некоторый контекст сеанса чата, представляет собой новое ожидающее сообщение, количество сообщений и т.д. Клиент может ответить на это путем обновления немедленно или нет, если нет новые сообщения. Эта конечная точка может предоставить простой объект json через HTTP-запрос. Вам гарантировано, что это сообщение статуса будет фиксированным, и если ответ статуса не изменится, вы можете его разложить. См. Следующее сообщение.

  • Простой распад в вашем опросе javascript, если клиент получает один и тот же ответ от сервера несколько раз подряд, вы можете увеличить опрос на установленное время, в настоящее время вы сказали, что это была каждая секунда. Если вы это сделаете, вы увеличите количество до 2,4,6,8,10 секунд. Как только ответ с сервера изменит ваш reset распад.

Некоторые оптимизации для рассмотрения;

  • Используйте кеш PHP-кода, например APC.

  • Установите низкий тайм-аут для всех запросов, вы не хотите, чтобы какие-либо запросы зависали на вашем сервере.

  • Оптимизируйте свой PHP-код, сделайте его быстрым и быстрым.

  • Запустите некоторые тесты нагрузки, чтобы узнать, какие у вас ограничения.

  • Частота производительности, чтобы убедиться, что ваши приложения становятся быстрее.

  • Проверяйте журналы apache для указания признаков общего состояния приложения и времени отклика.

Когда масштабирование становится необходимым, добавьте новый сервер и используйте балансировщик нагрузки для распространения запросов. Я использовал Varnish и HAProxy с большим успехом, их настройка тоже не сложна.

Ответ 3

Если бы я был вами, я бы выбрал библиотеку, которая использует html5 веб-сокеты, но снова падает на сокеты Flash, если html5 недоступен, браузер, который попадает в трещины, должен быть минутным.

Также вы должны либо отказаться от php, либо добавить его с помощью потокового сервера сокетов, написанного либо в python, либо ruby ​​с помощью em-websocket.