У нас есть веб-приложение, которое использует IMAP для условной вставки сообщений в почтовые ящики пользователей в определенное пользователем время.
Каждое из этих «заданий» хранится в БД MySQL с отметкой времени, когда задание должно быть запущено (могут быть месяцы в будущем). Задания могут быть отменены пользователем в любое время.
Проблема заключается в том, что установление IMAP-соединений является медленным процессом, и перед тем, как вставить сообщение, нам часто приходится условно проверять, есть ли ответ от кого-либо в папке «Входящие» (или аналогичный), что добавляет значительную нагрузку на обработку для каждого задания. .
В настоящее время у нас есть система, в которой у нас запускается скрипт cron каждую минуту или около того, который получает все задания из БД, которые необходимо выполнить в течение следующих X минут. Затем он разделяет их на пакеты заданий Z и для каждого пакета выполняет асинхронный запрос POST обратно на тот же сервер со всеми данными для этих заданий Z (для достижения «ложной» многопоточности). Затем сервер обрабатывает каждую партию заданий Z, которые поступают через HTTP.
Причина, по которой мы используем асинхронный HTTP POST для многопоточности, а не что-то вроде pnctl_fork, заключается в том, что мы можем добавлять другие серверы и вместо этого отправлять им POST-данные, а также запускать задания вместо текущего сервера.
Итак, мой вопрос - есть ли лучший способ сделать это?
Я ценю рабочие очереди, такие как beanstalkd , доступные для использования, но соответствуют ли они модели запуска заданий в определенное время?
Кроме того, поскольку в любом случае нам нужно сохранять задания в БД (поскольку нам нужно предоставить пользователям пользовательский интерфейс для управления заданиями), добавление рабочей очереди там где-то на самом деле приведет к дополнительным издержкам, а не уменьшит их.
Я уверен, что есть лучшие способы достичь того, что нам нужно - любые предложения будут высоко оценены!
Мы используем PHP для всего этого, поэтому совместимое с PHP решение - это то, что нам нужно.