Configuration Value Objects
Configuration Value Objects
All final readonly. Live in src/Configuration/.
QueueConfiguration
Per-queue resolved configuration. Built by QueueConfiguration::fromConfig($connection, $queue).
readonly class QueueConfiguration
{
public function __construct(
public string $connection,
public string $queue,
public SlaConfiguration $sla,
public ForecastConfiguration $forecast,
public SpawnCompensationConfiguration $spawnCompensation,
public WorkerConfiguration $workers,
public FuseConfiguration $fuse = new FuseConfiguration(
enabled: true,
failureThresholdPercent: 50.0,
minSamples: 20,
windowSeconds: 60,
cooldownSeconds: 60,
),
public array $memberQueues = [], // populated when adapted from a GroupConfiguration
) {}
/** @return list<string> Real queue names to aggregate signals across (group support). */
public function sampleQueues(): array;
public static function fromConfig(string $connection, string $queue): self;
}
`fromConfig()` resolves `queue-autoscale.queues.{queue}` through `resolveProfileOrArray()`: a `ProfileContract` class string, or a literal partial-override array deep-merged over `sla_defaults`. It does **not** understand `['profile' => ..., 'overrides' => [...]]` — that shape belongs to `GroupConfiguration` only.
Access is nested: `$config->workers->min`, `$config->workers->max`, `$config->sla->targetSeconds`. There is no `$config->minWorkers`, `$config->maxWorkers` or `$config->maxPickupTimeSeconds`.
SlaConfiguration
public function __construct(
public int $targetSeconds, // > 0
public int $percentile, // one of 50, 75, 90, 95, 99
public int $windowSeconds, // >= 60
public int $minSamples, // >= 1; below this many samples, fall back to oldest_job_age
) {}
The constructor throws InvalidConfigurationException on any violation of those constraints.
WorkerConfiguration
public function __construct(
public int $min, // >= 0
public int $max, // >= $min
public int $tries, // >= 1
public int $timeoutSeconds, // > 0
public int $sleepSeconds,
public int $shutdownTimeoutSeconds,
public bool $scalable = true, // false = supervised/pinned (ExclusiveProfile)
) {}
public function pinnedCount(): int; // returns $min; used when scalable=false
Constructor guards throw InvalidConfigurationException, including scalable=false requiring min === max and min >= 1.
Every value here reaches the spawned worker. The global
queue-autoscale.workersblock that used to override them no longer exists.
ForecastConfiguration
public function __construct(
public string $forecasterClass, // class-string<ForecasterContract>
public string $policyClass, // class-string<ForecastPolicyContract>
public int $horizonSeconds, // how far ahead to predict
public int $historySeconds, // how much history to feed the forecaster
) {}
SpawnCompensationConfiguration
public function __construct(
public bool $enabled,
public float $fallbackSeconds,
public int $minSamples,
public float $emaAlpha,
) {}
FuseConfiguration
readonly class FuseConfiguration
{
public function __construct(
public bool $enabled,
public float $failureThresholdPercent, // (0, 100]
public int $minSamples, // >= 1
public int $windowSeconds, // >= 1
public int $cooldownSeconds,
) {}
public static function fromArray(array $config): self;
}
See Failure Fuse.
GroupConfiguration
Multi-queue priority worker group. See Queue Topology → Groups.
readonly class GroupConfiguration
{
public const MODE_PRIORITY = 'priority';
public function __construct(
public string $name,
public string $connection,
public array $queues, // array<int, string> in priority order
public string $mode, // MODE_PRIORITY is the only supported value
public SlaConfiguration $sla,
public ForecastConfiguration $forecast,
public SpawnCompensationConfiguration $spawnCompensation,
public WorkerConfiguration $workers,
public FuseConfiguration $fuse = new FuseConfiguration(
enabled: true,
failureThresholdPercent: 50.0,
minSamples: 20,
windowSeconds: 60,
cooldownSeconds: 60,
),
) {}
public function queueArgument(): string; // 'email,sms,push'
public function toScalingConfiguration(): QueueConfiguration;
public static function fromConfig(string $name, array $config): self;
public static function allFromConfig(): array; // array<string, self>
public static function assertNoQueueConflicts(array $groups): void;
}
fromConfig() reads queues, connection (default 'default'), mode (default 'priority'), profile and overrides. The profile + overrides pair is groups-only; the per-queue resolver does not understand it.
The constructor throws InvalidConfigurationException for an empty queue list, an unsupported mode, a non-scalable profile, or a duplicate queue within the group. assertNoQueueConflicts() throws when a queue appears both under queues and in a group, or in two groups.