首页 > 解决方案 > Redis、Sidekiq 和 Heroku 应用程序

问题描述

我有两个 Rails 应用程序需要共享一些状态。每个应用程序都需要在其执行生命周期内运行后台作业。我将 Heroku Redis 添加到每个应用程序和 Sidekiq。所以当我运行后台作业时,一切都很好。

我没有共享状态,直到我将一个应用程序的 REDIS_URL 指向另一个应用程序的 REDIS_URL,然后两个应用程序都使用相同的共享 Redis 实例,我假设,因此我有一些共享状态。

现在两个 Sidekiq 实例共享同一个 Redis,一个 App 正在查看其他 App 的作业并呕吐,因为它不知道其他 App 的作业。

什么是共享状态和保持工作分开的更清晰的方式?我想我只需要购买一个可以用作与作业分开的共享状态的缓存吗?

Heroku App 1. 拥有 Redis 实例。有 Sidekiq。运行 Job AaaBbbJob Heroku App 2。从 App1 指向 Redis 实例。有 Sidekiq

我注意到 App 2 的日志显示作业 AaaBbbJob 尝试运行并失败,因为未找到 AaaBbbJob。

在 App 1 的日志中,Job AaaBbbJob 运行良好......

所以我的困惑在于试图向自己保证这一切都很好。当应用程序 1 通过 Sidekiq 通过作业进入 Redis 时,无论出于何种原因,应用程序 2 在 Redis 中也看到了该作业,并尝试运行它。

所以我的问题是,由于现在将 Jobs 放入 Redis 是在两个应用程序之间共享的,所以它们都尝试并运行他们看到的任何作业?

标签: ruby-on-railsherokuredissidekiq

解决方案


每个应用程序都需要一个用于其他Redis 实例的 Redis 连接池。然后 App A 可以使用这些连接将数据或作业发送到 App B 或将作业推送到其 sidekiq。使用多个 Redis 被称为分片。

https://github.com/mperham/sidekiq/wiki/Sharding


推荐阅读