sql >> Databasteknik >  >> NoSQL >> Redis

Arbeta med två separata redis-instanser med sidekiq?

Så en sak är att enligt FAQ, "Sidekiq-meddelandeformatet är ganska enkelt och stabilt :det är bara en Hash i JSON-format." Betoning min-- Jag tycker inte att det är för skört att skicka JSON till sidekiq. Speciellt när du vill ha finkornig kontroll kring vilken Redis-instans du skickar jobben till, som i OP:s situation, jag skulle förmodligen bara skriva ett litet omslag som skulle låta mig indikera en Redis-instans tillsammans med jobbet som står i kö.

För Kevin Bedells mer allmänna situation att round-robin jobb till Redis-instanser, skulle jag föreställa mig att du inte vill ha kontroll över vilken Redis-instans som används - du vill bara ställa i kö och få distributionen att hanteras automatiskt. Det verkar som bara en person har begärt detta hittills, och de kom på en lösning som använder 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 annan sak att tänka på i din strävan att få hög tillgänglighet och fail-over är att skaffa Sidekiq Pro som inkluderar tillförlitlighetsfunktioner:"Sidekiq Pro-klienten kan motstå tillfälliga Redis-avbrott. Den kommer att köa jobb lokalt vid fel och försöka leverera dessa jobb när anslutningen är återställd." Eftersom sidekiq ändå är för bakgrundsprocesser bör en kort fördröjning om en Redis-instans går ner inte påverka din ansökan. Om en av dina två Redis-instanser går ner och du använder round robin, har du fortfarande förlorat några jobb om du inte använder den här funktionen.



  1. Node mongoose hitta fråga i loop fungerar inte

  2. pymongo:namnet 'ISODate' är inte definierat

  3. MongoDbs $set-motsvarighet i dess java-drivrutin

  4. mongodb, repliker och fel:{ $err :inte master och slaveOk=false, kod :13435 }