У нас есть загруженный веб-сайт, на котором нужно записывать «хиты» об определенных страницах или конечных точках API, которые посещаются, чтобы помочь заполнить статистику, сетки популярности и т. Д. Попадания в журнал не просто страниц, поэтому не удается использовать синтаксический анализ журнала.Memcache или Queue for Hits Logging
В прошлом мы только что вошли в базу данных с запросом на обновление, но при сильном параллелизме это создает нагрузку базы данных, которую мы не хотим.
В настоящее время мы используем Memcache, но испытываем некоторые проблемы, при этом статистика не является достаточно точной из-за неатомных обновлений.
Так что мой вопрос:
Если мы будем продолжать использовать Memcache, но улучшить атомные приращений:
1) Когда страница хит, создать кэша памяти ключа, такие как «Статистика: PageId: 3» и регистрирует это каждый раз, когда мы попали атомарно
2) Написать пакетный скрипт, чтобы перебрать все MemCache ключей и создать пакетное обновление в базу данных каждые 10 минут
ПРОФИ: Меньше да tabase hits, так как мы обновляемся только один раз за страницу за 10 минут (с каким-то количеством попаданий за этот 10-минутный период)
CONS: Мы можем атомарно увеличивать индивидуальные счетчики, но все равно нужен ключ memcache для хранения pageid имели хиты, прокручивались и регистрировались. Это не будет атомарным, поэтому, когда мы очищаем данные до БД и перезагружаем все, в этом ключе все может зависеть. Мы могли потерять до 10 минут данных.
ИЛИ Используйте систему очереди/задачи:
1) Когда страница попала, добавить задание в очередь заданий очереди 2) Задача может затем быть скорость ограничена и в фоновом процессе этих «хитов 'в базу данных.
PROS: Простой код, мы можем масштабировать рабочих очереди, если это необходимо.
CONS: Мы по-прежнему ударяем базу данных один раз за каждый удар, поскольку каждая задача обрабатывается индивидуально, а не суммирует все хиты.
Или любые другие предложения?
Теперь, чтобы проверить это сейчас. :) – Ben
Моя забота об этом заключается в том, что если наш бэкэнд statsd снизился, мы потеряем данные до исправления, и мы не сможем его заметить, используя UDP - любой опыт мониторинга потерянных UDP-пакетов , и т. д. - возможно ли это? – Ben
Существует интерфейс статистики и команд (https://github.com/etsy/statsd/blob/master/docs/admin_interface.md), который вы можете проверить, если он все еще возвращает информацию, так же, как вы будете контролировать любую другую услугу , например, Memcached или Apache. –