Então, uma coisa é que, de acordo com o FAQ, "O formato de mensagem do Sidekiq é bastante simples e estável :é apenas um Hash no formato JSON." Ênfase minha - não acho que enviar JSON para sidekiq seja muito difícil de fazer. Especialmente quando você deseja um controle refinado em torno de qual instância do Redis você envia os trabalhos, como no Na situação do OP, eu provavelmente escreveria um pequeno wrapper que me permitiria indicar uma instância do Redis junto com o trabalho que está sendo enfileirado.
Para a situação mais geral de Kevin Bedell de fazer rodízio de trabalhos em instâncias do Redis, imagino que você não deseja ter o controle de qual instância do Redis é usada - você só quer enfileirar e fazer com que a distribuição seja gerenciada automaticamente. Parece que apenas uma pessoa solicitou isso até agora, e eles criaram uma solução que usa
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
Outra coisa a considerar em sua busca para obter alta disponibilidade e failover é obter o Sidekiq Pro, que inclui recursos de confiabilidade:"O cliente Sidekiq Pro pode suportar interrupções transitórias do Redis. Ele enfileirará os trabalhos localmente em caso de erro e tentará entregá-los assim que a conectividade for restaurada." Como o sidekiq é para processos em segundo plano, um pequeno atraso se uma instância do Redis ficar inativa não deve afetar seu aplicativo. Se uma de suas duas instâncias do Redis ficar inativa e você estiver usando round robin, você ainda terá perdido alguns trabalhos, a menos que esteja usando esse recurso.