Quantcast
Channel: Active questions tagged redis+ruby-on-rails - Stack Overflow
Viewing all articles
Browse latest Browse all 873

How can I switch redis host/pool in sidekiq?

$
0
0

I have multi-tenant rails application with apartment gem I can successfully switch database tenant in each worker using apartment-sidekiq. But sidekiq workers are using same redis server for all the tenant. I want to have complete isolation on redis as well. Is there a way in which I can use the separate redis host for each tenant without impact much code changes using sidekiq middeware.

Sample Tenant config

 TENANT_POOL = {  tenant_1: ConnectionPool.new { Redis.new(url: ENV['REDIS_URL1']) },  tenant_2: ConnectionPool.new { Redis.new(url: ENV['REDIS_URL2']) }   }

Eg. Worker

class SendMailWorker  include Sidekiq::Worker  def perform(args)    puts "In Worker Tenant: #{Apartment::Tenant.current}, #{Sidekiq.redis_pool.inspect}"  endend     

Client middleware

class MyMiddleware::Client::ChangeRedisPool  def call(worker_class, job, queue, redis_pool)    #Can I change redis pool/client here to execute job in separate redis     yield  endend

Server middleware

class MyMiddleware::Server::ChangeServerRedisPool  def call(worker, job, queue)    #Can I change redis pool/client here to execute job in separate redis     yield  endend

I know we can execute worker with specific connection pool like following, but this will end up changing code at every sidekiq worker invocation.

 Sidekiq::Client.via(TENANT_POOL[:tenant_1]) { SendMailWorker.perform_async("d") } # run on tenant 1 sidekiq Sidekiq::Client.via(TENANT_POOL[:tenant_2]) { SendMailWorker.perform_async("d") } # run on tenant 1 sidekiq

How we can achieve multi tenancy with sidekiq and separate redis?


Viewing all articles
Browse latest Browse all 873

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>