Какие бывают типы очередей в архитектуре приложений?

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

Ответ

В архитектуре распределенных систем и приложений я сталкивался со следующими типами очередей:

  1. FIFO (First-In, First-Out) / Очередь сообщений: Классическая очередь, где порядок обработки соответствует порядку поступления. Ключевое свойство — сохранение порядка. Пример: система обработки заказов, где заказы должны обрабатываться последовательно.

    // Пример с использованием Redis (php-redis)
    $redis->lPush('order_queue', json_encode($orderData)); // Добавление в очередь
    $order = json_decode($redis->rPop('order_queue'), true); // Извлечение в порядке FIFO
  2. LIFO (Last-In, First-Out) / Стек: Обработка начинается с самого последнего добавленного элемента. Часто используется для отмены операций (undo) или обхода графов.

  3. Приоритетная очередь: Элементы имеют приоритет. Обрабатываются сначала элементы с высшим приоритетом, даже если они поступили позже. Пример: система тикетов, где критичные баги обрабатываются в первую очередь.

    // Пример с SplPriorityQueue
    $queue = new SplPriorityQueue();
    $queue->setExtractFlags(SplPriorityQueue::EXTR_DATA);
    $queue->insert('Низкий приоритет', 10);
    $queue->insert('Высокий приоритет', 100);
    echo $queue->extract(); // 'Высокий приоритет'
  4. Отложенная (Delayed) очередь: Сообщение становится доступным для обработки только после истечения заданного времени. В Laravel это реализуется через метод ->delay().

    ProcessPodcast::dispatch($podcast)->delay(now()->addMinutes(10));
  5. Очередь Dead Letter (DLQ): Специальная очередь для сообщений, которые не удалось обработать после нескольких попыток. Это критически важно для отладки и обеспечения надежности системы. При использовании RabbitMQ или Amazon SQS настройка DLQ является стандартной практикой.

  6. Публикация/Подписка (Pub/Sub): Хотя это не очередь в классическом смысле, это модель обмена сообщениями, где сообщение рассылается всем подписчикам топика. Используется в Kafka, Redis Pub/Sub для событийной архитектуры.

Выбор системы: Для простых задач хватает Redis. Для высоких нагрузок и сложной маршрутизации — RabbitMQ. Для потоковой обработки больших данных и долгосрочного хранения логов — Apache Kafka.