Анатомия плагина чата. Как устроен ImbaChat?
Основа работы плагина чата — это обмен данными между браузером и сервером, при отправке и получении сообщений, через постоянное соединение. Это соединение обеспечивается технологией WebSocket (Протокол 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 Гб файлов в день. И чат справляется с этим отлично.