Как в 2017 году принято делать счетчик показов?

Есть js виджет, который будет ставиться на сторонние сайты. Надо посчитать количество показов виджета. Нагрузка скорее всего будет большая. Придумались варианты:
  1. Шлем запрос на api, там скрипт делает INSERT в базу - инсерт в базу скорее всего будет медленный, нафиг.
  2. Шлем запрос на api, там простой скрипт делает append в файл. По крону считаем что там записалось - выглядит уже лучше.
  3. Шлем запрос на api, который ничего не делает. Потом грепаем логи по крону.

Какие есть еще варианты? Какой выбрать?
  • Вопрос задан
  • 263 просмотра
Решения вопроса 1
Wolfnsex
@Wolfnsex Куратор тега Веб-разработка
Если не хочешь быть первым - не вставай в очередь!
Какие есть еще варианты? Какой выбрать?
Ещё есть варианты, типа Redis/Memcached, таблицы в памяти, вариант отключить синхронизацию с файловой системой в БД, использовать MongoDb или другую базу подобного плана и т.д., есть специальный тип таблиц, например, ARCHIVE в MySQL оптимизированные специально на запись... Масса вариантов, в общей сложности.

Шлем запрос на api, который ничего не делает. Потом грепаем логи по крону.
Не уверен, что это быстрее чем база данных.

Шлем запрос на api, там скрипт делает INSERT в базу - инсерт в базу скорее всего будет медленный, нафиг.
Если Вам нужен счётчик, это будет не "INSERT" а скорее "UPSERT" ("INSERT or UPDATE"), а ещё лучше сразу UPDATE (т.е. заводить запись с текущей циферкой счётчика до того, как будет пытаться её UPDATE'ить).

Шлем запрос на api, там простой скрипт делает append в файл. По крону считаем что там записалось - выглядит уже лучше.
А как на счёт конкурентного доступа к файлу?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@karminski
Senior React.JS Developer
1. Пишем все запросы в redis или что-то похожее
2. Раз в минуту/час/день снимаем счетчик из редиски и пишем его уже куда душе угодно (БД MySQL, файл)
Ответ написан
Комментировать
dima9595
@dima9595
Junior PHP
Можно попробовать отправлять через api в кэш, а потом же по крону отправлять insert запрос.
Ответ написан
berezuev
@berezuev
#define TRUE FALSE
Redis, и только он.

Если есть множество уникальных ID'шников, то поможет связка Redis и HyperLogLog
Подробнее читать здесь
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы