Дано:
Задача: составить алгоритм, который на каждой итерации рассчитывает, сколько необходимо взять сообщений из каждой очереди для отправки в канал так, чтобы выполнялись следующие условия:
Допустим, пропускная способность канала равна 10. Примеры того, как мог бы работать алгоритм на произвольной итерации:
php// Основной цикл отправки сообщений, на каждой итерации которого вычисляется нужное количество сообщений по каждой очереди.
function dispatcher(Source $source) {
$messages = ;
while (true) {
// Имитируем поступление сообщений в очереди
$source->next();
// Рассчитываем количество сообщений которое нужно извлечь из каждой очереди
$batchSizes = calculateMessageBatchSizes($source->queueSizes(), $source->queueQuotas());
$source->printStats($batchSizes);
// Извлекаем нужное количество сообщений из каждой очереди и складываем их в общий массив
foreach ($batchSizes as $queueId => $batchSize) {
if ($batchSize <= 0) {
continue;
}
$messages = array_merge(
$messages,
$source->extractMessagesFromQueue($queueId, $batchSize)
);
}
// Отправляем сообщения если они есть
if ($messages) {
sendMessages($messages);
$messages = ;
}
}
}
/**
* @param array<int, int> $queueSizes
* @param array<int, float> $queueQuotas
* @param int $bandwidth
* @return array
*/
function calculateMessageBatchSizes(array $queueSizes, array $queueQuotas, int $bandwidth = 20): array
{