2013-10-10 3 views
0

У нас есть загруженный веб-сайт, на котором нужно записывать «хиты» об определенных страницах или конечных точках 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: Мы по-прежнему ударяем базу данных один раз за каждый удар, поскольку каждая задача обрабатывается индивидуально, а не суммирует все хиты.

Или любые другие предложения?

ответ

1

ИЛИ: использовать что-то, предназначенное для записи статистики при высоких уровнях трафика, например StatsD & Graphite. Оригинальная статистика D написана в Javascript поверх NodeJS, которая может быть немного сложной для настройки (но есть более простые способы ее установки, with a Docker container), или вы можете использовать подобный работе (не используя NodeJS), который выполняет такая же функция, как одна written in GoLang.

Я использовал оригинальную палитру StatsD и Graphite, а также сделал красивые графики (это было для 10-ти миллионов событий в день).

+0

Теперь, чтобы проверить это сейчас. :) – Ben

+0

Моя забота об этом заключается в том, что если наш бэкэнд statsd снизился, мы потеряем данные до исправления, и мы не сможем его заметить, используя UDP - любой опыт мониторинга потерянных UDP-пакетов , и т. д. - возможно ли это? – Ben

+0

Существует интерфейс статистики и команд (https://github.com/etsy/statsd/blob/master/docs/admin_interface.md), который вы можете проверить, если он все еще возвращает информацию, так же, как вы будете контролировать любую другую услугу , например, Memcached или Apache. –