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

Недавно я исследовал использование 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 ответ

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

Приложение:

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