И така, едно нещо е, че според ЧЗВ „Форматът на съобщението Sidekiq е доста прост и стабилен :това е просто хеш във формат JSON." Наблягам на моя - не мисля, че изпращането на JSON до sidekiq е твърде крехко за правене. Особено когато искате фино зърнест контрол около кой екземпляр на Redis изпращате заданията, както в Ситуацията на OP, вероятно просто бих написал малка обвивка, която ще ми позволи да посоча екземпляр на Redis заедно с заданието, което е на опашка.
Що се отнася до по-общата ситуация на Кевин Бедел за кръгови задачи в екземпляри на Redis, предполагам, че не искате да имате контрола върху това кой екземпляр на Redis се използва - вие просто искате да поставите в опашка и дистрибуцията да се управлява автоматично. Изглежда, че само един човек е поискал това досега и те са измислили решение, което използва 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
Друго нещо, което трябва да имате предвид в стремежа си да получите висока наличност и отказ, е да получите Sidekiq Pro, който включва функции за надеждност:„Клиентът Sidekiq Pro може да издържи на преходни прекъсвания на Redis. Той ще постави в опашка задачи локално при грешка и ще се опита да предостави тези задачи след като връзката бъде възстановена." Тъй като sidekiq така или иначе е за фонови процеси, кратко закъснение, ако екземпляр на Redis изпадне, не би трябвало да повлияе на приложението ви. Ако един от двата ви екземпляра на Redis се повреди и използвате кръгов режим, все още сте загубили някои работни места, освен ако не използвате тази функция.