2013-02-07 125 views
4

我试图在旅客/ Rails生产环境中设置Redis + Sidekiq并且遇到了一些混淆。在生产中配置Redis + Sidekiq

服务器上运行着许多小应用程序。我确定这些应用程序中有不止一个会利用Sidekiq提供的延迟处理。

我的第一个想法是使用namespace option in Sidekiq为每个Rails应用程序创建一个namespace

但后来我注意到一个databases 16设置在redis.conf,我想知道那是什么,确切地说。我似乎无法找到比在config评论其他它文件:

# Set the number of databases. The default database is DB 0, you can select 
# a different one on a per-connection basis using SELECT <dbid> where 
# dbid is a number between 0 and 'databases'-1 
databases 16 

所以,不知道的16“数据库”的缺省/例如意味着我可以使用DB0为一个应用程序,并为DB1另一个应用程序?!?我不认为这个假设是正确的,但我不能找到更多的信息以外的其他:

Redis的群集不支持多个数据库,如独立 版本的Redis,还有就是数据库0,和SELECT不允许。

希望有人能就如何在同一服务器上运行的各种Rails应用程序之间共享Sidekiq & Redis的告诉我。

回答

2

我想你正在寻找命名空间。您可以使用sidekiq配置服务器/客户端配置以使用不同的命名空间,并配置Passenger/Unicorn以使用不同的命名空间。我已经与独角兽一起完成了这项工作,但在Passenger中应该有相应的选项。

你可以找到有关如何做到这一点的文档here

+0

请原谅我的无知,但为什么乘客/独角兽会被卷入? (FWIW - 我的生产环境使用Passenger) – Meltemi

+0

如果您查看我链接的文档,您需要将一个块添加到Unicorn中的after_fork回调中。我不知道是否有相当于Passenger的存在。 –

5

您可以使用多个Redis数据库;每一个都与单个机器上的Rails应用程序相关联。你可以把一个文件sidekiq.rb在初始化,用下面的代码:

app_name = Rails.application.class.parent_name 

app_num = case app_name 
    when 'AppOne' 
    0 
    when 'AppTwo' 
    1 
    when 'AppOne' 
    2 
    end 

Redis.new(db: app_num) # existing DB is selected if already present 

Sidekiq.configure_server do |config| 
    config.redis = { url: "redis://localhost:6379/#{app_num}", namespace: "#{app_name}" } 
end 

Sidekiq.configure_client do |config| 
    config.redis = { url: "redis://localhost:6379/#{app_num}", namespace: "#{app_name}" } 
end 

这样,你被Sidekiq工艺分离出Redis的数据块以及命名空间。

+0

这很棒,但是从环境中获取“app_num”可能会更好。即'app_num = ENV ['REDIS_DB_NUM'] || 0' – asgeo1

0

redis.conf中的数据库16仅设置Redis实例具有的最大数据库数(0-15)。如果你愿意,你可以改变它。我使用Redis DB0进行Rails缓存,DB1使用Sidekiq(除了使用命名空间)。只是使它更清洁,以防我需要FLUSHDB。

在你的情况下,我会使用单独的Redis数据库为单独的应用程序。如果需要,只需增加数据库的数量。