Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Trabalhar com duas instâncias redis separadas com sidekiq?


Então, uma coisa é que, de acordo com o FAQ, "O formato de mensagem do Sidekiq é bastante simples e estável :é apenas um Hash no formato JSON." Ênfase minha - não acho que enviar JSON para sidekiq seja muito difícil de fazer. Especialmente quando você deseja um controle refinado em torno de qual instância do Redis você envia os trabalhos, como no Na situação do OP, eu provavelmente escreveria um pequeno wrapper que me permitiria indicar uma instância do Redis junto com o trabalho que está sendo enfileirado.

Para a situação mais geral de Kevin Bedell de fazer rodízio de trabalhos em instâncias do Redis, imagino que você não deseja ter o controle de qual instância do Redis é usada - você só quer enfileirar e fazer com que a distribuição seja gerenciada automaticamente. Parece que apenas uma pessoa solicitou isso até agora, e eles criaram uma solução que usa 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

Outra coisa a considerar em sua busca para obter alta disponibilidade e failover é obter o Sidekiq Pro, que inclui recursos de confiabilidade:"O cliente Sidekiq Pro pode suportar interrupções transitórias do Redis. Ele enfileirará os trabalhos localmente em caso de erro e tentará entregá-los assim que a conectividade for restaurada." Como o sidekiq é para processos em segundo plano, um pequeno atraso se uma instância do Redis ficar inativa não deve afetar seu aplicativo. Se uma de suas duas instâncias do Redis ficar inativa e você estiver usando round robin, você ainda terá perdido alguns trabalhos, a menos que esteja usando esse recurso.