Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Mit Sidekiq mit zwei separaten Redis-Instanzen arbeiten?

Eine Sache ist also, dass laut FAQ "das Sidekiq-Nachrichtenformat ziemlich einfach und stabil ist :es ist nur ein Hash im JSON-Format." Hervorhebung von mir -- Ich denke nicht, dass das Senden von JSON an Sidekiq zu spröde ist. Besonders wenn Sie eine feinkörnige Kontrolle darüber haben möchten, an welche Redis-Instanz Sie die Jobs senden, wie in der In der Situation von OP würde ich wahrscheinlich nur einen kleinen Wrapper schreiben, mit dem ich eine Redis-Instanz zusammen mit dem in die Warteschlange eingereihten Job angeben könnte.

Für Kevin Bedells allgemeinere Situation zum Round-Robin-Jobs in Redis-Instanzen würde ich mir vorstellen, dass Sie nicht die Kontrolle darüber haben möchten, welche Redis-Instanz verwendet wird – Sie möchten einfach nur in die Warteschlange gestellt werden und die Verteilung automatisch verwalten lassen. Es sieht so aus, als hätte bisher nur eine Person dies angefordert und eine Lösung gefunden, die Redis::Distributed verwendet :

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

Eine andere Sache, die Sie bei Ihrem Streben nach Hochverfügbarkeit und Failover berücksichtigen sollten, ist Sidekiq Pro, das Zuverlässigkeitsfunktionen enthält:„Der Sidekiq Pro-Client kann vorübergehenden Redis-Ausfällen standhalten. Er wird Jobs lokal in die Warteschlange einreihen, wenn ein Fehler auftritt, und versuchen, diese Jobs zu liefern sobald die Verbindung wiederhergestellt ist." Da sidekiq sowieso für Hintergrundprozesse gedacht ist, sollte eine kurze Verzögerung beim Ausfall einer Redis-Instanz Ihre Anwendung nicht beeinträchtigen. Wenn eine Ihrer beiden Redis-Instanzen ausfällt und Sie Round-Robin verwenden, gehen Ihnen dennoch einige Jobs verloren, es sei denn, Sie verwenden diese Funktion.