Подтвердить что ты не робот

Non-Stop cronjob

У меня появилось новое требование от бизнеса о данных/статистике реального времени. Они хотят показать, как наша система работает в режиме реального времени.

Я не уверен, как это сделать, но вот мои мысли:

Я не думаю, что можно получать данные каждые секунды, потому что cronjob запускается, по крайней мере, каждую минуту. Поэтому, не сказав им, я сказал ДА, что это возможно.

Теперь моя проблема заключается в том, как я могу запустить cronjob, который получает статистику на наших сайтах (продажи, показы, cpc и т.д.)?

Пример:

От 9h01 AM до 9h02 AM у меня есть:

  • 41 просмотров продукта 1
  • 1 заказ
  • 8 обратный клик от клиентов
  • 2 добавлено в список пожеланий

От 9h02 AM до 9h03 AM у меня есть:

  • 57 просмотров продукта 1
  • 0 порядок
  • 13 реферальных кликов от клиентов
  • 0 добавлено в список пожеланий

Итого:

  • 98 просмотров продукта 1
  • 1 заказ
  • 21 реферальный клик от клиентов
  • 2 добавлено в список пожеланий

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

Спасибо

Изменить: Компания имеет 200 сотрудников в трех разных штатах, которые состоят из продаж, бизнес-аналитиков, технических, бухгалтерских и исполнительных сотрудников, и эти люди могут читать эти отчеты.

В прошлом году мы наняли 20 сотрудников, чтобы они немного выросли. Для данных трафика трудно точно определить, сколько данных мы получаем за минуты. Оценка составляет от 2,5 до 10 тыс. В минуту.

Мы только что заказали 3 PowerEdge R510 (Intel® Xeon® E5503, 2.0Ghz, 4M Cache, 12GB Memory (3x4GB), 1333MHz Dual Rank, 4 x 300GB 15K RPM Serial-Attach SCSI 6Gbps RAID 5).

4b9b3361

Ответ 1

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

Теперь, поскольку у вас есть много людей, которые могут запрашивать данные отчетов, основная идея состоит в том, чтобы как можно быстрее извлекать данные, чтобы убедиться, что вы не блокируете записи (особенно, если вы используете таблицы myisam - блокировку таблицы против innodb, которая имеет блокировку на уровне строк).

Используйте свой индекс (уникальный, если вам нужно) с умом и храните свои данные максимально эффективно, используя метку времени.

То, что вы также можете сделать, - это обобщить ваши данные, которые упростят ваши запросы. Хотя, это не обычная практика в базах данных, поскольку она не соответствует нормальным формам. Вы можете получить отличную производительность, но это боль для поддержания.

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

Теперь, когда вы суммируете свои данные, убедитесь, что вы оптимизировали свои запросы, и вы также можете проверить, что будет выводить explain, а затем сделать решение.


РЕДАКТИРОВАТЬ: Подведение итогов (что не соответствует нормализации базы данных) даст вам отличную производительность, так как вы только запрашиваете записи без использования агрегатных функций и объединяете таблицы с минимальным предложением where.

Пример:

98 views on product 1
1 order
21 referral click from clients
2 added to wishlist

может быть:

SELECT
 views, orders, referral, whishlist
FROM
 summarize_stats_20111201 /* daily table for example */
WHERE
 `time` between 1322791200 /*2011-12-01 21:00:00*/ AND 1322791260 /*2011-12-01 21:01:00*/;

views имеет общее количество просмотров, в этом примере 98

orders имеет общее количество заказов, в этом примере 1

referral имеет общую сумму обращения, в этом примере 21

wishlist имеет общее количество списка желаний, в этом примере 2

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


ИЗМЕНИТЬ 2: Здесь приведен пример сохранения этого решения:

У вас есть cronjob, который поддерживает таблицы. Его задача - создать таблицу на следующий день или что вам нужно.

// in php
$date = date('Ymd', strtotime('+1 day')); // for daily table 
$sql = 'CREATE TABLE IF NOT EXISTS the_database.summarize_stats_" . $date . ";

Итак, когда вы вставляете, убедитесь, что у вас есть правильное имя таблицы, и вы используете ВКЛЮЧЕН КЛЮЧ DUPLICATE

// in php
$sql = 'INSERT INTO TABLE summarize_stats_20111201 SET /* all the fields you need */ ON DUPLICATE KEY views = views + 1;

например, если вы хотите увеличить представление

Я также забыл, что если вам нужно запросить 1 неделю данных, вам нужно будет создать таблицу merge. Таким образом вы можете сделать что-то вроде:

SELECT
 views, orders, referral, whishlist
FROM
 summarize_stats_2011 /* yearly merge table for example */
WHERE
 `time` between 1322272800 /*2011-11-25 21:00:00*/ AND 1322791260 /*2011-12-01 21:01:00*/;

Таким образом, вам не нужно UNION ALL тон запросов.

Ответ 3

Gino, вы можете сделать что-то вроде cronjobs, если у вас есть доступ к вашему php.ini на сервере. Если вы можете установить значение max_execution_time равным нулю, вы можете создавать свои собственные cronjob, которые запускаются каждую секунду. Что вам нужно, так это в php.ini:

max_execution_time = 0

или установите его в качестве среды выполнения script в ваших PHP-кодах:

ini_set("max_execution_time",0); 

Следующая функция, которая вам нужна, является функцией sleep() в PHP. Эта функция приведет к задержке между вашими операциями. Вы можете использовать его как sleep(10);. Для получения дополнительной информации об этой функции просмотрите эту ссылку.

Ответ 4

Это может показаться странным, но почему бы вам не использовать Google Analytics для таких задач отслеживания. С новой "live beta"

И извлечение данных с помощью API и выполнение всех необходимых требований, которые могут потребоваться для управления.

Плюсы js и google будут обрабатывать большую часть загрузки.

edit: Моя реальная причина в том, почему вы не пытаетесь использовать js (woopra или свой собственный) для сбора кликов, события на передней панели и хранить все статистические данные в другой базе данных, я не считаю, что смешивание OLAP и OLTP - хорошая идея на любом производственном сервере. Надеюсь, что это имеет смысл.