请问如何控制只在主机上运行定时任务 或者有没有可能生成一个独立的业务进程,专供定时器运行
比如设定: $worker->count = 5 我只想在1、2号进程上运行定时器:
$worker->onWorkerStart = function($worker){ if(in_array($worker->id, [1,2])){ Timer::add(...); } };
另外分布式的话,可以将定时器存储到mysql或redis组件以便共享。
@614:可能我没描述清楚,现在的问题是部署在了ABC3台机器,运行起来后ABC3台上都有定时任务,但是只想在A的0号worker上运行定时任务,请问这样应该如何处理?
这个看你具体怎么实施系统管理了,方法很多,比如: 可以将所有参与分布式部署的机器以及对应的worker服务以及定时器等等信息汇总起来进行集中性的系统(共享)存储管理,然后在某台特定的机器上运行一个监控脚本,通过分析前面的汇总数据定制启动目标服务。
@614:如果我想简单点处理的话,可不可以A上开5个gateway进程,B和C还是4个,然后定时器只在$worker->id === 5的时候运行;这样能否确保整个负载均衡只运行一次定时器?
按照你设定的这个简单处理逻辑,希望不同机器上同一份代码能够预期工作,如果非要这么做(若更改进程数代码判定逻辑就会受影响),我认为也是可以的,不过代码逻辑要注意需要判定的是 $worker->id == 4 而不是5,因为进程编号索引是从0开始计数的。
@614:确实是有点简单粗暴了,想请教一下“将定时器存储到mysql或redis组件以便共享”,可以说的再具体一点怎么解决我现在这个问题嘛?
比如设定: $worker->count = 5
我只想在1、2号进程上运行定时器:
另外分布式的话,可以将定时器存储到mysql或redis组件以便共享。
@614:可能我没描述清楚,现在的问题是部署在了ABC3台机器,运行起来后ABC3台上都有定时任务,但是只想在A的0号worker上运行定时任务,请问这样应该如何处理?
这个看你具体怎么实施系统管理了,方法很多,比如:
可以将所有参与分布式部署的机器以及对应的worker服务以及定时器等等信息汇总起来进行集中性的系统(共享)存储管理,然后在某台特定的机器上运行一个监控脚本,通过分析前面的汇总数据定制启动目标服务。
@614:如果我想简单点处理的话,可不可以A上开5个gateway进程,B和C还是4个,然后定时器只在$worker->id === 5的时候运行;这样能否确保整个负载均衡只运行一次定时器?
按照你设定的这个简单处理逻辑,希望不同机器上同一份代码能够预期工作,如果非要这么做(若更改进程数代码判定逻辑就会受影响),我认为也是可以的,不过代码逻辑要注意需要判定的是 $worker->id == 4 而不是5,因为进程编号索引是从0开始计数的。
@614:确实是有点简单粗暴了,想请教一下“将定时器存储到mysql或redis组件以便共享”,可以说的再具体一点怎么解决我现在这个问题嘛?