#php #mysql #cron #queue #sync
#php #mysql #cron #очередь #синхронизация
Вопрос:
Мне понадобились некоторые отзывы о веб-приложении на базе PHP / MySQL, которое я нахожусь в процессе разработки. Приложение представляет собой сайт на основе пользователей, который использует локальную базу данных для хранения данных для каждого пользователя по дням. Эти данные поступают из внешнего API и должны автоматически синхронизироваться ежедневно, чтобы в моей локальной базе данных были актуальные данные. Это методология, которую я имею в виду:
У меня есть 2 задания Cron:
-
Построитель очередей
-
Работник очереди
..и 3 таблицы базы данных:
-
Пользовательские данные (хранит все пользовательские данные, которые у меня есть на данный момент, если таковые имеются).
-
Сведения о пользователе (список всех участников, который включает пользователей, для которых у меня пока нет данных, иначе новых регистраций).
- Очередь обработки
Построитель очередей — это PHP-скрипт, который будет запускаться через Cron через регулярные промежутки времени. Это будет:
-
Сравните сведения о пользователе и таблицы пользовательских данных, чтобы определить, для каких новых пользователей у меня пока нет данных. Для этих пользователей он создаст список URL-адресов, начиная с 1/1/11 по сегодняшний день, и вставит их в таблицу Очереди обработки (это потому, что я хочу иметь данные с начала года для всех моих пользователей).
-
Проанализируйте таблицу пользовательских данных, чтобы определить, когда данные каждого пользователя были синхронизированы в последний раз, и создайте список URL-адресов с даты последней синхронизации до текущего дня. Они также будут вставлены в таблицу очереди обработки.
Таким образом, таблица очереди обработки будет содержать список всех URL-адресов, которые необходимо запросить.
Queue Worker также является скриптом PHP Cron, который будет:
- Выберите первые 20 элементов в таблице очереди обработки, получите их содержимое с помощью CURL multi, проверьте ошибки, а затем удалите первые 20 строк из таблицы. Я разбиваю его на 20 URL-адресов за раз, потому что, если я обработаю слишком много URL-адресов, скрипт может зависнуть, или мой хост может постучаться в мою дверь, вооруженный дробовиком.
Это также будет регулярно выполняться через задание Cron, поэтому идея заключается в том, что синхронизация данных должна быть автоматизирована, а пользователи должны иметь актуальные данные. Мои вопросы:
-
Каковы общие соображения по моей методологии? Есть ли какие-либо побочные эффекты при выполнении этого таким образом? Я разработчик-любитель без опыта работы в CS, поэтому всегда стремлюсь получить критику и узнать о лучших практиках! =)
-
Когда регистрируется новый пользователь, я планирую сообщить им «синхронизация ваших данных может занять xx минут», Перенаправляя их на ресурсы для начала работы и т.д. Вероятно, это нормально для моего первоначального выпуска, но в дальнейшем я хотел бы доработать его, чтобы пользователи получали уведомление по электронной почте о готовности синхронизации или могли видеть% прогресса. Легко ли мое текущее решение с этим справляется? Или у меня будут головные боли в дальнейшем?
Мнения приветствуются! Большое, БОЛЬШОЕ спасибо заранее — я надеюсь, что я это ясно объяснил!
Ответ №1:
Вероятно, лучший совет, который я могу вам дать, это: ПОЦЕЛУЙ!! Нет, я не преувеличиваю, это означает «Будь проще, глупый!» и, возможно, является очень важным инженерным принципом. Имея это в виду, первый вопрос, который я бы задал: «почему cron?» Возможно ли, чтобы все эти задачи выполнялись в режиме реального времени при регистрации пользователей? Если да, я бы посоветовал пока придерживаться этого и не заморачиваться с cron. Если вы решите использовать модуль cron, я бы порекомендовал следующее:
- Рассмотрите возможность использования файла блокировки, чтобы предотвратить одновременный запуск нескольких экземпляров вашего скрипта. Например, если вы запускаете скрипт каждые 5 минут, и каждый раз выполнение скрипта занимает 10 минут, то несколько экземпляров могут мешать друг другу.
- Использование curl multi, вероятно, создаст большую нагрузку на ваш целевой сервер, чем выполнение отдельных запросов в цикле, если вы хотите быть вежливым с целевым сервером, то, вероятно, лучше использовать одиночные запросы и иметь короткий спящий режим в цикле.
- Если вы обрабатываете только 20 заданий одновременно и ваш сервис очень популярен, вы можете столкнуться с постоянно расширяющейся рабочей очередью. Например, если вы получаете 40 задач в час и обрабатываете только 20 задач в час, вы никогда не дойдете до конца очереди, и очередь никогда не завершится.
HTH.
Комментарии:
1. Привет, Робин, большое спасибо за твой ответ. Я, конечно, могу инициировать процесс, когда пользователь регистрируется, однако я хочу получать новые данные каждую ночь в 12 часов ночи (за предыдущий день), поэтому я склоняюсь к заданию Cron. Есть ли альтернативы получше / проще? Спасибо за совет по блокировке файла — я обязательно сделаю это, чтобы предотвратить запуск нескольких заданий. 🙂 Вы подняли отличный вопрос о постоянно расширяющейся рабочей очереди! Мой процесс, по сути, просто CURL, получающий текстовую строку из множества разных URL-адресов, так что со мной все должно быть в порядке, хотя здорово знать потенциальные подводные камни.
2. Хорошо, похоже, требуется задание cron, я считаю, что это, вероятно, самое простое решение. Единственный другой совет, который у меня есть, тот же, что я давал вам раньше — ПОЦЕЛУЙ!
3. Спасибо, Робин, какой самый простой способ включить уведомления по электронной почте после регистрации пользователя? Я думаю, что добавление столбца «статус» в таблицу сведений о пользователе и отслеживание может быть правильным решением — хотя это и кажется сложным!
4. Как вы справляетесь со сбоем API? Что делать, если ваш cron запускается, но API не работает, и теперь данные на несколько дней не импортируются? Проверяет ли скрипт, что предыдущий день был выполнен успешно?