sql >> Databáze >  >> NoSQL >> Redis

Pracovat se dvěma samostatnými instancemi redis s sidekiq?

Takže jedna věc je, že podle FAQ:„Formát zprávy Sidekiq je docela jednoduchý a stabilní :je to jen hash ve formátu JSON." Zdůrazňuji můj-- Nemyslím si, že odesílání JSON do sidekiq je příliš křehké na to, aby to bylo možné. Zvláště když chcete jemnou kontrolu, do které instance Redis posíláte úlohy, jako v V situaci OP bych pravděpodobně jen napsal malý obal, který by mi umožnil označit instanci Redis spolu s úlohou, která je zařazena do fronty.

Pokud jde o obecnější situaci Kevina Bedella, pokud jde o zasílání úloh do instancí Redis, předpokládám, že ne chcete mít kontrolu nad tím, která instance Redis se používá – chcete pouze zařadit do fronty a nechat distribuci spravovat automaticky. Zdá se, že to zatím požadoval pouze jeden člověk, který přišel s řešením, které využívá 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

Další věc, kterou je třeba zvážit při hledání vysoké dostupnosti a selhání, je získat Sidekiq Pro, který obsahuje funkce spolehlivosti:„Klient Sidekiq Pro vydrží přechodné výpadky Redis. Při chybě zařadí úlohy do fronty a pokusí se je dodat. jakmile bude připojení obnoveno." Vzhledem k tomu, že sidekiq je stejně pro procesy na pozadí, krátká prodleva, pokud dojde k výpadku instance Redis, by neměla ovlivnit vaši aplikaci. Pokud dojde k výpadku jedné z vašich dvou instancí Redis a vy používáte kruhový provoz, stále jste přišli o některé úlohy, pokud tuto funkci nepoužíváte.



  1. používá pro čas vytvoření Mongodb ObjectId

  2. Agregát Moongoose $match neodpovídá id

  3. Jak aktualizovat a upsert více dokumentů v MongoDB pomocí C# Drivers

  4. Ekvivalent $set MongoDb v ovladači java