【发布时间】:2019-01-06 11:37:22
【问题描述】:
场景:
我们有几个使用 Sidekiq 和 Redis 的多租户应用程序。
在每个 Rails 应用程序中,我们都有多个帐户。每个帐户独立于其他帐户工作。每个帐户对应一个不同的客户。
出于成本和基础设施维护的考虑,我们希望为所有应用程序使用相同的 Redis 服务器。我们的 Multitentant 应用程序(我们有大约 20 个应用程序,大约 40 个帐户)产生的流量对于单个 Redis 服务器来说并不过分,因此我们的问题只是关于配置该服务器。
要求
我们需要唯一标识每个应用程序/帐户的每个队列,以便当 Sidekiq 充当服务器时,它只处理自己的队列。
可以在不同的层次上进行分离/识别:
按帐户明确区分
通过机器(应用程序)明确分离。每台机器(应用程序)都有一个关联的数据库,并且在该数据库中 account_id 是唯一的。每个 Job 都有一个 account_id 标识符,因此,在知道 Job 属于哪台机器(或数据库)后,我们会自动识别该帐户。
可能的解决方案
1- 使用 uuid 标识帐户。每个帐户都有一个 uuid 字段,用于命名该帐户将在 Sidekiq 中使用的队列。
优点:我们可以轻松地按帐户过滤队列,即使在监控中也是如此。 缺点:会产生很多队列,所以如果我们不控制对 Redis 服务器的轮询时间,我们可能会遇到性能问题。
2- 使用不同的数据库。通过按机器(应用程序)分离数据库,我们将解决帐户唯一性的问题。问题是 Redis 默认只接受 16 个 bbdd 并且将它们编号为 0 到 15。所以对这些数据库 id 进行非常精细的处理(手动?)。
3- 使用命名空间。被 Mike Perham http://mikeperham.com/2015/09/24/storing-data-with-redis/ 拒绝 命名空间可以作为每个机器或每个队列的分隔符。
我们非常感谢任何帮助。
提前致谢。
【问题讨论】:
-
你的选项 1 和选项 3 一样,只是你需要编写所有生成密钥的代码。
-
“只为那些只想从 SaaS 购买单个 Redis 数据库的爱好者考虑这一点” - 是你吗? :) 如果你想共享同一个服务器,你真的别无选择。
-
(披露:为 Redis Labs 工作)我雇主的 SaaS 报价基于 RAM 使用量的订阅,而不是数据库的数量。此外,与其他提供者不同,每个数据库都运行自己的 Redis 服务器,因此无需担心命名空间和/或块间问题。
-
如果您想自己运行,实现所需的最佳方法是在相同或不同的物理/虚拟硬件上为每个帐户启动一个 redis 服务器 - 取决于您的规模。
-
那么您找到解决方案了吗?愿意发布答案吗?
标签: ruby-on-rails redis sidekiq sidekiq-monitor