问下 如果我现在是负载均衡服务器 后端挂了6台服务器,如果执行Task会不会重复啊,像这种情况怎么执行Task啊,是限制ip单个机器执行吗?还是有什么好的方案。
用的是这个插件 https://www.workerman.net/doc/webman/components/crontab.html
Redis 分布式锁
改造一下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;
对的 自己处理一下 保证一个机器定时任务即可
方法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; } //处理任务 }
Redis 分布式锁
改造一下config/process.php文件
自己配置一下env环境变量,HOST_ENVIRONMENT这个分主从
对的 自己处理一下 保证一个机器定时任务即可
方法1、限制只有其中一台运行,缺点是可能那台会特别忙。
方法2、每台服务器编号,根据任务编号分配: