Извлекайте частичные данные с более частыми интервалами, продолжая получать полные данные с меньшими интервалами - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть сценарий PHP, который в настоящее время извлекает данные и заполняет таблицу БД извлеченными данными после применения к ней серьезных правил. Затем он выполняет какой-то расчет на основе всех данных и присваивает значение каждой записи в данных на основе результатов расчета.

Один прогон занимает около 25 минут, и я хочу получить fre sh данных как можно в любой момент времени. Так что я думаю, что этот скрипт можно запускать только примерно каждые 30 минут как задание cron.

Тем не менее, из получаемых данных около 4/5 не сильно меняется в течение 30 минут. Я могу настроить сценарий на получение 1/5 данных, которые, как ожидается, будут иметь более частые изменения между каждым запросом. Это займет около 6-7 минут.

Вопрос в том, как мне создать скрипт, который будет извлекать 1/5 данных каждые 10 минут и продолжать получать остальные 4/5 данных каждые 30 минут, так как в конечном итоге мне нужно отобразить и выполнить вычисления для всех данных вместе.

Должен ли это быть один сценарий или два сценария? Должны ли они быть заданиями cron в заданное время или нет?

Должен ли я использовать, например, разные таблицы и создать представление, которое принимает оба?

Кроме того, что произойдет в минуту 30, когда оба сценария выполняются вместе, я думаю, что оба будут заканчиваться sh медленнее, чем 30 и 10 минут, если для обоих потребуется один и тот же сервер MYSQL для обработки (также сервер API может вызвать больше ошибок, если я получу его с двумя сценариями за раз время, но не уверен).

Каков будет правильный путь к производительности и скорости?

1 Ответ

1 голос
/ 11 февраля 2020

Ни того, ни другого.

Крон не очень подходит для непрерывного выполнения чего-либо. Он светит при периодическом выполнении некоторых быстрых задач .

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

Но, как только он заканчивается, он начинается заново. Между тем, было бы разумно, чтобы cron запустил программу keep-alive, которая выполняет одну быструю задачу: посмотрите, жива ли задача загрузчика; если нет, он перезапускает его.

Если вы перезагружаете всю таблицу, сделайте это следующим образом:

CREATE TABLE t_new LIKE t;
load the data by whatever means
RENAME TABLE t TO t_old, t_new TO t;
DROP TABLE t_old;

Таким образом, t всегда присутствует и полностью загружен.

Если вы обновляете только часть таблицы, сделайте что-то более похожее на

CREATE TEMPORARY TABLE temp ...;
load some data into `temp`
massage, if needed, that data
INSERT INTO t (...)
    SELECT ... FROM temp
    ON DUPLICATE KEY UPDATE ...;
DROP TEMPORARY TABLE temp;

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

По возможности, применяйте ваши «правила» ко всем данным таблицы; не обрабатывать по одной строке за раз. (Это может существенно повлиять на производительность.)

О, я должен пояснить, почему мне не нравится cron для основной задачи. Сегодня задача занимает 25 минут и выполняется каждые 30 минут. Завтра что-то изменится, и это займет 35 минут. Теперь следующий экземпляр будет наступать на первый, возможно, создавая беспорядок. Или, может быть, просто замедляется. Если он просто замедляется, то последующий экземпляр, вероятно, будет еще медленнее, потому что они борются за процессор, и т. Д. c. В конце концов, система «зависнет», потому что «ничего» не делается. И вы инстинктивно перезагрузите его. Мой дизайн полностью избегает этого.

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