Инфраструктура для запуска вашего Zend Queue Receiver - PullRequest
1 голос
/ 30 ноября 2009

У меня есть простая настройка очереди сообщений, которая выполняется с использованием иерархии объектов Zend_Queue . Я использую Zend_Queue_Adapter_Db серверную часть. Я заинтересован в том, чтобы использовать это как очередь заданий, чтобы запланировать обработку на более позднее время. Это работы, которые не должны происходить немедленно, но должны произойти раньше, чем позже.

Существуют ли передовые / стандартные способы настройки инфраструктуры для выполнения заданий? Я понимаю код для получения сообщения из очереди, но мне не очень понятно, как запустить программу, которая выполняет этот прием. Крон, который получает n сообщений в командной строке, запускается раз в минуту? Крон, который запускает несколько веб-запросов, каждый веб-запрос выполняет скрипт-получатель? Что-то еще?

Тангенциальный бонусный вопрос. Если я выполняю другие запросы с Zend_Db, будут ли запросы очереди сообщений считаться частью этой транзакции?

1 Ответ

2 голосов
/ 30 ноября 2009

Вы можете сделать это как пул потоков. Создайте скрипт php командной строки для обработки получения. Он должен быть запущен сценарием оболочки, который автоматически перезапускает процесс в случае его смерти. Сценарий оболочки не должен запускать процесс, если он уже запущен (используйте файл $ pid.running или аналогичный). Пусть cron запускает несколько таких каждые 1-10 минут. Это должно хорошо обрабатывать получение.

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

Другим способом использования этого было бы иметь некоторый фоновый процесс создания данных, и веб-пользователи потребляют его, когда они естественным образом просматривают сайт. Генератор отчетов может работать таким образом. Общекорпоративные отчеты доступны для всех пользователей, но вы не хотите, чтобы все они генерировали этот дБ / интенсивный отчет. Таким образом, вы создаете очередь и обрабатываете по очереди, возможно удаляя дубликаты. Все пользователи могут просматривать отчеты, когда они готовы.

Согласно документации не похоже, что Zend DB даже использует то же соединение, что и другие ваши запросы zend_db. Но, конечно, лучший способ выяснить это сделать простой тест.

EDIT Несколько строк в cron предназначены для параллелизма. каждая строка представляет работника для пула. Мне было непонятно, вы не хотите указывать pid в качестве идентификатора, вы хотите передать его в качестве параметра.

          • / home / byron / run_queue.sh Process1
          • / home / byron / run_queue.sh Process2
          • / home / byron / run_queue.sh Process3

Сценарий bash проверит наличие файла $ process.running, если обнаружит, что он завершился.

в противном случае:

  • Создайте файл $ process.running.
  • запустить процесс php. Заблокируйте / подождите, пока не закончите.
  • Удалить файл $ process.running.

Это позволяет сценарию php умереть, но не приводит к тому, что пул теряет работника.

Если очередь пуста, скрипт php немедленно завершается и снова запускается с помощью nex-вызова cron.

...