31
Янв
2018

Распределение задач RabbitMQ по алгоритму round-robin

Доброго времени суток.

В проекте реализованы очереди на RabbitMQ с алгоритмом round-robin распределения задач по воркерам. Выявлена проблема - имеется три воркера, первый получил задачу - работает, второй, третий получили - быстро отработали. Первый воркер все еще занят, в очереди появилось еще одно задание и оно ждет освобождения первого воркера вместо того, чтобы передать следующему свободному.

Возможно исправить эту ситуацию, оставив алгоритм round-robin, чтобы свободные воркеры по очереди получали задачи? Спасибо.

Код создания задачи (PHP):

  $channel->queue_declare($queueName, false, false, false, false);

  $message = new AMQPMessage($task, [
      'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT
  ]);

  $channel->basic_publish($message, '', $queueName);

Код подключения воркера:

$channel->queue_declare($queueName, false, false, false, false);

$channel->basic_consume(
        $queueName, '',
        false, true, false, false,
        $handler
);

while (count($channel->callbacks)) {
    $channel->wait();
}

Handler - метод

public function handler(AMQPMessage $message)
{
    $taskId = intval($message->body);
    if (!$task = Task::findOne($taskId)) {
        $this->log("Task id: {$taskId} not found.", 'warning');
        return;
    }

    $method = 'on' . ucfirst($task->command);
    $taskHandler = new TaskHandler;


    $this->log("Task with command '{$task->command}' handled.");

    $task->execute();

    if (method_exists($taskHandler, $method)) {
        $this->executeMethod($task, $taskHandler, $method);
    } else {
        $this->log("Command '{$method}' not found!", 'error');
    }
}

Реализация получения задачи через basic_get

   while (!$this->stopFlag) {

        if ($msg = $channel->basic_get($name, true)) {
            call_user_func_array($handler, [$msg]);
        }

        usleep(10 * 1000);

        pcntl_signal_dispatch();
    }

Источник: https://ru.stackoverflow.com/questions/777983/%D0%A0%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%B0%D0%B4%D0%B0%D1%87-rabbitmq-%D0%BF%D0%BE-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%83-round-robin

Тебе может это понравится...

Добавить комментарий