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

Lavora con due istanze redis separate con sidekiq?

Quindi una cosa è che Secondo le FAQ, "Il formato del messaggio di Sidekiq è abbastanza semplice e stabile :è solo un hash in formato JSON." Enfasi mia:non penso che inviare JSON a sidekiq sia troppo fragile da fare. Soprattutto quando si desidera un controllo dettagliato su quale istanza Redis si inviano i lavori, come nel Nella situazione di OP, probabilmente scriverei solo un piccolo wrapper che mi permetta di indicare un'istanza Redis insieme al lavoro in coda.

Per la situazione più generale di Kevin Bedell per il round robin di lavori nelle istanze Redis, immagino che tu non vuoi avere il controllo di quale istanza Redis viene utilizzata:vuoi solo accodare e fare in modo che la distribuzione sia gestita automaticamente. Sembra che solo una persona lo abbia richiesto finora e abbia trovato una soluzione che utilizza 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

Un'altra cosa da considerare nella tua ricerca per ottenere alta disponibilità e failover è quella di ottenere Sidekiq Pro che include funzionalità di affidabilità:"Il client Sidekiq Pro può resistere a interruzioni Redis transitorie. Metterà in coda i lavori in locale in caso di errore e tenterà di fornire quei lavori una volta ripristinata la connettività." Poiché sidekiq è comunque per i processi in background, un breve ritardo se un'istanza Redis si interrompe non dovrebbe influire sulla tua applicazione. Se una delle tue due istanze Redis si interrompe e stai utilizzando round robin, hai comunque perso alcuni lavori a meno che tu non stia utilizzando questa funzione.