如何在Gearman中获取特定类型的排队作业数量?

15

我有多个gearman客户端发送作业,比如说job1。

$client = new GearmanClient();
$client->addServer();
$client->doBackground('job1', 'workload');

处理该作业大约需要10秒钟。我想追踪有多少'job1'作业正在等待工人处理它们。我该如何做?

7个回答

31

为了快速检查,我使用这个 Bash 一行命令:

(echo status ; sleep 0.1) | netcat 127.0.0.1 4730

这会打开一个到本地运行的gearman实例的连接,并发送status查询。该查询包含该实例上作业的名称和数量。可以使用grep/awk/wc等工具对信息进行处理,以进行报告和警报。

我还使用workers查询执行相同操作,该查询显示所有已连接的worker。

(echo workers ; sleep 0.1) | netcat 127.0.0.1 4730

使用sleep是为了保持连接足够长的时间以等待回复。

完整的管理命令列表和输出含义,请参见http://gearman.org/protocol/。只需搜索“Administrative Protocol”即可。


1
只是好奇:为什么需要睡眠0.1?例如,memcached的等效命令不需要sleep。 - mjs
我不得不使用nc而不是netcat,但除此之外一切都很好! - Nate

12

对d5ve的回答进行补充,添加一个-w参数来“超时”您的netcat连接,否则您将永远无法返回到命令提示符。

$ (echo status ; sleep 0.1) | sudo netcat 127.0.0.1 4730 -w 1

我不能提出一个字符的更改建议,但使用#作为提示字符可以使解析器将代码行解释为注释,并将其变暗。 - bschlueter

9
telnet localhost 4730
status

worker_name total_queue currently_running number_of_workers
job1         1          1                 9

1
感谢列的解释。 - Aleksey
双倍感谢您的支持!似乎没有任何地方提到这些列。 - relipse

3
我使用gearman_top,它是mod-gearman的一部分。
网站上的示例输出:
+-----------------------+--------+-------+-------+---------+
| Name                  | Worker | Avail | Queue | Running |
+-----------------------+--------+-------+-------+---------+
| check_results         | 1      | 1     | 0     | 0       |
| host                  | 3      | 3     | 0     | 0       |
| service               | 3      | 3     | 0     | 0       |
| eventhandler          | 3      | 3     | 0     | 0       |
| servicegroup_jmx4perl | 3      | 3     | 0     | 0       |
| hostgroup_japan       | 3      | 3     | 0     | 0       |
+-----------------------+--------+-------+-------+---------+

1
在Ubuntu 18.04上,我已经默认安装了gearman软件包中的gearadmin二进制文件。 gearadmin --help
可以使用gearadmin --status代替netcat的替代方法:
gearadmin --status
queue1    334     10      10

以下是一行命令:
while :; do gearadmin --status; sleep 1; done


1

Gearmand有一个telnet接口,您可以查询。(协议的确切细节可以在gearman网站上找到-http://gearman.org/?id=protocol)

我使用了这里的代码作为自己滚动的起点。 https://github.com/liorbk/php/blob/master/GearmanTelnet.php (这段代码本身非常好,您应该能够直接使用它)

这不是一个很好的解决方案,但在没有人改进gearman管理界面以便您可以直接通过PHP进行交流或编写插件之前,您只能靠自己。


1

看起来没有立即获取此信息的方法。

以下是几个选项。首先,如果您可以在创建作业句柄时抓取它们(搜索“谈到检查状态”),您可以将它们存储在某个中央位置并从任何客户端查询有关它们的信息。

其次,您可以设置Gearman服务器使用持久队列,然后自己对队列运行查询。这可能是两个选项中更容易和更清洁的选项。


使用持久队列可以获得+1:这也允许更好地控制队列。 - paul.ago

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接