Skip to content

Commit b2a6f7b

Browse files
committed
Wait for a random interval before starting the scheduler's tasks
This comes from an idea from @djmb, so that, when we have multiple schedulers, they don't start all at the same time after a deploy, enqueuing All The Things and causing a thundering herd.
1 parent b882b9b commit b2a6f7b

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

Diff for: lib/solid_queue/interruptible.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def interrupt
1717
end
1818

1919
def interruptible_sleep(time)
20-
if self_pipe[:reader].wait_readable(time)
20+
if time > 0 && self_pipe[:reader].wait_readable(time)
2121
loop { self_pipe[:reader].read_nonblock(SELF_PIPE_BLOCK_SIZE) }
2222
end
2323
rescue Errno::EAGAIN, Errno::EINTR

Diff for: lib/solid_queue/runner.rb

+9
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ module Runner
1111

1212
def start(mode: :supervised)
1313
boot_in mode
14+
observe_starting_delay
1415

1516
run_callbacks(:start) do
1617
if mode == :async
@@ -44,6 +45,10 @@ def boot_in(mode)
4445
SolidQueue.logger.info("[SolidQueue] Starting #{self}")
4546
end
4647

48+
def observe_starting_delay
49+
interruptible_sleep(initial_jitter)
50+
end
51+
4752
def register_signal_handlers
4853
%w[ INT TERM ].each do |signal|
4954
trap(signal) do
@@ -81,6 +86,10 @@ def shutdown
8186
procline "shutting down"
8287
end
8388

89+
def initial_jitter
90+
0
91+
end
92+
8493
def stopping?
8594
@stopping
8695
end

Diff for: lib/solid_queue/scheduler.rb

+4
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ def unblock_blocked_executions
5858
BlockedExecution.unblock(batch_size)
5959
end
6060

61+
def initial_jitter
62+
Kernel.rand(0...polling_interval)
63+
end
64+
6165
def metadata
6266
super.merge(batch_size: batch_size, polling_interval: polling_interval)
6367
end

0 commit comments

Comments
 (0)