module Smooth
Enforces even task distribution to prevent clustering.
Smooth strategies prevent clustering by requiring tasks to wait for frame boundaries, ensuring smooth and predictable task execution timing. This creates consistent load patterns and prevents resource spikes.
Smooth Behavior
Smooth behavior with 3 tasks per 15-second window:
Window 1: [Task1] -- [Task2] -- [Task3] ---- (evenly spaced) 0s 5s 10s 15s Window 2: [Task4] -- [Task5] -- [Task6] ---- (evenly spaced) 15s 20s 25s 30s
Perfect for: API rate limiting, smooth resource usage
Definitions
def self.can_acquire?(window_count, limit, frame_changed)
Check if a task can be acquired in continuous mode.
Signature
-
parameter
window_countInteger Ignored in continuous mode.
-
parameter
limitInteger Ignored in continuous mode.
-
parameter
frame_changedBoolean Whether the frame boundary has been crossed.
-
returns
Boolean True only if the frame boundary has been crossed.
Implementation
def self.can_acquire?(window_count, limit, frame_changed)
frame_changed
end
def self.next_acquire_time(window_start_time, window_duration, frame_start_time, frame_duration)
Calculate the next time a task can be acquired.
Signature
-
parameter
window_start_timeNumeric Ignored in continuous mode.
-
parameter
window_durationNumeric Ignored in continuous mode.
-
parameter
frame_start_timeNumeric When the current frame started.
-
parameter
frame_durationNumeric Duration of each frame.
-
returns
Numeric The next frame start time.
Implementation
def self.next_acquire_time(window_start_time, window_duration, frame_start_time, frame_duration)
frame_start_time + frame_duration
end
def self.window_blocking?(window_count, limit, window_changed)
Check if window constraints are blocking new tasks.
Signature
-
parameter
window_countInteger Ignored in continuous mode.
-
parameter
limitInteger Ignored in continuous mode.
-
parameter
window_changedBoolean Ignored in continuous mode.
-
returns
Boolean Always false for continuous mode.
Implementation
def self.window_blocking?(window_count, limit, window_changed)
false # Continuous mode doesn't use window blocking
end
def self.frame_blocking?(frame_changed)
Check if frame constraints are blocking new tasks.
Signature
-
parameter
frame_changedBoolean Whether the frame boundary has been crossed.
-
returns
Boolean True if frame hasn't changed (blocking until next frame).
Implementation
def self.frame_blocking?(frame_changed)
!frame_changed
end
def self.statistics
Get current burst strategy statistics.
Signature
-
returns
Hash Statistics hash with current state.
Implementation
def self.statistics
{
name: "Smooth",
}
end