請問如何控制只在主機上運行定時任務
或者有沒有可能生成一個獨立的業(yè)務進程,專供定時器運行
比如設定: $worker->count = 5
我只想在1、2號進程上運行定時器:
$worker->onWorkerStart = function($worker){
if(in_array($worker->id, [1,2])){
Timer::add(...);
}
};
@614:可能我沒描述清楚,現(xiàn)在的問題是部署在了ABC3臺機器,運行起來后ABC3臺上都有定時任務,但是只想在A的0號worker上運行定時任務,請問這樣應該如何處理?
這個看你具體怎么實施系統(tǒng)管理了,方法很多,比如:
可以將所有參與分布式部署的機器以及對應的worker服務以及定時器等等信息匯總起來進行集中性的系統(tǒng)(共享)存儲管理,然后在某臺特定的機器上運行一個監(jiān)控腳本,通過分析前面的匯總數(shù)據(jù)定制啟動目標服務。
@614:如果我想簡單點處理的話,可不可以A上開5個gateway進程,B和C還是4個,然后定時器只在$worker->id === 5的時候運行;這樣能否確保整個負載均衡只運行一次定時器?
按照你設定的這個簡單處理邏輯,希望不同機器上同一份代碼能夠預期工作,如果非要這么做(若更改進程數(shù)代碼判定邏輯就會受影響),我認為也是可以的,不過代碼邏輯要注意需要判定的是 $worker->id == 4 而不是5,因為進程編號索引是從0開始計數(shù)的。