Class: Wurk::Limiter::ServerMiddleware

Inherits:
Object
  • Object
show all
Includes:
Middleware::ServerMiddleware
Defined in:
lib/wurk/limiter/server_middleware.rb

Overview

Catches OverLimit (and any class registered in Limiter.config.errors), bumps job['overrated'], and decides what to do next:

* reschedule disabled (`reschedule: 0`) → re-raise so the normal
retry/dead pipeline handles it (spec §1.2/§1.4 behaviour).
* still under the cap → reschedule onto the same queue at
`Time.now + backoff` via `Client.push`, then raise `Rescheduled` so
the outcome is neither success nor failure (batch onion skips acks).
* cap reached (`overrated >= reschedule`, default 20) → **poison
brake** (#16): a job that's still rate-limited after N reschedules
is saturating the limiter, so instead of dumping it into another
25× retry loop we route it straight to the dead set tagged
`rate_limited`, bumping `jobs.rate_limited` and firing death
handlers. Bounded: termination at exactly `reschedule` attempts.

Constant Summary collapse

DEAD_REASON =
'rate_limited'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#config ⇒ Object Originally defined in module Middleware::ServerMiddleware

Returns the value of attribute config.

Class Method Details

.shared_instance? ⇒ Boolean

One instance per chain entry, shared by every job (Middleware::Chain::Entry): #call keeps its state in locals and writes no ivar.

Returns:

  • (Boolean)


37
# File 'lib/wurk/limiter/server_middleware.rb', line 37

def self.shared_instance? = true

Instance Method Details

#call(_worker, job, _queue) ⇒ Object



41
42
43
44
45
46
47
# File 'lib/wurk/limiter/server_middleware.rb', line 41

def call(_worker, job, _queue)
  yield
rescue StandardError => e
  raise unless over_limit?(e)

  handle_over_limit(job, e)
end

#logger ⇒ Object Originally defined in module Middleware::ServerMiddleware

#redis(idempotent: false) ⇒ Object Originally defined in module Middleware::ServerMiddleware

#redis_pool ⇒ Object Originally defined in module Middleware::ServerMiddleware