ruby-on-rails - 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 是在两个应用程序之间共享的,所以它们都尝试并运行他们看到的任何作业?
解决方案
每个应用程序都需要一个用于其他Redis 实例的 Redis 连接池。然后 App A 可以使用这些连接将数据或作业发送到 App B 或将作业推送到其 sidekiq。使用多个 Redis 被称为分片。
推荐阅读
- php - 使用 laravel 下载和删除文件时弹出不来
- php - Windows 中是否存在根文件系统,尤其是在 Windows 10 中?
- ios - 在飞行模式下,CTCarrier 中的 isoCountryCode 不返回 nil
- sql - 无法连接到 AWS 中的 SQL 数据库(无法访问服务器)
- java - OpenCV VideoCapture 从视频中删除 alpha 通道
- javascript - 如何使用谷歌应用脚本获取谷歌表格中特定列的最后一个单元格?
- node.js - NodeJS - 从 java 密钥库文件中导出私钥
- android - Android 8.1.0 未选择最佳匹配图标大小
- pdf - 将 HTML 转换为 PDF Puppeteer
- java - 如何从 CSV 读取数据并使用 java 将其写入 HTML 模板