sql >> Database >  >> NoSQL >> Redis

Werken met twee afzonderlijke redis-instanties met sidekiq?

Dus één ding is dat Volgens de veelgestelde vragen:"Het Sidekiq-berichtformaat is vrij eenvoudig en stabiel :het is gewoon een hash in JSON-indeling. "Ik leg de nadruk op:ik denk niet dat het te broos is om JSON naar sidekiq te sturen. Vooral als je fijnmazige controle wilt over naar welke Redis-instantie je de taken verzendt, zoals in de OP's situatie, zou ik waarschijnlijk gewoon een kleine wrapper schrijven waarmee ik een Redis-instantie zou kunnen aangeven, samen met de taak die in de wachtrij wordt geplaatst.

Voor de meer algemene situatie van Kevin Bedell om banen in Redis-instanties te plaatsen, kan ik me voorstellen dat u dit niet doet. u wilt de controle hebben over welke Redis-instantie wordt gebruikt - u wilt gewoon in de wachtrij plaatsen en de distributie automatisch laten beheren. Het lijkt erop dat tot nu toe slechts één persoon hierom heeft gevraagd, en ze kwamen met een oplossing die gebruikmaakt van 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

Een ander ding om te overwegen in uw zoektocht naar hoge beschikbaarheid en fail-over is om Sidekiq Pro te krijgen met betrouwbaarheidsfuncties:"De Sidekiq Pro-client is bestand tegen tijdelijke Redis-storingen. Het zal taken lokaal in de wachtrij plaatsen bij een fout en proberen die taken af ​​te leveren zodra de verbinding is hersteld." Aangezien sidekiq sowieso voor achtergrondprocessen is, zou een korte vertraging als een Redis-instantie uitvalt, geen invloed moeten hebben op uw toepassing. Als een van uw twee Redis-instanties uitvalt en u round robin gebruikt, bent u nog steeds enkele banen kwijt, tenzij u deze functie gebruikt.



  1. Java+Redis versus gewone Java-efficiëntie voor data-intensieve toepassingen?

  2. Gegevens lezen van Redis naar Flink

  3. Mongodb Waarde verhogen binnen geneste array

  4. Loop door alle Mongo-verzamelingen en voer de query uit