У нас есть веб-приложение, которое использует IMAP для условного вставки сообщений в почтовые ящики пользователей в определенные пользователем моменты времени.Лучшее решение для запуска нескольких интенсивных заданий в определенное время
Каждое из этих «заданий» хранится в БД MySQL с отметкой времени, когда должно выполняться задание (могут быть месяцы в будущем). Работы могут быть отменены пользователем в любое время.
Проблема заключается в том, что подключение IMAP является медленным процессом, и перед тем, как мы вставим сообщение, нам часто приходится условно проверять, есть ли ответ от кого-то во входящей (или подобной), что добавляет значительную нагрузку на обработку для каждого работа.
В настоящее время у нас есть система, в которой у нас есть скрипт cron, работающий каждую минуту или около того, что получает все задания из БД, которые необходимо доставить в следующие X минут. Затем он разбивает их на партии заданий Z, и для каждой партии выполняет асинхронный запрос POST обратно на тот же сервер со всеми данными для этих заданий Z (для достижения «поддельной» многопоточности). Затем сервер обрабатывает каждую партию Z-заданий, которые поступают через HTTP.
Причина, по которой мы используем async HTTP POST для многопоточности, а не что-то вроде pnctl_fork, так это то, что мы можем добавлять другие серверы и вместо них использовать POST-данные вместо них, а также запускать задания, а не текущий сервер.
Так что мой вопрос - есть ли лучший способ сделать это?
Я ценю работу очереди, как beanstalkd доступны для использования, но они подходят модели, имеющие для выполнения заданий в определенное время?
Кроме того, поскольку нам нужно поддерживать задания в БД в любом случае (потому что нам нужно предоставить пользователям пользовательский интерфейс для управления заданиями), добавив рабочую очередь там, где-то на самом деле нужно добавлять дополнительные накладные расходы, а не уменьшать Это?
Я уверен, что есть более эффективные способы достижения того, что нам нужно - любые предложения будут высоко оценены!
Мы используем PHP для всего этого, поэтому решение на основе PHP/совместимое решение действительно то, что мы ищем.
Лучше, каким образом? Вы можете указать, что именно вам не нравится в текущей настройке. – Ranty
Похоже, вы делаете вещи относительно разумно. Часто для максимальной масштабируемости будет наилучшим решением, ориентированное на обслуживание архитектуры (SOA), что, по-вашему, похоже на то, что вы делаете с публикацией через HTTP на другие серверы. См .: http://en.wikipedia.org/wiki/Service-oriented_architecture –
Добавленные накладные расходы HTTP-запросов кажутся мне расточительными, и мне было интересно, есть ли лучший способ добиться того же результата (т.е. распространить обработку загрузка через серверы). Также мы разделяем текущие ожидающие задания на партии заданий Z, но этот номер z довольно произволен и не реагирует на фактическое использование памяти или время, затрачиваемое на выполнение процессов. Но на самом деле я просто хочу проверить, что это не сумасшедший способ делать вещи и что я не пропустил гораздо более простой или более эффективный способ сделать это! :-) –