Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Pracujesz z dwoma oddzielnymi instancjami redis z sidekiq?

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Używanie selera do synchronicznych zapytań w zewnętrznym interfejsie API w czasie rzeczywistym za pomocą Gevent

  2. Zmiana portu Redis w Docker Compose nie działa

  3. Jak można wykorzystać listy Redis do wdrożenia systemu czatu?

  4. Jak przechowywać i pobierać słownik za pomocą redis

  5. Jak przekonwertować istniejącą relacyjną bazę danych na magazyn klucz-wartość?