Så en sak är att enligt FAQ, "Sidekiq-meddelandeformatet är ganska enkelt och stabilt :det är bara en Hash i JSON-format." Betoning min-- Jag tycker inte att det är för skört att skicka JSON till sidekiq. Speciellt när du vill ha finkornig kontroll kring vilken Redis-instans du skickar jobben till, som i OP:s situation, jag skulle förmodligen bara skriva ett litet omslag som skulle låta mig indikera en Redis-instans tillsammans med jobbet som står i kö.
För Kevin Bedells mer allmänna situation att round-robin jobb till Redis-instanser, skulle jag föreställa mig att du inte vill ha kontroll över vilken Redis-instans som används - du vill bara ställa i kö och få distributionen att hanteras automatiskt. Det verkar som bara en person har begärt detta hittills, och de kom på en lösning som använder Redis::Distributed
:
datastore_config = YAML.load(ERB.new(File.read(File.join(Rails.root, "config", "redis.yml"))).result)
datastore_config = datastore_config["defaults"].merge(datastore_config[::Rails.env])
if datastore_config[:host].is_a?(Array)
if datastore_config[:host].length == 1
datastore_config[:host] = datastore_config[:host].first
else
datastore_config = datastore_config[:host].map do |host|
host_has_port = host =~ /:\d+\z/
if host_has_port
"redis://#{host}/#{datastore_config[:db] || 0}"
else
"redis://#{host}:#{datastore_config[:port] || 6379}/#{datastore_config[:db] || 0}"
end
end
end
end
Sidekiq.configure_server do |config|
config.redis = ::ConnectionPool.new(:size => Sidekiq.options[:concurrency] + 2, :timeout => 2) do
redis = if datastore_config.is_a? Array
Redis::Distributed.new(datastore_config)
else
Redis.new(datastore_config)
end
Redis::Namespace.new('resque', :redis => redis)
end
end
En annan sak att tänka på i din strävan att få hög tillgänglighet och fail-over är att skaffa Sidekiq Pro som inkluderar tillförlitlighetsfunktioner:"Sidekiq Pro-klienten kan motstå tillfälliga Redis-avbrott. Den kommer att köa jobb lokalt vid fel och försöka leverera dessa jobb när anslutningen är återställd." Eftersom sidekiq ändå är för bakgrundsprocesser bör en kort fördröjning om en Redis-instans går ner inte påverka din ansökan. Om en av dina två Redis-instanser går ner och du använder round robin, har du fortfarande förlorat några jobb om du inte använder den här funktionen.