【问题标题】:How can I get the number of queued jobs of a particular type in gearman?如何在 gearman 中获取特定类型的排队作业数?
【发布时间】:2010-07-31 15:38:41
【问题描述】:

我有许多齿轮工客户发送一份工作,比如 job1。

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

处理此作业需要 10 秒。 我想跟踪在任何给定时间有多少“job1”工作正在等待工人处理。我该怎么做?

【问题讨论】:

    标签: php gearman


    【解决方案1】:

    为了快速检查,我使用这个 bash one-liner:

    (echo status ; sleep 0.1) | netcat 127.0.0.1 4730
    

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

    我也对显示所有已连接工作人员的 workers 查询执行相同操作。

    (echo workers ; sleep 0.1) | netcat 127.0.0.1 4730
    

    睡眠是为了保持连接打开足够长的时间来回复。

    管理命令的完整列表以及输出的含义位于http://gearman.org/protocol/。只需搜索“管理协议”即可。

    【讨论】:

    • 只是好奇:为什么需要 sleep 0.1?例如的等效命令memcached 不需要睡眠。
    • 我不得不使用 nc 而不是 netcat,但效果很好!
    【解决方案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_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       |
    +-----------------------+--------+-------+-------+---------+
    

    【讨论】:

      【解决方案5】:

      似乎没有任何直接的方法可以获取此信息。

      这里有几个选项。首先,if you can grab job handles as you create them(搜索“说到检查状态”),您可以将它们存储在某个中心位置并从任何客户端查询它们。

      其次,您可以将 Gearman 服务器设置为使用 persistent queues,然后自己对队列运行查询。这可能是两个选项中更简单、更简洁的选项。

      【讨论】:

      • +1 用于使用持久队列:这也允许更好地控制队列
      【解决方案6】:

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

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

      这是一个不太漂亮的解决方案,但除非有人改进了 gearman 管理界面,以便您可以直接通过 PHP 对话或为其编写插件,否则您只能靠自己

      【讨论】:

        【解决方案7】:

        在 Ubuntu 18.04 上,我使用 gearman 软件包默认安装了 gearadmin 二进制文件。

        gearadmin --help
        gearadmin --status 可以用来代替 netcat 替代方案:

        gearadmin --status
        queue1    334     10      10
        

        还有一个班轮:
        while :; do gearadmin --status; sleep 1; done

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-25
          • 1970-01-01
          • 2017-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-03
          • 1970-01-01
          相关资源
          最近更新 更多