beanstalkd - что происходит с зарезервированными, но не завершенными заданиями? - PullRequest
4 голосов
/ 08 ноября 2011

Я создал PHP-скрипт, который читает из beanstalkd и обрабатывает задания. Там нет проблем.

Последнее, что мне нужно сделать, это просто написать для него скрипт инициализации, чтобы он мог работать как служба.

Однако, это теперь подняло еще один вопрос для меня. При попытке остановить службу, единственный очевидный способ сделать это - попытаться убить процесс. Тем не менее, если я сделаю это, что произойдет с заданием, если сценарий PHP будет на полпути к его обработке? Таким образом, задание было зарезервировано, но сценарий никогда не выполнялся или не удавался (соответственно удалить или похоронить), что происходит?

Я предполагаю, что срок действия TTR истечет, а затем он вернется в очередь готовности?

И бонус 2-й вопрос, есть ли советы о том, как лучше справиться с остановкой службы PHP?

Ответы [ 3 ]

5 голосов
/ 24 ноября 2011

Когда рабочий процесс (клиент beanstalk) открывает соединение с beanstalkd и резервирует задание, задание будет находиться в «зарезервированном» состоянии до тех пор, пока клиент не выдаст команду на удаление / отпуск (или) для задания.1002 * В случае, если рабочий процесс завершается внезапно, его соединение с beanstalkd закрывается, и сервер немедленно освобождает все задания, зарезервированные для этого конкретного соединения.

Ref: http://groups.google.com/group/beanstalk-talk/browse_thread/thread/232d0cac5bebe30f?hide_quotes=no#msg_efa0109e7af4672e

3 голосов
/ 08 ноября 2011

Любое задание, для которого истекло время и которое не похоронено или touch ed, возвращается в очередь готовности для резервирования.

Я опубликовал в другом месте об использовании Supervisord и сценариев оболочки для запуска рабочих. Преимущество в том, что большую часть времени вы, вероятно, не против немного подождать, пока рабочие места заканчиваются чисто. Вы можете заставить supervisord уничтожить сценарии bash, которые запускают рабочий сценарий, а когда сам сценарий завершится, просто завершится, поскольку его нельзя перезапустить.

Другой способ - поместить сообщение с наивысшим приоритетом (0) в трубу, которую прослушивают работники, которая заставит работников сначала удалить сообщение, а затем выйти. Я настраиваю сценарии оболочки для проверки определенного возвращаемого значения (от exit($val);), а затем они также выходят из любого цикла в сценариях оболочки.

В течение некоторого времени я использовал эти методы для Beanstalkd, а также для AWS: SQS: для работы с очередями, когда в системе выполняются миллионы заданий в день.

0 голосов
/ 26 июля 2017

Если ваша работа слишком важна, чтобы ее потерять, вы также можете использовать pcntl, чтобы дождаться ее завершения, а затем перезапустить / закрыть работника. Мне удалось обработать все подходящие сигналы pcntl, чтобы вернуть работу обратно в трубу.

...