Как я могу получить количество заданий в очереди определенного типа в gearman?
У меня есть несколько клиентов-посредников, отправляющих задание, скажем job1.
$client = new GearmanClient();
$client->addServer();
$client->doBackground('job1', 'workload');
Для обработки этого задания требуется 10 секунд.
Я хочу отслеживать, сколько заданий "job1" ждут, когда работник будет работать над ними в любой момент времени. Как я могу это сделать?
Ответы
Ответ 1
Для быстрой проверки я использую этот bash однострочный:
(echo status ; sleep 0.1) | netcat 127.0.0.1 4730
Это открывает соединение с экземпляром ретранслятора, запущенным на локальном хосте, и отправляет запрос состояния. Он содержит имя и количество заданий в этом экземпляре. Затем информация может обрабатываться с помощью grep
/awk
/wc
и т.д. Для сообщения и оповещения.
Я также делаю то же самое с рабочим запросом, который показывает всех связанных работников.
(echo workers ; sleep 0.1) | netcat 127.0.0.1 4730
Сон заключается в том, чтобы открыть соединение достаточно долго для ответа.
Полный список административных команд и то, что означает средство вывода, находится в http://gearman.org/protocol/. Просто найдите "Административный протокол".
Ответ 2
Чтобы расширить ответ d5ve, добавьте параметр -w для "выключения" вашего подключения netcat, иначе вы никогда не вернетесь в командную строку.
$ (echo status ; sleep 0.1) | sudo netcat 127.0.0.1 4730 -w 1
Ответ 3
telnet localhost 4730
status
worker_name total_queue currently_running number_of_workers
job1 1 1 9
Ответ 4
Не похоже, что есть какие-либо непосредственные способы получить эту информацию.
Вот несколько вариантов. Во-первых, если вы можете захватить дескрипторы заданий при их создании (найдите "Говорить о проверке состояния" ), вы можете сохранить их в какое-то центральное место и запрос о них от любого клиента.
Во-вторых, вы можете настроить сервер Gearman на использование постоянных очередей, а затем запустить запрос к очереди самостоятельно. Это может быть проще и чище двух вариантов.
Ответ 5
Gearmand имеет интерфейс telnet, который вы можете запросить. (точные сведения о протоколе можно найти на веб-сайте gearman - http://gearman.org/?id=protocol)
Я использовал этот код здесь как отправную точку для моего собственного.
https://github.com/liorbk/php/blob/master/GearmanTelnet.php
(этот код отлично подходит сам по себе, и вы должны уметь использовать его из коробки)
Это менее приемлемое решение, но пока кто-то не улучшит интерфейс администратора ретранслятора, чтобы вы могли напрямую общаться через PHP или записывать плагин для него, вы сами