php - Laravel 调度分布式应用程序

标签 php laravel redis distributed

我的应用在负载均衡器后面的 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/

相关文章:

php - 此查询类型的 SQL 连接

php - 如何使用正则表达式删除标签及其内容?

php - Laravel5 响应 "The HTTP status code "1"is not valid."

php - max_execution_time 为 240 秒 - 超过 60 秒的超时

缓存数据库问题

redis - 使用 ElastiCache Redis 上的单个复制组进行故障转移

javascript - 将数据从Mysql输出到js/HTML

php - 无法将信息存储在 MySQL 数据库中

Windows 上的 Laravel 5.1 任务调度

amazon-web-services - 用于 Redis 引擎 CPU 利用率指标的 AWS ElastiCache,如何解释?