deliveroo/routemaster

View on GitHub
bin/worker

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby

require_relative '../config/bootstrap.rb'
require 'routemaster/models/counters'
require 'routemaster/services/thread_group'
require 'routemaster/services/worker'
require 'routemaster/services/ticker'
require 'routemaster/services/scheduler'
require 'routemaster/mixins/log'

include Routemaster::Mixins::Log

Routemaster.configure(
  redis_pool_size: Integer(ENV.fetch('ROUTEMASTER_WORKER_THREADS')) + 2,
  process_type:    'worker',
)


_log.info { 'creating thread group' }
Routemaster::Services::ThreadGroup.new.tap do |group|
  # job promoter
  group.add Routemaster::Services::Scheduler.new, name: 'scheduler'

  # ticker threads
  group.add Routemaster::Services::Ticker.new(
    queue: Routemaster.aux_queue, name: 'autodrop', every: 10_000
  ), name: 'ticker.autodrop'
  group.add Routemaster::Services::Ticker.new(
    queue: Routemaster.aux_queue, name: 'monitor', every: ENV.fetch('ROUTEMASTER_MONITOR_INTERVAL').to_i * 1_000
  ), name: 'ticker.monitor'
  group.add Routemaster::Services::Ticker.new(
    queue: Routemaster.aux_queue, name: 'scrub_queues', every: 60_000
  ), name: 'ticker.scrub_queues'
  group.add Routemaster::Services::Ticker.new(
    queue: Routemaster.aux_queue, name: 'scrub_workers', every: 120_000
  ), name: 'ticker.scrub_workers'

  # aux worker thread
  group.add Routemaster::Services::Worker.new(
    queue: Routemaster.aux_queue
  ), name: "worker.aux"

  # main worker threads
  Integer(ENV.fetch('ROUTEMASTER_WORKER_THREADS')).times do |idx|
    group.add Routemaster::Services::Worker.new(
      queue: Routemaster.batch_queue
    ), name: "worker.main.#{idx + 1}"
  end

  _log.info { 'trapping signals for clean exit' }
  %w(INT TERM QUIT).each do |signal|
    Kernel.trap(signal) { Thread.new { group.stop } }
  end

  _log.info { 'job worker: started' }
  group.wait
end


Routemaster.teardown
_log.info { 'job worker: completed' }
Kernel.exit(0)