У вас, похоже, проблема с нагрузкой на сервер, поэтому я сравню соответствующие технологии.
Ajax-опрос:
Это самое простое. Вы выполняете цикл setTimeout каждые 5 секунд или чаще, чтобы проверять наличие новых сообщений чата, или устанавливаете iframe для перезагрузки. Когда вы публикуете сообщение, вы также возвращаете новые сообщения, и вещи не должны выходить из строя. Самым большим недостатком этого метода является то, что вы вряд ли будете опрашивать с частотой, соответствующей частоте отправки сообщений. Либо вы будете опрашивать слишком быстро, и вы будете делать много дополнительных запросов, либо вы будете опрашивать слишком медленно, и вы будете получать порции сообщений за раз вместо того, чтобы получать их в режиме реального времени. Это, безусловно, самый простой способ.
HTTP Push
Это идея о том, что сервер должен сообщать клиенту о появлении новых сообщений, а не постоянно беспокоить сервер, спрашивая, есть ли еще новые. Представьте, что родитель ведет машину, а ребенок спрашивает: «Мы уже там?», Вы можете просто попросить родителя сказать ребенку, когда они туда доберутся.
Есть несколько способов подделать это и сделать это по-настоящему. Упомянутые вами WebSockets фактически создают поток между клиентом и сервером и отправляют данные в режиме реального времени. Это потрясающе, и для 4 из 10 пользователей, у которых есть браузер, способный это сделать, они будут в восторге. У всех остальных будет сломанная страница. Сожалею. Может быть, через пару лет.
Вы также можете подделать технологию push с такими вещами, как long-polling . Идея состоит в том, что вы спрашиваете сервер, есть ли какие-либо новые сообщения, и сервер не отвечает до тех пор, пока не появится новое сообщение или не будет достигнут некоторый заданный предел (30 секунд или около того). Это сводит количество запросов к минимуму при использовании известных веб-технологий, поэтому большинство браузеров будут работать с ним. У вас будет высокий параллелизм соединения, но они на самом деле ничего не делают, поэтому он должен иметь слишком высокую стоимость сервера.
Я использовал все это раньше, но в итоге я сам пошел на длинный опрос . Вы можете узнать больше о том, как на самом деле это сделать, здесь: Как мне реализовать базовый «длинный опрос»?