【问题标题】:multiple queues on same server with different environment (Laravel Forge)具有不同环境的同一服务器上的多个队列(Laravel Forge)
【发布时间】:2020-01-31 14:06:28
【问题描述】:

我真的很困惑,如果你能解释一下,我会很高兴的。

我有什么:

1) Laravel Forge 单服务器。

2) 那里有两个站点(暂存和生产)

3) 为每个队列设置 1 个(FORGE 上的登台和生产)

问题: 我有通过队列生成的pdf。看起来即使队列是从暂存代码中执行的,有时生产站点的队列也会运行。看了很多后,我总结他们互相搞乱是因为他们在同一台服务器上。所以这就是我所做的。这是 config/queue.php。

'database' => [
     'driver' => 'database',
     'table' => 'jobs',
     'queue'  => env('QUEUE_NAME', 'default'), // i made this instead of default as it was
     'retry_after' => 90,
],

之后,由于我有不同的 env 文件用于暂存和生产,因此我在其中放置了不同的 QUEUE_NAME 值。比如说.staging.env QUEUE_NAME=staging.prod.env QUEUE_NAME=production

然后我转到 My Laravel Forge 的暂存站点,添加了一个这样的队列:

Connection: database
Queue: staging

我也搬到了 My Laravel Forge 的产品站点,添加了一个队列,但另一个不同。

Connection: database
Queue: production

在这一切之后,看起来问题可能已经消失了。

问题 1) 你认为我所做的是否正确,最重要的是,足以让我的问题不再出现?

问题 2) 暂存站点和生产站点的部署脚本的末尾都有 php artisan queue:restart。我认为如果我将某些内容上传到登台服务器并且该行被执行,它也会重新启动生产队列。这似乎真的很糟糕。我找不到任何东西可以像这样传递参数来重新启动:

php artisan queue:restart --queue=staging

【问题讨论】:

    标签: php laravel queue laravel-forge


    【解决方案1】:

    我认为您的解决方案有效,但更好的解决方案是确保它们不使用相同的数据存储。

    对于每个队列驱动程序,Laravel 存储待处理的作业、已完成的作业和失败的作业。前两个的位置取决于驱动程序,而最后一个始终存储在数据库中。例如,对于database 驱动程序,待处理和已完成的作业存储在数据库中。对于redis 驱动程序,它们存储在 Redis 中。

    这意味着,如果您可以确保您的应用程序的每个实例都使用不同的数据库(即使它们在同一个安装中),那么您应该很好!例如(假设您使用的是共享实例):

    • 如果您的数据库实例是 MySQL,您可以为每个环境创建不同的数据库并将其设置为 DB_NAME
    • 如果您的数据库实例是 SQLite,请为每个数据库创建一个不同的数据库文件并将其放在 database/ 文件夹中,然后将路径名称设置为 DB_NAME
    • 如果您的队列驱动程序是 redis,请将 REDIS_DB 的值(0 到 15 之间的数字)设置为不同环境的不同值。

    【讨论】:

      猜你喜欢
      • 2018-07-09
      • 2017-05-22
      • 2014-11-18
      • 2019-03-27
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      相关资源
      最近更新 更多