Redis
 sql >> база данни >  >> NoSQL >> Redis

Работите с два отделни екземпляра на redis със sidekiq?

И така, едно нещо е, че според ЧЗВ „Форматът на съобщението Sidekiq е доста прост и стабилен :това е просто хеш във формат JSON." Наблягам на моя - не мисля, че изпращането на JSON до sidekiq е твърде крехко за правене. Особено когато искате фино зърнест контрол около кой екземпляр на Redis изпращате заданията, както в Ситуацията на OP, вероятно просто бих написал малка обвивка, която ще ми позволи да посоча екземпляр на Redis заедно с заданието, което е на опашка.

Що се отнася до по-общата ситуация на Кевин Бедел за кръгови задачи в екземпляри на Redis, предполагам, че не искате да имате контрола върху това кой екземпляр на Redis се използва - вие просто искате да поставите в опашка и дистрибуцията да се управлява автоматично. Изглежда, че само един човек е поискал това досега и те са измислили решение, което използва 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

Друго нещо, което трябва да имате предвид в стремежа си да получите висока наличност и отказ, е да получите Sidekiq Pro, който включва функции за надеждност:„Клиентът Sidekiq Pro може да издържи на преходни прекъсвания на Redis. Той ще постави в опашка задачи локално при грешка и ще се опита да предостави тези задачи след като връзката бъде възстановена." Тъй като sidekiq така или иначе е за фонови процеси, кратко закъснение, ако екземпляр на Redis изпадне, не би трябвало да повлияе на приложението ви. Ако един от двата ви екземпляра на Redis се повреди и използвате кръгов режим, все още сте загубили някои работни места, освен ако не използвате тази функция.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Memcache v/s redis за поддържане на постоянни сесии?

  2. Постоянни данни от Redis към MongoDB за съхранение на данни

  3. Въведение в Redis Cluster Sharding – предимства, ограничения, внедряване и клиентски връзки

  4. Как да мащабирате SignalR с помощта на Azure Worker Role и OWIN

  5. Redis съхранява списък в хеш