����JFIF��x�x����'
| Server IP : 78.140.185.180 / Your IP : 216.73.216.170 Web Server : LiteSpeed System : Linux cpanel13.v.fozzy.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64 User : builderbox ( 1072) PHP Version : 7.3.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/builderbox/././www/vendor/laravel/horizon/src/ |
Upload File : |
<?php
namespace Laravel\Horizon;
use Illuminate\Contracts\Queue\Factory as QueueFactory;
use Illuminate\Support\Collection;
use Laravel\Horizon\Contracts\MetricsRepository;
class AutoScaler
{
/**
* The queue factory implementation.
*
* @var \Illuminate\Contracts\Queue\Factory
*/
public $queue;
/**
* The metrics repository implementation.
*
* @var \Laravel\Horizon\Contracts\MetricsRepository
*/
public $metrics;
/**
* Create a new auto-scaler instance.
*
* @param \Illuminate\Contracts\Queue\Factory $queue
* @param \Laravel\Horizon\Contracts\MetricsRepository $metrics
* @return void
*/
public function __construct(QueueFactory $queue, MetricsRepository $metrics)
{
$this->queue = $queue;
$this->metrics = $metrics;
}
/**
* Balance the workers on the given supervisor.
*
* @param \Laravel\Horizon\Supervisor $supervisor
* @return void
*/
public function scale(Supervisor $supervisor)
{
$pools = $this->poolsByQueue($supervisor);
$workers = $this->numberOfWorkersPerQueue(
$supervisor, $this->timeToClearPerQueue($supervisor, $pools)
);
$workers->each(function ($workers, $queue) use ($supervisor, $pools) {
$this->scalePool($supervisor, $pools[$queue], $workers);
});
}
/**
* Get the process pools keyed by their queue name.
*
* @param \Laravel\Horizon\Supervisor $supervisor
* @return \Illuminate\Support\Collection
*/
protected function poolsByQueue(Supervisor $supervisor)
{
return $supervisor->processPools->mapWithKeys(function ($pool) {
return [$pool->queue() => $pool];
});
}
/**
* Get the times in milliseconds needed to clear the queues.
*
* @param \Laravel\Horizon\Supervisor $supervisor
* @param \Illuminate\Support\Collection $pools
* @return \Illuminate\Support\Collection
*/
protected function timeToClearPerQueue(Supervisor $supervisor, Collection $pools)
{
return $pools->mapWithKeys(function ($pool, $queue) use ($supervisor) {
$size = $this->queue->connection($supervisor->options->connection)->readyNow($queue);
return [$queue => [
'size' => $size,
'time' => ($size * $this->metrics->runtimeForQueue($queue)),
]];
});
}
/**
* Get the number of workers needed per queue for proper balance.
*
* @param \Laravel\Horizon\Supervisor $supervisor
* @param \Illuminate\Support\Collection $queues
* @return \Illuminate\Support\Collection
*/
protected function numberOfWorkersPerQueue(Supervisor $supervisor, Collection $queues)
{
$timeToClearAll = $queues->sum('time');
return $queues->mapWithKeys(function ($timeToClear, $queue) use ($supervisor, $timeToClearAll) {
if ($timeToClearAll > 0 &&
$supervisor->options->autoScaling()) {
return [$queue => (($timeToClear['time'] / $timeToClearAll) * $supervisor->options->maxProcesses)];
} elseif ($timeToClearAll == 0 &&
$supervisor->options->autoScaling()) {
return [
$queue => $timeToClear['size']
? $supervisor->options->maxProcesses
: $supervisor->options->minProcesses,
];
}
return [$queue => $supervisor->options->maxProcesses / count($supervisor->processPools)];
})->sort();
}
/**
* Scale the given pool to the recommended number of workers.
*
* @param \Laravel\Horizon\Supervisor $supervisor
* @param \Laravel\Horizon\ProcessPool $pool
* @param float $workers
* @return void
*/
protected function scalePool(Supervisor $supervisor, $pool, $workers)
{
$supervisor->pruneTerminatingProcesses();
$totalProcessCount = $pool->totalProcessCount();
$desiredProcessCount = ceil($workers);
if ($desiredProcessCount > $totalProcessCount) {
$maxUpShift = min(
$supervisor->options->maxProcesses - $supervisor->totalProcessCount(),
$supervisor->options->balanceMaxShift
);
$pool->scale(
min(
$totalProcessCount + $maxUpShift,
$supervisor->options->maxProcesses,
$desiredProcessCount
)
);
} elseif ($desiredProcessCount < $totalProcessCount) {
$maxDownShift = min(
$supervisor->totalProcessCount() - $supervisor->options->minProcesses,
$supervisor->options->balanceMaxShift
);
$pool->scale(
max(
$totalProcessCount - $maxDownShift,
$supervisor->options->minProcesses,
$desiredProcessCount
)
);
}
}
}