Entonces, una cosa es que, según las preguntas frecuentes, "el formato de mensaje de Sidekiq es bastante simple y estable :es solo un Hash en formato JSON". Énfasis mío:no creo que enviar JSON a sidekiq sea demasiado frágil. Especialmente cuando desea un control detallado sobre a qué instancia de Redis envía los trabajos, como en el En la situación de OP, probablemente escribiría un pequeño contenedor que me permitiría indicar una instancia de Redis junto con el trabajo que se está poniendo en cola.
Para la situación más general de Kevin Bedell de rotar trabajos en instancias de Redis, me imagino que no desea tener el control de qué instancia de Redis se usa; solo desea poner en cola y que la distribución se administre automáticamente. Parece que solo una persona ha solicitado esto hasta ahora y se le ocurrió una solución 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
Otra cosa a considerar en su búsqueda para obtener alta disponibilidad y conmutación por error es obtener Sidekiq Pro, que incluye funciones de confiabilidad:"El cliente Sidekiq Pro puede soportar interrupciones transitorias de Redis. Pondrá en cola los trabajos localmente en caso de error e intentará entregar esos trabajos. una vez que se restablezca la conectividad". Dado que sidekiq es para procesos en segundo plano de todos modos, una pequeña demora si una instancia de Redis deja de funcionar no debería afectar su aplicación. Si una de sus dos instancias de Redis deja de funcionar y está utilizando la operación por turnos, aún habrá perdido algunos trabajos a menos que esté utilizando esta función.