Мысли о хорошем и глобальном (система учёта игроков GoldSrc)

Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
fantom, ты же понимаешь, что использовать прослойку в виде PHP, нужно быть уверенным в том, что WEB часть не умрет в неподходящий момент? имея частые проблемы с коннектом с большинством провайдеров(периодические дропы пакетов. на сайтах не сказывается почти, а вот в потоке с GET данными - критично) в Рашке эта идея обречена на провал. ни один хостер не позволит себе разместить web морду, базу и сервера на одном тазике, дабы избежать проблем, описанных выше...
BoecSpecOPs, генерировать запросы в условиях AMXX - самая легкорешаемая из всех проблем в данной идее
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
что WEB часть не умрет в неподходящий момент
Прекрасно понимаю. Есть fallback для таких вещей. Но как я и говорил шансы что упадет база или веб практически равны. Чтобы система была полностью отказоустойчива, то одним тазиком и php не обойтись никак. Да и пакетов там не будет туча аж прям.
периодические дропы пакетов
Думал о таком кейсе не единажди. Как говорил есть решение. Все равно нужны будут тесты на реальных серваках. А там увидим провал или нет. Кто не пробует тот не знает наверняка. Согласись. Пока что основная аудитория это те кто умеет настроить грамотно и установить себе. Кто не желает пусть продолжает использовать GameCMS, CS:Bans или GreyPanel.
 
Сообщения
62
Реакции
129
Помог
4 раз(а)
- Нет динамических строк/массивов. Модули, реализующие динамические массивы нам в этом не помощники - павн не умеет с ними работать. Вышел за границы буфера при построении запроса? Сасай кудасай. А ещё будь добр - обработай ошибку при обращении к базе данных
Неправда про массивы, есть Trie и Array: https://amx-x.ru/viewtopic.php?f=9&t=2764

- Нет Query builder для быстрого и безопасного построения запросов. Для каждого запроса нужно писать новый метод, зачастую дублируя код. Сиди теперь и ломай голову как красиво и без особых усилий расставить запятые при динамическом количестве параметров в запросе к таблице бд. И не забудь защитить запрос от sql-инъекции. В каждом строковом параметре запроса.
Да, в этом есть неудобство, но есть и простое решение: все параметры запихнуть в выше упомянутый Array и поставить запятую перед индексом != 0
Код:
new temp[64], query[1024];
formatex(temp, charsmax(temp), "`ip`='%s'", ip);
ArrayPushString(array, temp);

if(is_user_steam) {
    formatex(temp, charsmax(temp), "`steam`='%s'", escape_steam);
    ArrayPushString(array, temp);
}

//...

new len = ArraySize(array);
formatex(qeuery, charsmax(query), "SELECT * FROM `%sbans` WHERE ", prefix_table);
for(new i; i < len; i++) {
    if(i != 0) {
        add(query, charsmax(query), ", ");
    }
    ArrayGetString(array, i, temp, charsmax(temp));
    add(query, charsmax(query), temp);
}
- Ты додумался использовать асинхронный запрос? Тогда делай для каждого запроса свой callback. И не забывай обрабатывать ошибки от БД.
Зачем? Можно использовать 1 функцию, т.к. в callback можно передать аргументы, пример как раз в моем плагине web chat (он конечно не идеален, но все же)
 
Сообщения
62
Реакции
129
Помог
4 раз(а)
Я частично согласен со всем вами сказаном. НО ИМХО удобство и машатбированость важнее.
Кстати, работать с json, или куда хуже с xml в павне очень не удобно)
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
BaHeK, речь не про массивы типа Array и Trie
речь про new array[] = "очень_много_всего_тут"

потому что большой запрос, составленный кодом выше, будет никак не 1024, не 2048 и тд... там могут быть десятки байт информации
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Думаю дискусировать можна вечно. Как всегда у каждого подхода есть свои плюсы и минусы. Мы выбрали то, что нам кажется лучше. Если проект закончим, и тесты пройдут успешно, то мы обьязательно дадим знать о результатах. Тогда ради интереса у вас появится возможность прикрутить запросы к базе напрямую чтобы проверить свои высказывания. так наверно будет лучше всего
 
Сообщения
198
Реакции
273
Помог
5 раз(а)
BaHeK, в первом случае - мы встречаемся с ограничением буфера (из вашего же примера - 1024 символа). Я специально сделал акцент на то, что модули вида Array и Trie нам не помогут - AMXX не умеет работать с ними напрямую.

Во втором случае - да, но помимо уже упомянутой проблемы возникает вопрос качественного экранирования строк.

В третьем случае - частично согласен, но иногда может возникнуть гемор, когда в метод уже передаётся какой-то массив, размерности какого-то enum.
 
Последнее редактирование:
Сообщения
207
Реакции
420
Помог
10 раз(а)
И не забудь защитить запрос от sql-инъекции. В каждом строковом параметре запроса.
Уже пилится SPМод у которого больше возможностей, но он ещё сырой.
Не забудьте тогда новую фичу из SM перенести, а именно SQL_FormatQuery(). Она сама экранизирует все входящие данные.
Очень и очень удобно.
19 Сен 2018
использовать прослойку в виде PHP, нужно быть уверенным в том, что WEB часть не умрет в неподходящий момент
База тоже может умереть не в подходящий момент, но об этом почему-то никто не думает.
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
207
Реакции
420
Помог
10 раз(а)
neygomon, зависит от хоста. У той же Арены и пых, и база часто валяются. Первый тупо таймаут долбит, второй вообще рефьюзит соединения.
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
CrazyHackGUT, "уникальные" хосты не берем во внимание)
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Подумал тут об игровой статистике. Существуют разные способы
1. Стандартный CSX с записями в бинарный файл. Минусы в разрастании количества данных, и отображением на веб части. Можно конешно кроном раз в сутку подтягивать и синхронихировать. Но мне как то не очень нравится такой подход
2. Как делаю HLStats и психостатс. По сути они RCON-ом исполняют команду logaddress_add и слушают UDP в оторый прилетают все логы. Минусы для меня то парсинг строк. Очень не дешевая операция. Ну и еще шанс что коннект отвалится, или например какие то логы потерялись по пути к демону (UDP не гарантирует доставку). Хотя вроде как пользователи не жалуються. Плюсы в том, что все данные всегда в реальном времени
3. Запросы к БД через плагин. Что то среднее между первими двумя способами, Пример статистики от serfreeman1337, неугомон, скальпель. Минусы: данные поступают с опозданием, сложно организировать получение TOP15 (на любую команду отсылать запрос такое себе занятие), на дешевих хостингах легко упереться в лимит одновременных коннектов к базе.
Стоит отметить что отображение статистики в реальном времени по больщому счету мало кому нужно. По моим наблюдениям большинство игроков вообше не вкурсе о существовании веб версии. Еще половина вообше не смотрят на статистику. Им достаточно позиции в топе которая выводиться в чате в начале раунда на многих серверах. И еще какая то часть интересуется скилом который выводится в информере AES (или альтернативы). Но все же мы стремимся к лучшему.
Потому в идеале если была бы возможность запускать демоны, то ИМХО лучше всего держать сокет соединение с демоном и в реальном времени обмениваться информацией. А также вместо mysql выбрать какую нибуть NoSQL которая имеет минимальные задержкы при вставке (MongoDB как пример). И конешно при потери соединения с демоном делать временную запись в файлик, данные из которого потом можна отправить при успешном поторном коннекте. И разумеется протокол желательно TCP чтобы гарантировать успешную доставку.
 
Сообщения
957
Реакции
1,185
Помог
52 раз(а)
И разумеется протокол желательно TCP чтобы гарантировать успешную доставку
TCP подразумевает ожидание ответа, в рамках нынешнего кода АМХ это не подходит, т.к. появляются фризы, вот если бы отдельным потоком...
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Sonyx, можна использовать неблокируемый сокет. Главное не накапливать много данных в буффере. И тут уэе нужно хорощое латенси сети. Имхо если будет на одной тачке, то мы не увидим проблем.
 
Сообщения
1,106
Реакции
319
Вы это на AMXX хотите написать? Может для таких целей лучше в C++ все сделать. В памяти хранить все данные(кэш), периодически отправлять их в БД. А что бы мусора не было ввести регистрацию пользователей через сайт или консоль с подверждением EMAIL'а, а "гостей" оставить без привелегий: никакой статистики и т.п.
 
Сообщения
1,106
Реакции
319
Я в Amxx не разбираюсь, это точно в оперативке хранит данные а не на диске?


Все равно я не представляю как это можно через AMXX сделать, вряд ли код получится такой же производительный, да и в C++ никаких ограничений и писать код одно удовольствие по сравнению с AMXX....
 

d3m37r4

111111
Сообщения
1,426
Реакции
1,167
Помог
10 раз(а)
Я в Amxx не разбираюсь, это точно в оперативке хранит данные а не на диске?
Прочти описание модуля)
вряд ли код получится такой же производительный
С таким подходом мы ресетксор будем на мете писать.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу