sql >> Base de Datos >  >> NoSQL >> Redis

¿Trabajar con dos instancias redis separadas con sidekiq?

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.