gpt4 book ai didi

ruby-on-rails - rails : Namespace redis on a per-request basis for a multi-tenency app

转载 作者:可可西里 更新时间:2023-11-01 11:18:34 25 4
gpt4 key购买 nike

考虑一个 multi-tenancy rails应用。我如何在每个请求的基础上命名空间我的 redis 连接,以便每个租户都生活在自己的命名空间中?

Multi-Tenancy

对于 Multi-Tenancy ,我使用 apartment gem .通过读取 request.host 来确定每个请求的租户。

# config/initializers/apartment.rb
#
Rails.application.config.middleware.use 'Apartment::Elevators::Generic', lambda { |request|
Tenant.find_identifier_by_host(request.host)
}

Redis

Redis用于 sidekiq , redis-analytics最重要的是,rails 缓存使用 redis-rails .

# config/initializers/cache.rb
# http://stackoverflow.com/a/38619281/2066546
#
Rails.application.config.cache_store = :redis_store, {
host: ENV['REDIS_HOST'],
port: '6379',
expires_in: 1.week,
namespace: "#{::STAGE}_cache",
timeout: 15.0
}
Rails.cache = ActiveSupport::Cache.lookup_store(Rails.application.config.cache_store)

# config/initializers/redis_analytics.rb
#
RedisAnalytics.configure do |configuration|
configuration.redis_connection = Redis.new(host: ENV['REDIS_HOST'], port: '6379')
configuration.redis_namespace = "#{::STAGE}_redis_analytics"
end

# config/initializers/sidekiq.rb
#
Sidekiq.configure_server do |config|
config.redis = {host: ENV['REDIS_HOST'], port: '6379', namespace: "#{::STAGE}_sidekiq", timeout: 15.0 }
end
Sidekiq.configure_client do |config|
config.redis = {host: ENV['REDIS_HOST'], port: '6379', namespace: "#{::STAGE}_sidekiq", timeout: 15.0 }
end

非常感谢您提出任何建议!

最佳答案

在尝试 Multi-Tenancy 时,使用命名空间是隔离 Redis 的一种糟糕方式。内幕消息:实例只有一个密码。 Redis 中没有用户的概念。

没有什么可以阻止用户 A 发出 flushall 并清除每个“租户”的每一位数据。什么都没有。也没有任何东西阻止用户 B 发出选择命令来获取其他租户的数据。

Redis 是单线程的。如果客户 C 发出 sleep 命令,它会为所有人阻止服务器。在具有大量键的数据库上执行键命令将导致整个服务器被阻塞,直到它完成。

Redis 不是为 Multi-Tenancy 使用而设计的。试图将其硬塞进一个会导致问题。如果您确实需要 Multi-Tenancy 使用,请使用其他东西或为每个租户运行单独的实例。

关于ruby-on-rails - rails : Namespace redis on a per-request basis for a multi-tenency app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40638628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com