设想:
我们有几个使用 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/ 命名空间可以作为每台机器或每个队列的分隔符。
我们非常感谢任何帮助。
提前致谢。