Как написать эффективный счетчик посещений для сайтов - PullRequest
6 голосов
/ 08 октября 2009

Я хочу написать скрипт счетчика посещений, чтобы отслеживать попадания на изображения на веб-сайте и исходные IP-адреса. Показы превышают сотни тысяч в день, поэтому счетчики будут увеличиваться много раз в секунду.

Я ищу простой самодостаточный метод (php, python-скрипты и т. Д.). Я думал об использовании MySQL для отслеживания этого, но я предполагаю, что есть более эффективный способ. Каковы хорошие методы хранения счетчиков?

Ответы [ 9 ]

7 голосов
/ 08 октября 2009

Увлекательный предмет. Увеличивая счетчик, каким бы простым он ни был, просто имеет для транзакции ... это означает, что он может заблокировать всю БД дольше, чем имеет смысл! -) Это может быть узким местом для вся система.

Если вам нужны очень точные подсчеты, но вам не нужно, чтобы они были мгновенно обновлены, мой любимый подход - добавлять счетную информацию в журнал (переключать журналы так часто, как это необходимо для целей обновления данных). Как только журнал закрыт (с тысячами счетных событий в нем), сценарий может прочитать его и обновить все, что нужно в одной транзакции - может быть, не интуитивно, но гораздо быстрее, чем тысячи отдельных блокировок.

Тогда есть чрезвычайно быстрые счетчики, которые статистически точны только *1007*, но, поскольку вы не говорите, что такая неточность приемлема, я не буду объяснять их более подробно.

4 голосов
/ 08 октября 2009

Вы можете взять Журнал доступа вашего веб-сервера (Apache: access.log) и оценить его снова и снова (cronjob), если вам не нужно иметь данные под рукой в ​​точный момент времени когда кто-то посещает ваш сайт.

Обычно access.log создается в любом случае и содержит запрошенный ресурс, а также время, дату и IP-адрес пользователя. Таким образом, вам не нужно направлять весь трафик через php-скрипт. Бережливый, средний счетчик.

2 голосов
/ 08 января 2010

Без сомнения, Redis идеально подходит для этой проблемы. Он требует около минуты для установки и установки, поддерживает атомарные приращения, невероятно быстр, имеет клиентские библиотеки для Python и PHP (и многих других языков), долговечен (снимки, журнал, репликация)

Храните каждый счетчик на свой собственный ключ. Тогда просто

INCR key
2 голосов
/ 08 октября 2009

Есть два действительно простых способа:

  1. Парсинг из ваших веб-журналов в пакетном режиме.
  2. Запустите удары через beanstalkd или gearmand и попросите рабочего делать тяжелые вещи контролируемым образом.

Вариант 1 работает с готовыми инструментами. Вариант 2 требует лишь небольшого количества программирования, но дает вам кое-что ближе к обновлениям в реальном времени, не вызывая перепадов при скачках трафика (например, вы обнаружите в своем прямом случае mysql).

1 голос
/ 08 октября 2009

Если важна точность, вы можете сделать это немного медленнее с MySql ... создать таблицу HEAP / Memory для хранения значений ваших счетчиков. Это таблицы в памяти, которые невероятно быстрые. Вы можете записывать данные в обычную таблицу с интервалами.

Основываясь на идеях движка приложения, вы можете использовать memcache в качестве временного хранилища для своего счетчика. Увеличение счетчика memcache происходит быстрее, чем использование таблиц кучи MySql (я думаю). Раз в пять или десять секунд вы можете прочитать счетчик memcache и записать это число в свою БД.

0 голосов
/ 14 декабря 2009

Я сделал нечто очень похожее, в аналогичном масштабе (несколько серверов, сотни доменов, несколько тысяч обращений в час), и анализ файлов журналов определенно был подходящим. (Он также проверял частоту обращений, взвешивал их по типу файла и помещал в черный список IP-адресов на брандмауэре, если они делали слишком много запросов; его целью было автоматическое блокирование плохих ботов, а не просто счетчик, но подсчет существенная часть этого.)

Не влияет на производительность самого процесса веб-сервера, поскольку он не выполняет никакой дополнительной работы, и вы можете легко публиковать периодически обновляемые счетчики посещений, внедряя их в базу данных сайта каждую минуту / 5 минут / 100 посещений / что угодно без необходимость блокировать соответствующую строку / таблицу / базу данных (в зависимости от используемого механизма блокировки) при каждом попадании.

0 голосов
/ 14 декабря 2009

Вы можете использовать Redis - это очень быстрое хранилище значений ключей с поддержкой атомарных приращений. Если возникнет необходимость - подсчет данных может быть легко распределен между несколькими серверами.

0 голосов
/ 08 октября 2009

Не уверен, что это ваш путь, но AppEngine - довольно хорошая платформа для построения. Пример кода, который вы можете использовать для создания счетчика с использованием своего хранилища данных и транзакций, описан здесь: http://code.google.com/appengine/docs/python/datastore/transactions.html.

0 голосов
/ 08 октября 2009

Ну, если вам случится пойти по пути PHP, вы можете использовать базу данных SQLite , однако MySQL - это вполне разумный способ хранения этой информации, и обычно (по крайней мере из тех, что я видел) как это делается.

Если вы не хотите хранить IP-адрес и любую другую информацию, просто номер в текстовый файл может работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...