Module: SidekiqAlive

Defined in:
lib/sidekiq_alive.rb,
lib/sidekiq_alive/redis.rb,
lib/sidekiq_alive/config.rb,
lib/sidekiq_alive/server.rb,
lib/sidekiq_alive/worker.rb,
lib/sidekiq_alive/helpers.rb,
lib/sidekiq_alive/version.rb,
lib/sidekiq_alive/redis/base.rb,
lib/sidekiq_alive/redis/redis_gem.rb,
lib/sidekiq_alive/redis/redis_client_gem.rb

Defined Under Namespace

Modules: Helpers, Redis Classes: Config, Server, Worker

Constant Summary collapse

HOSTNAME_REGISTRY =
"sidekiq-alive-hostnames"
CAPSULE_NAME =
"sidekiq-alive"
VERSION =
"2.3.0"

Class Method Summary collapse

Class Method Details

.alive?Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/sidekiq_alive.rb', line 108

def alive?
  redis.ttl(current_lifeness_key) != -2
end

.configObject



122
123
124
# File 'lib/sidekiq_alive.rb', line 122

def config
  @config ||= SidekiqAlive::Config.instance
end

.current_instance_register_keyObject



92
93
94
# File 'lib/sidekiq_alive.rb', line 92

def current_instance_register_key
  "#{config.registered_instance_key}::#{hostname}"
end

.current_instance_registered?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'lib/sidekiq_alive.rb', line 96

def current_instance_registered?
  redis.get(current_instance_register_key)
end

.current_lifeness_keyObject



126
127
128
# File 'lib/sidekiq_alive.rb', line 126

def current_lifeness_key
  "#{config.liveness_key}::#{hostname}"
end

.current_queueObject



57
58
59
# File 'lib/sidekiq_alive.rb', line 57

def current_queue
  "#{config.queue_prefix}-#{hostname}"
end

.expire_old_keysObject



157
158
159
160
161
162
# File 'lib/sidekiq_alive.rb', line 157

def expire_old_keys
  # we get every key that should be expired by now
  keys_to_expire = redis.zrangebyscore(HOSTNAME_REGISTRY, 0, Time.now.to_i)
  # then we remove it
  keys_to_expire.each { |key| redis.zrem(HOSTNAME_REGISTRY, key) }
end

.hostnameObject



130
131
132
# File 'lib/sidekiq_alive.rb', line 130

def hostname
  ENV["HOSTNAME"] || "HOSTNAME_NOT_SET"
end

.loggerObject



118
119
120
# File 'lib/sidekiq_alive.rb', line 118

def logger
  config.logger || Sidekiq.logger
end

.purge_pending_jobsObject



78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/sidekiq_alive.rb', line 78

def purge_pending_jobs
  schedule_set = Sidekiq::ScheduledSet.new
  jobs = if Helpers.sidekiq_5
    schedule_set.select { |job| job.klass == "SidekiqAlive::Worker" && job.queue == current_queue }
  else
    schedule_set.scan('"class":"SidekiqAlive::Worker"').select { |job| job.queue == current_queue }
  end
  logger.info("[SidekiqAlive] Purging #{jobs.count} pending for #{hostname}")
  jobs.each(&:delete)

  logger.info("[SidekiqAlive] Removing queue #{current_queue}")
  Sidekiq::Queue.new(current_queue).clear
end

.redisObject



104
105
106
# File 'lib/sidekiq_alive.rb', line 104

def redis
  @redis ||= Redis.adapter
end

.register_current_instanceObject



61
62
63
# File 'lib/sidekiq_alive.rb', line 61

def register_current_instance
  register_instance(current_instance_register_key)
end

.register_instance(instance_name) ⇒ Object



164
165
166
167
168
# File 'lib/sidekiq_alive.rb', line 164

def register_instance(instance_name)
  expiration = Time.now.to_i + config.registration_ttl.to_i
  redis.zadd(HOSTNAME_REGISTRY, expiration, instance_name)
  expire_old_keys
end

.registered_instancesObject



72
73
74
75
76
# File 'lib/sidekiq_alive.rb', line 72

def registered_instances
  # before we return we make sure we expire old keys
  expire_old_keys
  redis.zrange(HOSTNAME_REGISTRY, 0, -1)
end

.setup {|config| ... } ⇒ Object

CONFIG —————————————

Yields:



114
115
116
# File 'lib/sidekiq_alive.rb', line 114

def setup
  yield(config)
end

.shutdown_infoObject



134
135
136
# File 'lib/sidekiq_alive.rb', line 134

def shutdown_info
  "Shutting down sidekiq-alive!"
end

.startObject



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/sidekiq_alive.rb', line 16

def start
  Sidekiq.configure_server do |sq_config|
    sq_config.on(:startup) do
      SidekiqAlive::Worker.sidekiq_options(queue: current_queue)

      if Helpers.sidekiq_7
        sq_config.capsule(CAPSULE_NAME) do |cap|
          cap.concurrency = 2
          cap.queues = [current_queue]
        end
      else
        (sq_config.respond_to?(:[]) ? sq_config[:queues] : sq_config.options[:queues]).unshift(current_queue)
      end

      logger.info(startup_info)

      register_current_instance

      store_alive_key
      # Passing the hostname argument it's only for debugging enqueued jobs
      SidekiqAlive::Worker.perform_async(hostname)
      @server_pid = fork { SidekiqAlive::Server.run! }

      logger.info(successful_startup_text)
    end

    sq_config.on(:quiet) do
      unregister_current_instance
      config.shutdown_callback.call
    end

    sq_config.on(:shutdown) do
      Process.kill("TERM", @server_pid) unless @server_pid.nil?
      Process.wait(@server_pid) unless @server_pid.nil?

      unregister_current_instance
      config.shutdown_callback.call
    end
  end
end

.startup_infoObject



138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/sidekiq_alive.rb', line 138

def startup_info
  info = {
    hostname: hostname,
    port: config.port,
    ttl: config.time_to_live,
    queue: current_queue,
    register_set: HOSTNAME_REGISTRY,
    liveness_key: current_lifeness_key,
    register_key: current_instance_register_key,
  }

  "Starting sidekiq-alive: #{info}"
end

.store_alive_keyObject



100
101
102
# File 'lib/sidekiq_alive.rb', line 100

def store_alive_key
  redis.set(current_lifeness_key, time: Time.now.to_i, ex: config.time_to_live.to_i)
end

.successful_startup_textObject



152
153
154
155
# File 'lib/sidekiq_alive.rb', line 152

def successful_startup_text
  "Successfully started sidekiq-alive, registered with key: "\
    "#{current_instance_register_key} on set #{HOSTNAME_REGISTRY}"
end

.unregister_current_instanceObject



65
66
67
68
69
70
# File 'lib/sidekiq_alive.rb', line 65

def unregister_current_instance
  # Delete any pending jobs for this instance
  logger.info(shutdown_info)
  purge_pending_jobs
  redis.zrem(HOSTNAME_REGISTRY, current_instance_register_key)
end