2011-03-15 1 views
31

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

Вещи Я рассмотрел:

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

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

+1

Я знаю, что Apache обычно плохо справляется со многими одновременными соединениями. И также поймите, что для этого scenerio могут быть другие решения (nodejs и т. Д.). Но сейчас я бы хотел избежать переписывания всего приложения. –

+0

Как реализовать несколько решений для разных платформ? I.e., если поддерживается HTML5, браузер использует HTML5, если поддерживается флэш-память, браузер использует флэш-память, если ни одно из вышеперечисленных не поддерживается, браузер использует ajax. – binaryLV

+0

Вам может быть интересно это сообщение http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/ –

ответ

41

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

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

последний момент был очень полезен - я пытался решить, насколько надежным будет первая реализация опроса в моем приложении, и я думаю, что я буду принимать ваши советы и быстро работать с простым опросом, а затем спланировать умный, долгосрочное решение. – simmer

22

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+0

Динамическое приращение - это то, о чем я никогда не думал, действительно хорошая точка – JayIsTooCommon

1

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

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

Смежные вопросы