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.