我的应用在负载均衡器后面的 3 台服务器上运行。因此它是无状态的,所有数据都存储在redis和MySQL中。
如果我的机器正在运行 artisan cron 调度程序,我假设相同的任务将运行 3 次。在每台机器上一次,因为不知道它们之间共享的运行内容,也就是数据库表。
解决方案是什么?
最佳答案
edit: In recent versions of Laravel, this is now built-in.
$schedule->command('foo:bar')->onOneServer();
我们在每次 cron 执行时只在一台服务器上运行的 Artisan 命令中执行此操作:
public function handle()
if(!Cache::add(get_class($this), true, 0.5)) {
return false;
}
Cache::add
是同步的,如果键已经存在,将返回 false,因此即使所有三个服务器都以完全相同的微秒执行,只有一个服务器将继续执行其余任务。
另一个常见的选择是仅在集群中的单个服务器上启用 cron,或者为 cron 本身设置一个专用服务器。
关于php - Laravel 调度分布式应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38123512/