- 348
- 184
Привет.
Видел, @NarutoUA сделал live-chat, однако, посмотрев, стало понятно - к серверу посылалось огромное количество запросов в минуту для получения новых сообщений.
Я же решил выложить свою версию чата.
Ссылка - https://muxui.randewoo.me/
В чем отличия?
Видел, @NarutoUA сделал live-chat, однако, посмотрев, стало понятно - к серверу посылалось огромное количество запросов в минуту для получения новых сообщений.
Я же решил выложить свою версию чата.
Ссылка - https://muxui.randewoo.me/
В чем отличия?
- Весь back-end написан на Lua.
- Алгоритм получения сообщений - LongPoll (сервер не даст ответ до тех пор, пока другой пользователь не напишет сообщение, что в сотни раз снижает нагрузку и трафик).
- Используется сверхскоростная-самописная база данных на P-Memcached (данные о пользователях не собираются, логи сервера полностью отключены).
Исходный код в скором времени выложу в общий доступ (надо исправить баги, если найдутся, и привести код в порядок), сейчас же вы можете протестировать скорость работы чата (ответ от сервера (без создания клиент-серверной сессии) занимает не более 0.2 секунд).
Также, чат основан на самописном API. Если кому интересно, можно создавать ботов (есть умная система анти-флуда, если вы отправили более 3-х запросов на сервер, сервер выдаст вам ошибку, придется подождать 5 секунд с момента последней отправки сообщений).
P.S. Скорость также напрямую зависит от конфигурации сервера/веб сервера.
Конфигурация сервера:
1vCPU x 3600 GHz, 512 RAM, 1GiB/s SSD (чтение/запись) на 10 GB, сеть 200MiB/s.
Конфигурация веб-сервера:
Веб-сервер: nginx
Версия nginx: 1.14.1 (performance remake)
Лимит одновременных подключений: 10000
gZIP: Сжатие данных больше среднего (level 6, max level: 10).
Версия протокола HTTP: HTTP/2
Имеется Wildcard SSL от Let's Encrypt.
Время кэширования SSL сессии: 60 минут.
Включено всевозможное кэширование запросов-ответов на SSD.
Скрипт скомпилирован через LuaJIT.
Включено кэширование в RAM в самом nginx.
Включены пулы потоков.
Подключение к БД происходит только по UNIX сокету.
Надеюсь, более-менее понятно описал характеристики.
Напомню, как только приведу код в порядок - обязательно выложу его в общий доступ.
Также, извиняюсь за верстку. Я не верстальщик. ;)
Также, чат основан на самописном API. Если кому интересно, можно создавать ботов (есть умная система анти-флуда, если вы отправили более 3-х запросов на сервер, сервер выдаст вам ошибку, придется подождать 5 секунд с момента последней отправки сообщений).
PHP:
<?php
error_reporting(E_ALL & ~E_NOTICE);
ini_set('display_errors', false);
date_default_timezone_set('Europe/Moscow');
header('Charset: UTF-8');
$curl = curl([
'method' => 'user.join',
'login' => 'muxui',
'password' => '*****',
]);
$access_token = $curl['response']['user_content']['access_token'];
$message_id = $curl['response']['message_content']['id'];
$long = false;
print('Бот запущен. Соединение с сервером закрылось.');
fastcgi_finish_request();
while (true) {
if (!$long) {
long();
}
}
function long() {
global $long;
global $message_id;
global $access_token;
$long = true;
$curl = curl([
'method' => 'message.longpoll',
'message_id' => $message_id,
'access_token' => $access_token,
'wait' => 10,
]);
$message_id = $curl['response']['message_content']['id'];
if (!$curl['response']['status']) die(json_encode($curl));
foreach ($curl['response']['message_content']['messages'] as $json) {
if (strpos($json['text'], 'cmd')) $text = '@' . $json['sender']['login'] . ', какие команды?';
elseif (strpos($json['text'], 'help')) $text = '@' . $json['sender']['login'] . ', какие команды?';
elseif (strpos($json['text'], 'time')) $text = '@' . $json['sender']['login'] . ', ' . date('H:i:s');
$curl = curl([
'method' => 'message.send',
'text' => $text,
'access_token' => $access_token,
]);
$long = false;
}
}
function curl($array) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://muxui-api.randewoo.me');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array));
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
$output = curl_exec($ch);
curl_close($ch);
return json_decode($output, true);
}
?>
Конфигурация сервера:
1vCPU x 3600 GHz, 512 RAM, 1GiB/s SSD (чтение/запись) на 10 GB, сеть 200MiB/s.
Конфигурация веб-сервера:
Веб-сервер: nginx
Версия nginx: 1.14.1 (performance remake)
Лимит одновременных подключений: 10000
gZIP: Сжатие данных больше среднего (level 6, max level: 10).
Версия протокола HTTP: HTTP/2
Имеется Wildcard SSL от Let's Encrypt.
Время кэширования SSL сессии: 60 минут.
Включено всевозможное кэширование запросов-ответов на SSD.
Скрипт скомпилирован через LuaJIT.
Включено кэширование в RAM в самом nginx.
Включены пулы потоков.
Подключение к БД происходит только по UNIX сокету.
Надеюсь, более-менее понятно описал характеристики.
Напомню, как только приведу код в порядок - обязательно выложу его в общий доступ.
Также, извиняюсь за верстку. Я не верстальщик. ;)
Последнее редактирование: