Подтвердить что ты не робот

Как настроить Beanstalkd с помощью PHP

Недавно я изучал использование Beanstalkd с PHP. Я узнал довольно много, но у меня есть несколько вопросов о настройке на сервере и т.д.

Вот как я вижу, что он работает:

  • Я устанавливаю Beanstalkd и любые зависимости (например, libevent) на моем сервере Ubuntu. Затем я запускаю демон Beanstalkd (который должен в основном работать в любое время).
  • Где-то на моем веб-сайте (например, когда пользователь выполняет некоторые действия и т.д.) задачи добавляются в различные трубки в очереди Beanstalkd.
  • У меня есть bash script (например, следующий), который запускается как деамон, который в основном выполняет PHP скрипт.

    #!/bin/sh
    php worker.php
    

4) Рабочий script имел бы что-то подобное для выполнения задач, стоящих в очереди:

while(1) {
  $job = $this->pheanstalk->watch('test')->ignore('default')->reserve();
  $job_encoded = json_decode($job->getData(), false);
  $done_jobs[] = $job_encoded;
  $this->log('job:'.print_r($job_encoded, 1));
  $this->pheanstalk->delete($job);
}

Теперь вот мои вопросы, основанные на приведенной выше настройке (которые меня исправляют, если я ошибаюсь в этом):

  • Предположим, что у меня есть задача импортировать RSS-канал в базу данных или что-то в этом роде. Если 10 пользователей сделают это сразу, все они будут помещены в очередь в тестовой трубке. Тем не менее, они будут исполняться только по одному. Было бы лучше, если бы у вас было 10 разных трубок одновременно?

  • Если мне нужно больше трубок, значит, это также означает, что мне понадобится 10 рабочих сценариев? Один для каждой трубки, работающий одновременно с одним и тем же кодом, за исключением строкового литерала в функции watch().

  • Если я запустил этот script в качестве демона, как это работает? Будет ли он постоянно выполняться work.PHP скрипт? Этот script цикл до тех пор, пока очередь не будет пуста теоретически, так что не следует ли ее запускать только один раз? Как демон решает, как часто выполнять work.php? Это просто настройка?

Спасибо!

4b9b3361

Ответ 1

  • Если работник не слишком долго забирает фид, все будет хорошо. Вы можете запускать нескольких сотрудников, если требуется, чтобы обрабатывать более одного раза за раз. У меня есть система (в настоящее время используется Amazon SQS, но я уже делал подобное с BeanstalkD раньше), и до 200 (или более) рабочих вытягиваются из очереди.
  • Один рабочий script (один и тот же script работает несколько раз) должен быть в порядке - script может одновременно просматривать несколько трубок, и первая из них будет зарезервирована. Вы также можете использовать команду job-stat, чтобы узнать, откуда взялась конкретная $задание (какая трубка), или поместить некоторую метаинформацию в сообщение, если вам нужно сообщить каждому типу из другого.
  • Хорошим примером запуска рабочего является описанный здесь. Я также добавил supervisord (также полезный пост, чтобы начать), чтобы легко запустить и продолжить работу нескольких рабочих на машину (я запускаю сценарии оболочки, как в первая ссылка). Я бы ограничил количество циклов, а также поместил номер в reserve(), чтобы он подождал несколько секунд или более, чтобы следующее задание стало доступным без выключения из-под контроля в узком цикле, который делает не останавливаться вообще, даже если нечего делать.

Приложение:

  • Оболочка script будет запускаться столько раз, сколько вам нужно. (ссылка показывает, как выполнить повторный запуск по мере необходимости с помощью exec [email protected]). Всякий раз, когда PHP скрипт завершается, он повторно запускает PHP.
  • Очевидно, есть приложение Djanjo, чтобы показать некоторые статистические данные, но достаточно тривиально подключиться к демону, получить список трубок, а затем получить статистику для каждой трубки - или просто рассчитывает.