2013-02-07 69 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數據庫爲單獨的應用程序。如果需要,只需增加數據庫的數量。