负载均衡Task问题

alex

问题描述

问下 如果我现在是负载均衡服务器 后端挂了6台服务器,如果执行Task会不会重复啊,像这种情况怎么执行Task啊,是限制ip单个机器执行吗?还是有什么好的方案。

用的是这个插件 https://www.workerman.net/doc/webman/components/crontab.html

257 3 1
3个回答

mass_wm

Redis 分布式锁

  • 暂无评论
qqxxr

改造一下config/process.php文件

自己配置一下env环境变量,HOST_ENVIRONMENT这个分主从

$process = [
    // File update detection and automatic reload
    'monitor' => [
        'handler'     => process\Monitor::class,
        'reloadable'  => false,
        'constructor' => [
            // Monitor these directories
            'monitorDir'        => array_merge([
                app_path(),
                config_path(),
                base_path() . '/process',
                base_path() . '/support',
                base_path() . '/resource',
                base_path() . '/.env',
                base_path() . '/route',
            ], glob(base_path() . '/plugin/*/app'), glob(base_path() . '/plugin/*/config'), glob(base_path() . '/plugin/*/api')),
            // Files with these suffixes will be monitored
            'monitorExtensions' => [
                'php',
                'html',
                'htm',
                'env'
            ],
            'options'           => [
                'enable_file_monitor'   => !Worker::$daemonize && DIRECTORY_SEPARATOR === '/',
                'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/',
            ]
        ]
    ],
];

$hostEnv = getenv('HOST_ENVIRONMENT') ?? '';
//开启定时任务
if ($hostEnv != 'slave') {
    $task = [
        'task'      => [
            'handler' => process\Task::class
        ]
    ];

    $process = array_merge($process, $task);
}
return $process;
  • tanhongbin 2026-07-02

    对的 自己处理一下 保证一个机器定时任务即可

ichynul

方法1、限制只有其中一台运行,缺点是可能那台会特别忙。
方法2、每台服务器编号,根据任务编号分配:

public function run($task)
{
    $hostId = (int)file_get_contents(base_path() . '/host-id.txt'); //网站根目录文件,内容:0~5
    $taskId = $task['id'];//任务id,数据库自增主键
    if ($taskId % 6 != $hostId) {
        return;
    }
    //处理任务
}
  • 暂无评论
🔝