Jedna rzecz jest taka, że zgodnie z FAQ:„Format wiadomości Sidekiq jest dość prosty i stabilny :to tylko Hash w formacie JSON”. Podkreślenie moje – nie sądzę, aby wysyłanie JSON do sidekiq było zbyt kruche. Zwłaszcza, gdy chcesz mieć szczegółową kontrolę, wokół której instancji Redis wysyłasz zadania, jak w W sytuacji OP prawdopodobnie po prostu napisałbym małe opakowanie, które pozwoliłoby mi wskazać instancję Redis wraz z zadaniem, które jest umieszczane w kolejce.
Jeśli chodzi o bardziej ogólną sytuację Kevina Bedella, polegającą na przerzucaniu zadań okrężnych do instancji Redis, wyobrażam sobie, że nie chcesz mieć kontrolę nad tym, która instancja Redis jest używana — po prostu chcesz umieścić w kolejce i automatycznie zarządzać dystrybucją. Wygląda na to, że do tej pory poprosiła o to tylko jedna osoba i wymyśliła rozwiązanie, które wykorzystuje 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
Inną rzeczą, którą należy wziąć pod uwagę w dążeniu do uzyskania wysokiej dostępności i przełączania awaryjnego, jest zakup Sidekiq Pro, który obejmuje funkcje niezawodności:„Klient Sidekiq Pro może wytrzymać przejściowe przestoje Redis. W przypadku błędu będzie umieszczał zadania w kolejce lokalnie i próbuje je dostarczyć po przywróceniu łączności”. Ponieważ sidekiq i tak obsługuje procesy w tle, krótkie opóźnienie w przypadku awarii instancji Redis nie powinno wpłynąć na twoją aplikację. Jeśli jedna z twoich dwóch instancji Redis ulegnie awarii i używasz metody okrężnej, nadal stracisz niektóre zadania, chyba że używasz tej funkcji.