Quindi una cosa è che Secondo le FAQ, "Il formato del messaggio di Sidekiq è abbastanza semplice e stabile :è solo un hash in formato JSON." Enfasi mia:non penso che inviare JSON a sidekiq sia troppo fragile da fare. Soprattutto quando si desidera un controllo dettagliato su quale istanza Redis si inviano i lavori, come nel Nella situazione di OP, probabilmente scriverei solo un piccolo wrapper che mi permetta di indicare un'istanza Redis insieme al lavoro in coda.
Per la situazione più generale di Kevin Bedell per il round robin di lavori nelle istanze Redis, immagino che tu non vuoi avere il controllo di quale istanza Redis viene utilizzata:vuoi solo accodare e fare in modo che la distribuzione sia gestita automaticamente. Sembra che solo una persona lo abbia richiesto finora e abbia trovato una soluzione che utilizza 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
Un'altra cosa da considerare nella tua ricerca per ottenere alta disponibilità e failover è quella di ottenere Sidekiq Pro che include funzionalità di affidabilità:"Il client Sidekiq Pro può resistere a interruzioni Redis transitorie. Metterà in coda i lavori in locale in caso di errore e tenterà di fornire quei lavori una volta ripristinata la connettività." Poiché sidekiq è comunque per i processi in background, un breve ritardo se un'istanza Redis si interrompe non dovrebbe influire sulla tua applicazione. Se una delle tue due istanze Redis si interrompe e stai utilizzando round robin, hai comunque perso alcuni lavori a meno che tu non stia utilizzando questa funzione.