Donc une chose est que selon la FAQ, "Le format de message Sidekiq est assez simple et stable :c'est juste un hachage au format JSON." J'insiste sur moi - je ne pense pas que l'envoi de JSON à sidekiq soit trop fragile à faire. Surtout lorsque vous voulez un contrôle précis autour de l'instance Redis à laquelle vous envoyez les travaux, comme dans le Dans la situation d'OP, j'écrirais probablement un petit wrapper qui me permettrait d'indiquer une instance Redis avec le travail mis en file d'attente.
Pour la situation plus générale de Kevin Bedell concernant les tâches à tour de rôle dans les instances Redis, j'imagine que vous ne le faites pas vous voulez avoir le contrôle de l'instance Redis utilisée - vous voulez juste mettre en file d'attente et que la distribution soit gérée automatiquement. Il semble qu'une seule personne ait demandé cela jusqu'à présent, et ils ont trouvé une solution qui utilise 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
Une autre chose à considérer dans votre quête pour obtenir une haute disponibilité et un basculement est d'obtenir Sidekiq Pro qui inclut des fonctionnalités de fiabilité :"Le client Sidekiq Pro peut résister aux pannes transitoires de Redis. Il mettra les travaux en file d'attente localement en cas d'erreur et tentera de livrer ces travaux. une fois la connectivité rétablie." Étant donné que sidekiq est de toute façon destiné aux processus d'arrière-plan, un court délai si une instance Redis tombe en panne ne devrait pas affecter votre application. Si l'une de vos deux instances Redis tombe en panne et que vous utilisez la répétition alternée, vous avez quand même perdu des tâches, sauf si vous utilisez cette fonctionnalité.