Jadi satu hal adalah Menurut FAQ, "Format pesan Sidekiq cukup sederhana dan stabil :itu hanya Hash dalam format JSON." Penekanan milik saya-- Saya tidak berpikir mengirim JSON ke sidekiq terlalu rapuh untuk dilakukan. Terutama ketika Anda ingin kontrol halus di sekitar instance Redis tempat Anda mengirim pekerjaan, seperti pada Dalam situasi OP, saya mungkin hanya akan menulis pembungkus kecil yang memungkinkan saya menunjukkan instance Redis bersama dengan pekerjaan yang sedang diantrekan.
Untuk situasi Kevin Bedell yang lebih umum untuk pekerjaan round-robin ke dalam instance Redis, saya rasa Anda tidak ingin mengontrol instance Redis mana yang digunakan-- Anda hanya ingin mengantrekan dan distribusi dikelola secara otomatis. Sepertinya hanya satu orang yang meminta ini sejauh ini, dan mereka menemukan solusi yang menggunakan 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
Hal lain yang perlu dipertimbangkan dalam pencarian Anda untuk mendapatkan ketersediaan tinggi dan fail-over adalah untuk mendapatkan Sidekiq Pro yang mencakup fitur keandalan:"Klien Sidekiq Pro dapat menahan pemadaman Redis sementara. Ini akan mengantrekan pekerjaan secara lokal jika terjadi kesalahan dan berusaha untuk memberikan pekerjaan itu setelah konektivitas dipulihkan." Karena sidekiq adalah untuk proses latar belakang, penundaan singkat jika instance Redis turun tidak akan memengaruhi aplikasi Anda. Jika salah satu dari dua instans Redis Anda down dan Anda menggunakan round robin, Anda masih kehilangan beberapa pekerjaan kecuali Anda menggunakan fitur ini.