Dus één ding is dat Volgens de veelgestelde vragen:"Het Sidekiq-berichtformaat is vrij eenvoudig en stabiel :het is gewoon een hash in JSON-indeling. "Ik leg de nadruk op:ik denk niet dat het te broos is om JSON naar sidekiq te sturen. Vooral als je fijnmazige controle wilt over naar welke Redis-instantie je de taken verzendt, zoals in de OP's situatie, zou ik waarschijnlijk gewoon een kleine wrapper schrijven waarmee ik een Redis-instantie zou kunnen aangeven, samen met de taak die in de wachtrij wordt geplaatst.
Voor de meer algemene situatie van Kevin Bedell om banen in Redis-instanties te plaatsen, kan ik me voorstellen dat u dit niet doet. u wilt de controle hebben over welke Redis-instantie wordt gebruikt - u wilt gewoon in de wachtrij plaatsen en de distributie automatisch laten beheren. Het lijkt erop dat tot nu toe slechts één persoon hierom heeft gevraagd, en ze kwamen met een oplossing die gebruikmaakt van 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
Een ander ding om te overwegen in uw zoektocht naar hoge beschikbaarheid en fail-over is om Sidekiq Pro te krijgen met betrouwbaarheidsfuncties:"De Sidekiq Pro-client is bestand tegen tijdelijke Redis-storingen. Het zal taken lokaal in de wachtrij plaatsen bij een fout en proberen die taken af te leveren zodra de verbinding is hersteld." Aangezien sidekiq sowieso voor achtergrondprocessen is, zou een korte vertraging als een Redis-instantie uitvalt, geen invloed moeten hebben op uw toepassing. Als een van uw twee Redis-instanties uitvalt en u round robin gebruikt, bent u nog steeds enkele banen kwijt, tenzij u deze functie gebruikt.