1

设想:

我们有几个使用 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/ 命名空间可以作为每台机器或每个队列的分隔符。

我们非常感谢任何帮助。

提前致谢。

4

2 回答 2

0

问题是 Redis 默认只接受 16 bbdd 并且它从 0 到 15 编号它们。所以这将是非常微妙的处理(手动?)这些数据库 id。

那么,为什么要使用默认值呢?databases在 conf 文件中为属性设置适当的值

127.0.0.1:6370> config get databases

1)“数据库”
2)“65536”

于 2018-07-30T11:21:36.773 回答
0

最后,我们同时使用第一和第二选择。我们只使用一个带有 uid 的 Redis 服务器用于队列和不同的数据库,以确保作业不会被错误的机器占用。

于 2018-11-27T08:05:07.827 回答