【问题标题】:Several Multitenant Rails Apps using the same Redis server使用同一个 Redis 服务器的多个多租户 Rails 应用程序
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    127.0.0.1:6370> config get databases
    

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

    【讨论】:

    • 65536 只是一个随机数。最大值介于 2147m 和 214m 之间。但是在 214m 它尝试在空数据库上分配 12gb 的内存(并且在我的机器上失败了 8)。因此,如果您需要非常高的数量,请检查性能和内存配置文件是否符合您的需求。
    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2014-07-03
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多