Laravel安排在分布式应用程序上

And*_*gan 5 php distributed redis laravel

我的应用程序在负载均衡器后面的3台服务器上运行.因此它是无状态的,所有数据都存储在redis和MySQL中.

如果我的机器正在运行工匠cron调度程序,我假设相同的任务将运行3次.一旦在每台机器上,因为不知道它们之间共享的是什么,也就是数据库表.

有什么解决方案?

cee*_*yoz 6

编辑:在Laravel的最新版本中,这是现在内置的.

$schedule->command('foo:bar')->onOneServer();
Run Code Online (Sandbox Code Playgroud)

我们在Artisan命令中执行此操作,该命令应仅在每个cron执行的一个服务器上运行:

public function handle()
    if(!Cache::add(get_class($this), true, 0.5)) {
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

Cache::add 是同步的,如果密钥已经存在,则返回false,因此即使所有三个服务器都以完全相同的微秒执行,只有一个服务器将继续执行其余任务.

另一个常见选项是在集群中的单个服务器上启用cron,或者为cron本身设置专用服务器.