PDA

Просмотр полной версии : Web-chat on Lua


альбертио представляет
01.08.2019, 22:29
Привет.

Видел, @NarutoUA (https://www.blast.hk/members/2504/) сделал live-chat, однако, посмотрев, стало понятно - к серверу посылалось огромное количество запросов в минуту для получения новых сообщений.

Я же решил выложить свою версию чата.

Ссылка - https://muxui.randewoo.me/ (https://www.blast.hk/redirect/aHR0cHM6Ly9tdXh1aS5yYW5kZXdvby5tZS8)

В чем отличия?



Весь back-end написан на Lua.​

Алгоритм получения сообщений - LongPoll (сервер не даст ответ до тех пор, пока другой пользователь не напишет сообщение, что в сотни раз снижает нагрузку и трафик).​

Используется сверхскоростная-самописная база данных на P-Memcached (данные о пользователях не собираются, логи сервера полностью отключены).​
Исходный код в скором времени выложу в общий доступ (надо исправить баги, если найдутся, и привести код в порядок), сейчас же вы можете протестировать скорость работы чата (ответ от сервера (без создания клиент-серверной сессии) занимает не более 0.2 секунд).

Также, чат основан на самописном API. Если кому интересно, можно создавать ботов (есть умная система анти-флуда, если вы отправили более 3-х запросов на сервер, сервер выдаст вам ошибку, придется подождать 5 секунд с момента последней отправки сообщений).

PHP:






'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);
}
?>




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 сокету.

Надеюсь, более-менее понятно описал характеристики.

Напомню, как только приведу код в порядок - обязательно выложу его в общий доступ.

Также, извиняюсь за верстку. Я не верстальщик. ;)​

Vitali0
01.08.2019, 22:31
В темной тебе вообще нихуя не видно




Opera Снимок_2019-08-01_223102_blast.hk.pngVitali0 · 1 Авг 2019 в 21:31' data-fancybox="lb-post-378678" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/36241/" style="cursor: pointer;" title="Opera Снимок_2019-08-01_223102_blast.hk.png">
https://forum.antichat.xyz/attachments/27378678/

альбертио представляет
01.08.2019, 22:32
В темной тебе вообще нихуя не видно


О как. Хорошо, сейчас поправлю.

Stiopko
01.08.2019, 22:39
О как. Хорошо, сейчас поправлю.


При первой загрузке сообщений загрузка идет наоборот

альбертио представляет
01.08.2019, 22:41
При первой загрузке сообщений загрузка идет наоборот


Все новые сообщения появляются внизу, так привычней же.

xISRAPILx
01.08.2019, 22:43
Вызов принят, пошел писать подобное на спринге!

UDP: Вот как отленюсь, так и сделаю.

Stiopko
01.08.2019, 22:43
Все новые сообщения появляются внизу, так привычней же.


да, я понял но первая загрузка идет наоборот, типа я написал сообщение оно отобразилось внизу, перезагружаю страницу, захожу на аккаунт и оно в самом верху почему-то

es3n1n)
01.08.2019, 22:51
А при чем здесь JS CSS HTML ?

Carrentine
01.08.2019, 22:56
А при чем здесь JS CSS HTML ?


maybe комбо x3 епта.

winten
01.08.2019, 23:31
было бы интересно посмотреть на сурсы. по описанию топ. только как зарегаться не понятно

AnWu
01.08.2019, 23:35
Когда заходишь в чат сообщения в обратном порядке.

альбертио представляет
02.08.2019, 00:12
да, я понял но первая загрузка идет наоборот, типа я написал сообщение оно отобразилось внизу, перезагружаю страницу, захожу на аккаунт и оно в самом верху почему-то


Понял, о чем Вы, спасибо, исправлю.



А при чем здесь JS CSS HTML ?


front-end разве у нас еще на чем-то пишется, помимо HTML/CSS/JS?



было бы интересно посмотреть на сурсы. по описанию топ. только как зарегаться не понятно


В скором времени.



Когда заходишь в чат сообщения в обратном порядке.


Понял, спасибо, исправлю.



Понял, о чем Вы, спасибо, исправлю.

front-end разве у нас еще на чем-то пишется, помимо HTML/CSS/JS?

В скором времени.

Понял, спасибо, исправлю.


Странно, у меня почему-то все нормально работает.

Можете прислать скриншот консоли в браузере?

https://forum.antichat.xyz/attachments/27378739/



было бы интересно посмотреть на сурсы. по описанию топ. только как зарегаться не понятно


Все просто - регистрация не нужна.

Если Вы введете логин (который ранее не существовал) и пароль - Вы автоматически зарегистрируетесь.

Потом можете просто вставлять логин и пароль.

Но если же этот аккаунт существует, и Вы ввели неверный пароль - система уведомит Вас об этом.

Ded Perded
02.08.2019, 01:01
Считаю это **(там секретное слово для спецслужб). Шел 2019 век люди все еще юзали LP.

WebSocket (https://www.blast.hk/redirect/aHR0cHM6Ly9sZWFybi5qYXZhc2NyaXB0LnJ1L3dlYnNvY2tldH M)

learn.javascript.ru


оставлю это тут

альбертио представляет
02.08.2019, 02:25
Считаю это **(там секретное слово для спецслужб). Шел 2019 век люди все еще юзали LP.

WebSocket (https://www.blast.hk/redirect/aHR0cHM6Ly9sZWFybi5qYXZhc2NyaXB0LnJ1L3dlYnNvY2tldH M)

learn.javascript.ru


оставлю это тут


Сразу поливать лишь из-за того, что схема не такая, какой ее привыкло видеть общество? Ну не глупо ли, хех?)

Знаю про сокеты, но стоит ли делать из мухи слона? Я захотел сделать бекенд на REST HTTP API - сделал.

Вы можете сделать тоже самое, но на сокетах, и мы даже можем устроить бенчмарки (да, для каждого запроса при разных ситуациях у меня есть готовый бенчмарк), и сравнить, что же все таки быстрее, REST HTTP API, или же WS.

P.S. Спойлер - REST HTTP API быстрее. Замерял.

Ну так, замерим?)

rraggerr
02.08.2019, 08:16
Сразу поливать лишь из-за того, что схема не такая, какой ее привыкло видеть общество? Ну не глупо ли, хех?)
Знаю про сокеты, но стоит ли делать из мухи слона? Я захотел сделать бекенд на REST HTTP API - сделал.
Вы можете сделать тоже самое, но на сокетах, и мы даже можем устроить бенчмарки (да, для каждого запроса при разных ситуациях у меня есть готовый бенчмарк), и сравнить, что же все таки быстрее, REST HTTP API, или же WS.
P.S. Спойлер - REST HTTP API быстрее. Замерял.
Ну так, замерим?)


общество привыкло смотреть на говно-чаты через гет запросы, пока все нормальные люди делают их через сокет

winten
02.08.2019, 09:06
Стоит поправить чутка, иконки вылазят за край

Ded Perded
02.08.2019, 10:54
P.S. Спойлер - REST HTTP API быстрее. Замерял.
Ну так, замерим?)


Мне кажется что это зависит на чем у тебя написан backend. NodeJS будет задыхаться от большого количества клиентов, да она асинхронная, но однопоточная.

Тот же python или lua будут чувствовать себя лучше. Будем идти выше, допустим go чем выше идём тем лучше будет и быстрее то либо иное. Может так же зависит от опыта разработчика, но так же не развиваться и сидеть на одном месте это плохо.

альбертио представляет
02.08.2019, 12:27
Мне кажется что это зависит на чем у тебя написан backend. NodeJS будет задыхаться от большого количества клиентов, да она асинхронная, но однопоточная.

Тот же python или lua будут чувствовать себя лучше. Будем идти выше, допустим go чем выше идём тем лучше будет и быстрее то либо иное. Может так же зависит от опыта разработчика, но так же не развиваться и сидеть на одном месте это плохо.


При таком потоке node выдержит нагрузку спокойно.

Я выбрал Lua. Да и сам прекрасно знаю, что быстрее и т.д.

Вы также можете прочитать начало темы - я создал всего лишь аналог чата от NarutoUA, на том же HTTP.

И, скажите, разве скорость работы большая?

альбертио представляет
04.08.2019, 22:24
Подниму, что-ли.

Quasper
19.08.2019, 15:16
Как описал выходит годно, на сурс бы посмотреть) очень уж интересно

альбертио представляет
19.08.2019, 15:27
Как описал выходит годно, на сурс бы посмотреть) очень уж интересно


Пока что, к сожалению, нет возможности выложить, занят крупным заказом. Возможно, недели через 2-3 выложу.

Quasper
19.08.2019, 15:56
Пока что, к сожалению, нет возможности выложить, занят крупным заказом. Возможно, недели через 2-3 выложу.


Ждем-с с нетерпением)

альбертио представляет
27.09.2019, 19:41
Забыл оплатить домен.

Забыл оплатить сервер.

Потерял код.

Ставь лайк если делаешь так же.​