@heavig2

Как сохранять клики и их время в кликере?

Всем привет.
Разработал для нашей компании кликер в телеграмме на php + javascript. Изначально, каждый клик сохранял в БД (mysql) и на каждый клик было 3 запроса:
1. Проверка количества кликов за последние 4 часа (было ограничение)
2. Увеличение количества очков на + 1
3. Сохранение времени клика в отдельную таблицу

На тестах все работало хорошо. При увеличении нагрузки (~ 100 + людей), БД стала не успевать и вместо условных 100 кликов людям засчитывало ~40.

После этого переделал скрипт и стал сохранять количество очков в localStorage, а время кликов в cookie. Но понимаю, что это не оптимальный вариант - люди могут заходить с двух устройств (телефон и пк). Как вариант, забирать количество кликов и их время раз в 3-5 секунд, но что делать с теми, кто быстро прокликал и вышел?
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 1
@rPman
вместо условных 100 кликов людям засчитывало ~40
судя по sql у тебя количество сохраняемых кликов считается как сначала запросом получить текущее значение, затем сохранить его увеличенным... что естественно неправильно обсчитывается, если одновременно на бакэнд идут несколько запросов, и завершаются в разном порядке (т.е. первый, получил значение 1, затем его обогнал второй, получил то же значение 1, оба отправляют +1 значение, т.е. 2, вместо ожидаемого 3.

Правильно: одним обновлением в базе нужно - проверять допустимость клика (проверить время последнего клика), обновить время последнего клика и увеличить количество кликов на 1... после чего бакэнд проверяет, сколько записей было обновлено, если 0 - значить выход за лимиты, если 1 - все ок.
update set clicks=clicks+1, last_click_time=now() where last_click_time+:ALLOWED_CLICK_INTERVAL<now() and id=:current_id


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

Можно больше, но тогда понадобится разнести таблицу аналитики и таблицу событий, в таблицу событий записывают события, но она без индексов, а в аналитику зааливать данные из всех собранных событий, в цикле
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
24 нояб. 2024, в 01:35
5000 руб./за проект
24 нояб. 2024, в 01:24
500 руб./за проект
24 нояб. 2024, в 00:04
5000 руб./за проект