【发布时间】:2021-03-01 21:18:08
【问题描述】:
我有两个 Rails 应用程序需要共享一些状态。每个应用程序都需要在其执行生命周期内运行后台作业。我将 Heroku Redis 添加到每个应用程序和 Sidekiq。所以当我运行后台作业时,一切都很好。
我没有共享状态,直到我将一个应用程序的 REDIS_URL 指向另一个应用程序的 REDIS_URL,然后两个应用程序都使用相同的共享 Redis 实例,我假设,因此我有一些共享状态。
现在两个 Sidekiq 实例共享同一个 Redis,一个 App 正在查看其他 Apps 的作业并在呕吐,因为它不知道其他 Apps 的作业。
什么是共享状态和保持作业分开的更清晰的方法?我想我只需要购买一个可以用作与作业分开的共享状态的缓存吗?
Heroku 应用 1. 拥有 Redis 实例。有 Sidekiq。运行作业 AaaBbbJob Heroku App 2. 从 App1 指向 Redis 实例。有 Sidekiq
我注意到 App 2 的日志显示作业 AaaBbbJob 尝试运行并失败,因为未找到 AaaBbbJob。
在 App 1 的日志中,Job AaaBbbJob 运行良好...
所以我的困惑在于试图向自己保证这一切都很好。当 App 1 通过 Sidekiq 通过作业进入 Redis 时,无论出于何种原因,App 2 在 Redis 中也看到了该作业,并尝试运行它。
所以我的问题是,由于现在将 Jobs 放入 Redis 是在两个应用程序之间共享的,它们都尝试并运行他们看到的任何作业?
【问题讨论】:
-
你如何表示你的应用状态? Sidekiq 在不同的机器/实例中运行你的 slug。您应该将任何必需的参数传递给您的工作,而它是模型实例或应用程序范围的数据。 Sidekiq 不知道动态创建的网络服务器常量或类变量是什么。 (如果您有实际代码要添加到您的问题中会更容易)
标签: ruby-on-rails heroku redis sidekiq