使用分布式部署GatewayWorker,定时器在每台服务器上都在运行

cbcbcb

请问如何控制只在主机上运行定时任务
或者有没有可能生成一个独立的业务进程,专供定时器运行

1567 1 0
1个回答

blogdaren

比如设定: $worker->count = 5
我只想在1、2号进程上运行定时器:

$worker->onWorkerStart = function($worker){
    if(in_array($worker->id, [1,2])){
        Timer::add(...);
    }
};
  • blogdaren 2020-02-20

    另外分布式的话,可以将定时器存储到mysql或redis组件以便共享。

  • cbcbcb 2020-02-20

    @614:可能我没描述清楚,现在的问题是部署在了ABC3台机器,运行起来后ABC3台上都有定时任务,但是只想在A的0号worker上运行定时任务,请问这样应该如何处理?

  • blogdaren 2020-02-20

    这个看你具体怎么实施系统管理了,方法很多,比如:
    可以将所有参与分布式部署的机器以及对应的worker服务以及定时器等等信息汇总起来进行集中性的系统(共享)存储管理,然后在某台特定的机器上运行一个监控脚本,通过分析前面的汇总数据定制启动目标服务。

  • cbcbcb 2020-02-20

    @614:如果我想简单点处理的话,可不可以A上开5个gateway进程,B和C还是4个,然后定时器只在$worker->id === 5的时候运行;这样能否确保整个负载均衡只运行一次定时器?

  • blogdaren 2020-02-20

    按照你设定的这个简单处理逻辑,希望不同机器上同一份代码能够预期工作,如果非要这么做(若更改进程数代码判定逻辑就会受影响),我认为也是可以的,不过代码逻辑要注意需要判定的是 $worker->id == 4 而不是5,因为进程编号索引是从0开始计数的。

  • cbcbcb 2020-02-20

    @614:确实是有点简单粗暴了,想请教一下“将定时器存储到mysql或redis组件以便共享”,可以说的再具体一点怎么解决我现在这个问题嘛?

年代过于久远,无法发表回答
🔝