[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ежесекундное обращения к MySQL
walerus
Приветствую вас земляне Гуру.

Появилась у меня задача, обновлять статистику в режиме "онлаин", т.е. простой пример:

Есть страница, на ней высвечивается некая сумма, которая рассчитывается сложением чисел из нескольких таблиц.

Так вот вопрос в том, как правильно и "безболезненно" для MySQL это сделать ?

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

Подскажите пожалуйста - куда копать/читать/смотреть
Спасибо за ранее rolleyes.gif
Valick
https://habrahabr.ru/post/104945/
comet технологии и еже аля с ними, вобщем надо, что бы не клиент инициировал соединение, а сервер

_____________
Стимулятор ~yoomoney - 41001303250491
walerus
Valick
Спасибо, буду изучать smile.gif
FatCat
Цитата (Valick @ 30.03.2018 - 19:31)
что бы не клиент инициировал соединение, а сервер

Я такие вещи предпочитаю делать на тасках. Потому как серверные технологии будут молотить и при нуле посетителей, то есть вхолостую.
Например, кеш главной страницы со статистикой, новостями и т.д. ресурсоемкий, и я его обновляю раз в 15 минут… если будет посетитель. Всё просто. Кеш в файле, имя файла содержит его время создания. Скрипт сверяет с текущим временем, и если разница больше 15 минут, делается перекеширование. А пока нет посетителей на главной странице, никакие ресурсы не расходуются.

_____________
Бесплатному сыру в дырки не заглядывают...
walerus
FatCat
Да я так примерно и делал в иных случаях... типа "чат на коленке писанный" и обычная статистика сайта. Но тут попросили рассмотреть такую ситуацию, что пользователь сидит на странице и фапает на циферки, вот что бы они изменялись сразу как только произошли изменения, а не раз в n минут... "их богатых не поймешь" biggrin.gif

Вроде отговорил от этой идеи, потому как сервер настраивать под комиты, никто не хочет cool.gif
inpost
Сколько прошло от часа Х:
можно каждую секунду прибавлять к интервалу +1 секунда, что может показаться на первый взгляд адекватным, но что если скрипт 1 секунду не выполнится, то значит у тебя уже сдвиг по времени пойдет. Так же чрезмерная нагрузка на систему.
А вот если ты напишешь короткий код: время сейчас - время начала, то ты получишь этот интервал в момент, когда тебе нужен будет этот самый интервал! Именно по такому алгоритму высчитываются во всех играх! Никто не считает, что код выполнится ровно 60fps, fps всегда разный, именно чтобы определить предмет на экране делают разницу его движения и узнают где он сейчас должен находиться в данный отрезок времени в момент отрисовки определённого FPS кадра. То есть если у тебя в игре будет 5fps, на все 5 fps у тебя ровненько всё посчитают.

Подобная психология программирования появилась не сразу, ранние игры жестко привязывались к тику процессора, из-за чего в современных ПК шло огромное ускорение игры. Современные игры же считаются на разнице времени.

Надеюсь понятно объяснил даже с примерами wink.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
walerus
inpost Вариант конечно интересный, не знал об этом вообще.

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

Так вот вопрос, как сделать так, что бы эта сумма обновлялась автоматически, а не после "обновления страницы", при новом пополнении баланса любым из активных пользователей...
inpost
walerus
она не должна нигде храниться. Она должна высчитываться из разницы времени.
10 долларов в минуту.
Прошло 35 минут, когда человек решил увидеть свой баланс, значит ты делаешь 35*10 = твой баланс. Он обновляет страницу через 1 минуту и видит: 36*10.
При этом стоп-моменты оставляй после оплаты. Допустим он оплатил и у него осталось 33 доллара на 10-ой минуте. Значит на 35 минуте: 33 доллара + (35 минут - 10 минут)*10 долларов в минуту. 33+ 25*10 = 33 * 250 = 283 доллара у человека после 35 минут времени.
В итоге ты не пересчитываешь каждую секунду кошелёк КАЖДОГО человека, а лишь выводишь в момент, когда он хочет его увидеть. Если человек не выполняет действия и находится на одной странице, то баланс обновляться вешаешь на JS, то есть он ждёт одну минуту с 36 по 37 и у него браузер сам переключает 283+10 = 293.
Теперь, когда он один раз в 10 минут обновит - 33 + (46 - 10)*10 = 393.

Таким образом ты получишь очень низкую нагрузку на сервер и на вычисления. Теперь, если он на 46 минуте делает покупку какого-то предмета за 200 долларов, то ты меняешь отметку времени с 10-ой минуты на 46-ую минуту и фиксируешь, что на 46-ую минуту у него осталось 193 доллара. И далее по той же схеме: 193 + (53 - 46)*10 (если обновление на конец 53-ей минуты). Точку баланса (деньги+отрезок) делаем для того, чтобы в формуле не высчитывать каждый раз все покупки, а иметь финальный баланс после последней покупки на момент этой самой покупки и относительно него вычисляешь.

В базе у тебя 1 миллион пользователей. Каждую секунду ты хотел обновлять 1 миллион записей, 1 миллион запросов.
А я говорю, что в базе хоть у тебя и 1 миллион пользователей, но сейчас в сети 1 тысяча, и в минуту лишь 100 человек из них обновляют страницу, значит вместо 60 миллионов запросов у тебя всего 100 запросов + 100 маленьких простых вычислений!

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
walerus
какое количество юзеров будет одновременно наблюдать статистику? Как часто эти данные меняются?
Если одновременных юзеров не очень много, можно обойтись простым поллингом. Чтобы не нагружать БД постоянными запросами, на CRUD операциях с этими таблицами можно сразу подсчитывать текущее значение и записывать в файл, в этом случае аякс не только не будет дёргать БД, но и вообще PHP участвовать не будет, nginx просто будет отплёвываться статикой smile.gif
walerus
inpost Я наверно не корректно изложил суть задачи dry.gif

killer8080
Количество пользователей одновременно наблюдающих, допустим ~ 30 чел, а может и больше (кто их знает будут они смотреть или нет), проблема (для меня) не в этом.

допустим они(пользователи), не уходят со страницы, а наблюдают.

данные обновляются:
в 10:00:00 кто то пополнил баланс, он равен === 100 гульденов.

всем этим пользователям показывается => 100

в 10.01:20 кто то пополнил баланс на 17 гульденов, теперь он равен === 117 гульденов.

вот нужно что бы именно в 10.01:20 - 10.01:21, у всех смотрящих показывалось 117

в 10.01:25 кто то пополнил баланс на 34 гульденов, теперь он равен === 151 гульденов.

вот нужно что бы именно в 10.01:25 - 10.01:26, у всех смотрящих показывалось 151

и так далее. rolleyes.gif
inpost
walerus
Вот теперь видно, что ты хотел совсем другое. Тебе не надо каждую секунду слать запрос, тебе надо открыть соединение, а далее ждать, пока сервер отправит изменения. Обычная работа соккетов. node.js + socket.io справляются с этим на ура, на нём даже реал.тайм игры браузные пилят, данные отправляются всем слушателям только тогда, когда новые данные появились.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
walerus
inpost
Понял, рассмотрю данный совет, спасибо rolleyes.gif
Valick
Цитата (walerus @ 5.04.2018 - 20:57)
Понял, рассмотрю данный совет, спасибо

я тебе об этом еще в первом сообщении написал ("еже аля с ними" там не для красного словца), неужели не возникает желания погуглить? smile.gif

_____________
Стимулятор ~yoomoney - 41001303250491
walerus
Valick
Я погуглил в яндексе, перед тем как создавал тему, чего ты? wink.gif

Твои ссылки все просмотрел, но про "аля с ними" не допер... писал же - не сталкивался с таким, по этому и не "дошел" до "node.js + socket.io", просто не знал "что искать".

А по первым ссылкам, никто(не я) не хотели настраивать сервер cool.gif

Не ругайси biggrin.gif
killer8080
walerus
ну если актуальность так критична, то конечно только сокеты smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.