PDA

Просмотр полной версии : [Вопрос] Сохранение



StevenH
29.02.2016, 00:02
Когда и как лучше сохранять данные?
1. При дисконекте
2. Как только переменная изменится. Т.е. апнул лвл, сохранил в БД и так далее

$continue$
29.02.2016, 00:08
При изменениях значений переменной + при выходе с сервера.

vovandolg
29.02.2016, 00:14
Но и такое бывает что несколько игроков меняют переменные часто,
если представить что человек так 100 будут теребонькать бедную БДшку то она залагает, а то и ляжет от усталости...
Так что я бы советовал припаять ограничение соединений по времени при обращении игроков к БД, чтоб не дудосили.

StevenH
29.02.2016, 00:16
Но и такое бывает что несколько игроков меняют переменные часто,
если представить что человек так 100 будут теребонькать бедную БДшку то она залагает, а то и ляжет от усталости...
Так что я бы советовал ограничение во времени припаять при обращении клиентов к БД, чтоб не дудосили.

Ну вот интересно стало. Завтра зайду на адванс и посмотрю с помощью ЛК не оффаясь, как изменяются значения...

$continue$
29.02.2016, 00:33
Но и такое бывает что несколько игроков меняют переменные часто,
если представить что человек так 100 будут теребонькать бедную БДшку то она залагает, а то и ляжет от усталости...
Так что я бы советовал припаять ограничение соединений по времени при обращении игроков к БД, чтоб не дудосили.

BlueG в своем плагине использует thread (https://ru.wikipedia.org/wiki/Boost#.D0.9C.D0.BD.D0.BE.D0.B3.D0.BE.D0.BF.D0.BE.D1.82.D0.BE.D1.87.D0.BD.D0.BE.D1.81.D1.82.D1.8C), вряд ли что то залагает.



А теперь представим, что я доначу на сервер 10000 рублей и в это время сервер заддосили, а сохранения стояло только при дисконнкте = откату сервера. (До предыдущих сохранении) + мой деньги ушли создателю. Истории транзакции у меня нет, доказать не чем, что я пожертвовал серверу 10000 рублей. Ваши действия?

P.S: Я знаю, что донат надо сохранять сразу при изменений, но видь это может произойти и с другими переменными?

StevenH
29.02.2016, 00:49
BlueG в своем плагине использует thread (https://ru.wikipedia.org/wiki/Boost#.D0.9C.D0.BD.D0.BE.D0.B3.D0.BE.D0.BF.D0.BE.D1.82.D0.BE.D1.87.D0.BD.D0.BE.D1.81.D1.82.D1.8C), вряд ли что то залагает.



А теперь представим, что я доначу на сервер 10000 рублей и в это время сервер заддосили, а сохранения стояло только при дисконнкте = откату сервера. (До предыдущих сохранении) + мой деньги ушли создателю. Истории транзакции у меня нет, доказать не чем, что я пожертвовал серверу 10000 рублей. Ваши действия?

P.S: Я знаю, что донат надо сохранять сразу при изменений, но видь это может произойти и с другими переменными?

Хороший пример). Кстати проверил Даймонд.
Зарегался (было 150$) сел в автобус, стало 130. И не оффаясь чекнул лк, там тоже 130. Значит сохранение у них сразу прошло..

На адвансе точно так же.

Понял, спасибо)

vovandolg
29.02.2016, 01:03
Хороший пример). Кстати проверил Даймонд.
Зарегался (было 150$) сел в автобус, стало 130. И не оффаясь чекнул лк, там тоже 130. Значит сохранение у них сразу прошло..

На адвансе точно так же.


Откуда ты узнал что произошло сохранение?
Показ того что держится в переменной не факт что сохранилось..

DeimoS
29.02.2016, 01:04
Откуда ты узнал что произошло сохранение?
Показ того что держится в переменной не факт что сохранилось..

У них, как я понимаю, имеется синхронизация MySQL с Личным Кабинетом на сайте (иначе что может значит "ЛК"?). Вот через него он и посмотрел.


Как уже сказали ранее, главное сделать различные временные ограничения, дабы сервер в итоге на заддосили, например, передачей по одному доллару с помощью бинда команды на кнопку (думаю, если человек 10 начнут так флудить, сервера надолго не хватит).

$continue$
29.02.2016, 01:12
У них, как я понимаю, имеется синхронизация MySQL с Личным Кабинетом на сайте (иначе что может значит "ЛК"?). Вот через него он и посмотрел.


Как уже сказали ранее, главное сделать различные временные ограничения, дабы сервер в итоге на заддосили, например, передачей по одному доллару с помощью бинда команды на кнопку (думаю, если человек 10 начнут так флудить, сервера надолго не хватит).

Плагин работает в отдельном потоке, что может случится с сервером?
Конечно, если не использовать "говно мамонта" (с кешированием запросов)

DeimoS
29.02.2016, 01:26
Плагин работает в отдельном потоке, что может случится с сервером?

Например то, что кол-во потоков в плагине ограничено и большое число запросов всё равно добьёт сервер?
Вот, например
http://i.imgur.com/MZuTiDY.png
И даже если представить, что формирование ответа у MySQL занимает половину всего времени (меньше половины секунды), при подобном "ддосе" могут начаться лаги как минимум из-за того, что игрок будет флудить командой и сервер будет обращаться к плагину.

Хотя право твоё. Но я всё же не стал бы издеваться над БД

StevenH
29.02.2016, 01:40
Откуда ты узнал что произошло сохранение?
Показ того что держится в переменной не факт что сохранилось..

Выше написали верно. Я зарегистрировал аккаунт, было 150$, потратил их, стало 130 и сразу пошёл в Личный Кабинет, и там тоже 130. А данные в ЛК берутся то из базы..

- - - Добавлено - - -


У них, как я понимаю, имеется синхронизация MySQL с Личным Кабинетом на сайте (иначе что может значит "ЛК"?). Вот через него он и посмотрел.


Как уже сказали ранее, главное сделать различные временные ограничения, дабы сервер в итоге на заддосили, например, передачей по одному доллару с помощью бинда команды на кнопку (думаю, если человек 10 начнут так флудить, сервера надолго не хватит).

Что значит временные ограничения? Что то типа анти флуда в игре на 1-2 секунды?

Alex_Lenez
29.02.2016, 04:52
Только при дисконекте...

vovandolg
29.02.2016, 05:04
Что значит временные ограничения? Что то типа анти флуда в игре на 1-2 секунды?

Да я бы так сказал на секунд 5 даже можно,
в зависимости от онлайна + можно там пинг привязать,
но у вас же не даймонд эрпи поэтому заморочек цеплять не стоит(~3-5 сек)

DeimoS
29.02.2016, 06:07
Что значит временные ограничения? Что то типа анти флуда в игре на 1-2 секунды?

Ну да. В команды, которые напрямую обновляют данные аккаунта (та же передача денег) добавить что-то типа

if(gettime() < command_flood[playerid]) return SendClientMessage(playerid, -1, "Подождите 3 секунды");
//Код команды
command_flood[playerid] = gettime()+3;
return 1;
И всё. Только это самый банальный пример

StevenH
29.02.2016, 16:05
Ну да. В команды, которые напрямую обновляют данные аккаунта (та же передача денег) добавить что-то типа

if(gettime() < command_flood[playerid]) return SendClientMessage(playerid, -1, "Подождите 3 секунды");
//Код команды
command_flood[playerid] = gettime()+3;
return 1;
И всё. Только это самый банальный пример

Спасибо. Буду ставить анти флуд, + все переводить на сохранение сразу же.

DeimoS
02.03.2016, 10:37
Например то, что кол-во потоков в плагине ограничено и большое число запросов всё равно добьёт сервер?
Вот, например
http://i.imgur.com/MZuTiDY.png
И даже если представить, что формирование ответа у MySQL занимает половину всего времени (меньше половины секунды), при подобном "ддосе" могут начаться лаги как минимум из-за того, что игрок будет флудить командой и сервер будет обращаться к плагину.

Хотя право твоё. Но я всё же не стал бы издеваться над БД

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

У меня нет идей как реализовать тест, который бы правильно отображал ситуацию, в которой, например, 10 игроков одновременно флудят командой для передачи денег с помощью биндера кнопок. Но уязвимое место - это совсем не БД, а именно сервер, который может залагать чисто из-за того, что его заставляют постоянно обращаться в mysql_query. Но может и проблем не будет никаких, во что мне не особо верится.

P.S. Как я уже многим и говорил: будьте скептиками :) Вот простой вариант того, как кто-то легко может ввести вас в заблуждение. Если бы я не вспомнил про эту тему, многие так бы и восприняли этот тест как какую-то истину и жили бы с ложными знаниями =) Скептицизма много не бывает

StevenH
03.03.2016, 00:39
Эхх раз continue решил не отвечать (не знаю, поверил ли он мне или просто забил), то всё же скажу, что этот тест - это лишь вброс для continue. Тест неверен, ибо тут отображено время от первого запроса и до текущего (то время, что прошло с начала цикла и до текущего момента, если быть точным), а не время обработки одного единственного запроса.

У меня нет идей как реализовать тест, который бы правильно отображал ситуацию, в которой, например, 10 игроков одновременно флудят командой для передачи денег с помощью биндера кнопок. Но уязвимое место - это совсем не БД, а именно сервер, который может залагать чисто из-за того, что его заставляют постоянно обращаться в mysql_query. Но может и проблем не будет никаких, во что мне не особо верится.

P.S. Как я уже многим и говорил: будьте скептиками :) Вот простой вариант того, как кто-то легко может ввести вас в заблуждение. Если бы я не вспомнил про эту тему, многие так бы и восприняли этот тест как какую-то истину и жили бы с ложными знаниями =) Скептицизма много не бывает

Ну а как тогда на адвансе??? Я точно проверил, что сохранение у них проходит сразу... Но лугов у них нету

vovandolg
03.03.2016, 02:40
Ну а как тогда на адвансе??? Я точно проверил, что сохранение у них проходит сразу... Но лугов у них нету

VDS сверх хороший наверное:smoke: