Как настроить Beanstalkd с PHP - PullRequest
       43

Как настроить Beanstalkd с PHP

12 голосов
/ 11 октября 2011

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

Вот как я это вижу:

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

    #!/bin/sh
    php worker.php
    

4)Рабочий сценарий будет иметь что-то вроде этого для выполнения поставленных в очередь задач:

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);
}

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

  1. Скажем, у меня есть задача импортировать RSS-канал в базу данных или что-то в этом роде.Если 10 пользователей сделают это одновременно, все они будут поставлены в очередь в «тестовой» трубе.Однако тогда они будут казнены только по одному.Будет ли лучше иметь 10 разных ламп одновременно?

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

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

Спасибо!

1 Ответ

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

Добавление:

  1. Сценарий оболочки будет запускаться столько раз, сколько вам нужно. (ссылка показывает, как его перезапустить, как требуется с exec $@). Когда скрипт php завершается, он перезапускает PHP.
  2. Очевидно, что есть приложение Djanjo, которое показывает некоторые характеристики, но достаточно просто подключиться к демону, получить список труб и затем получить статистику для каждой трубки - или просто считать.
...