Что такое очереди сообщений (message queues)?

«Что такое очереди сообщений (message queues)?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Очередь сообщений — это компонент архитектуры, обеспечивающий асинхронную связь между сервисами. Отправитель (producer) помещает сообщение в очередь, не дожидаясь его обработки. Получатель (consumer) извлекает и обрабатывает сообщение позже, независимо от отправителя.

Ключевые преимущества:

  • Развязка компонентов: Сервисы не зависят от доступности друг друга.
  • Гарантированная доставка: Сообщения сохраняются до обработки.
  • Балансировка нагрузки: Можно масштабировать количество потребителей для обработки пиков.
  • Отказоустойчивость: Сообщения не теряются при сбое потребителя.

Популярные реализации: RabbitMQ (AMQP), Apache Kafka (логи), AWS SQS, Redis (через списки).

Типичный сценарий использования — фоновая обработка задач:

// Producer: Веб-приложение ставит задачу на отправку email в очередь
$connection = new AMQPStreamConnection('rabbitmq', 5672, 'user', 'pass');
$channel = $connection->channel();
$channel->queue_declare('email_tasks', false, true, false, false);

$emailData = json_encode(['to' => 'user@example.com', 'template' => 'welcome']);
$msg = new AMQPMessage($emailData, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_tasks');

// Consumer: Отдельный worker-процесс слушает очередь и отправляет письма
$callback = function ($msg) {
    $data = json_decode($msg->body, true);
    // Логика отправки email через SMTP или сторонний API
    sendEmail($data['to'], $data['template']);
    $msg->ack(); // Подтверждаем успешную обработку
};
$channel->basic_consume('email_tasks', '', false, false, false, false, $callback);
while ($channel->is_open()) {
    $channel->wait();
}