Наверх

Как же работает чат?

Представим ситуацию, когда на каком-либо сервисе действуют 1000 групповых чатов по 50 пользователей в каждом. Как чат поведет себя под такой нагрузкой? Требуемые ресурсы и архитектура микросервисов выглядит следующим образом.

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

Через эти протоколы все пользователи подключаются к комет серверу CppComet, который работает на основе технологии comet. Он написан на C++ и является многопоточным, поэтому может выдержать большую нагрузку в несколько десятков тысяч соединений. CppComet предоставляет API для отправки сообщений из бекенда чата во фронтенд через вебсокеты, то есть описание процесса отправки. Вообще, API – это набор функций, описывающих условия взаимодействия двух программ или двух сайтов.

Бекенд чата написан на PHP и оформлен как плагин к October CMS. Эта платформа предоставляет удобную панель администратора, функции для работы с файлами сайта и много других дополнительных плагинов, которые могут оказаться полезны. Кроме этого, October CMS является достаточно гибкой и быстрой системой, которая основана на Laravel. Это не замедляет работу кода по сравнению с тем, если бы код писался без использования CMS. Также October CMS дает механизм для кеширования на выбор: Redis, Memcached или кеш в файлах.

Фронтенд чата написан на JavaScript с использованием JQuery. Для управления базой данных используется MySQL или MariaDB. Проводилось нагрузочное тестирование чата. Но значительно будет влиять поведение пользователей, то как часто они отправляют сообщения и переключаются между диалогами. Если пользователь находится онлайн, но ничего не делает, то он только слегка нагружает сервер. Если совершает активные действия, отправляет сообщения, то его запросы должны обрабатываться сервером и сообщения сохраняются в БД. В этих статьях описаны механизм нагрузочного тестирования чата и результаты тестирования. Всю эту нагрузку может выдержать один недорогой сервер.

Есть еще один отличный механизм, встроенный в чат - кеширование переписки в интерфейсе Indexed Database API. Это база данных, которую можно использовать внутри любого браузера для хранения большого количества данных. При переключении диалогов пользователь получает результат из локального кеша его браузера мгновенно. И затем, в фоне отправляется запрос с сервера для проверки наличия сообщений, не попавших в кеш. Такой механизм позволяет чату работать даже при отсутствии подключения к интернету. Данные переписки будут просто доставаться из кеша. А если пользователь напишет сообщение, то оно отправится в кеш браузера и будет передано на сервер в фоновом режиме, при возобновлении работы сети. В итоге, благодаря кешированию всех сообщений и диалогов в IndexdDB пользователь почти всегда получает ответ мгновенно еще до обработки его сервером. И, если сервер перегружен, то сообщение может отправляться чуть дольше. Но сам чат все еще будет работать.

Если чат работает на Cordova приложении, то в кеш попадают ещё и файлы в сообщениях (изображения, аудио и др.) и приложение работает как стандартный мессенджер. Также есть реальный проект с настоящей нагрузкой на 130000 пользователей, у которых много диалогов и по 2 Гб фотографий и других файлов в день. И чат справляется с этим отлично. Также на сайте GisAuto установлен чат на базе CppComet. Он работает стабильно и за год эксплуатации не было серьезных проблем.

Другие статьи: