sql >> Database teknologi >  >> NoSQL >> Redis

Arbejde med to separate redis-instanser med sidekiq?

Så én ting er, at ifølge FAQ er "Sidekiq-meddelelsesformatet ret simpelt og stabilt :det er bare en Hash i JSON-format." Understregning min-- Jeg synes ikke, at det er for skørt at sende JSON til sidekiq. Især når du vil have finmasket kontrol omkring, hvilken Redis-instans du sender jobs til, som i OP's situation ville jeg nok bare skrive en lille indpakning, der ville lade mig indikere en Redis-instans sammen med jobbet, der sættes i kø.

For Kevin Bedells mere generelle situation med at runde-robin-job til Redis-instanser, kunne jeg forestille mig, at du ikke ønsker at have kontrol over, hvilken Redis-instans der bruges - du vil bare sætte i kø og få distributionen administreret automatisk. Det ser ud til, at kun én person har anmodet om dette indtil videre, og de kom med en løsning, der bruger 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 anden ting at overveje i din søgen efter at få høj tilgængelighed og fail-over er at få Sidekiq Pro, som inkluderer pålidelighedsfunktioner:"Sidekiq Pro-klienten kan modstå forbigående Redis-udfald. Den vil sætte jobs i kø lokalt ved fejl og forsøge at levere disse jobs. når forbindelsen er genoprettet." Da sidekiq alligevel er til baggrundsprocesser, bør en kort forsinkelse, hvis en Redis-instans går ned, ikke påvirke din ansøgning. Hvis en af ​​dine to Redis-forekomster går ned, og du bruger round robin, har du stadig mistet nogle job, medmindre du bruger denne funktion.



  1. Overvågning af Percona Server til MongoDB - Nøglemålinger

  2. Rediger og gentag MongoDB oplog

  3. Sporing af MongoDB-hukommelsesbrug

  4. Delvise indekser i mongodb / mongoose