Какие базовые типы очередей существуют: FIFO и LIFO, и примеры их применения
Что проверяют
Для аналитика это вопрос не про реализацию структур данных, а про умение увидеть порядок обработки в требованиях: кто будет обслужен первым, что будет при сбое, где порядок важен для бизнеса. Следом часто спрашивают, как гарантировать порядок в брокере сообщений или как быть со срочными заявками.
Как отвечать
Начните с терминов и сразу поправьте формулировку: LIFO это стек, а не очередь.
- FIFO (очередь): первым выходит тот, кто первым пришёл. Примеры: заявки в поддержку, очередь платежей, сообщения в брокере, выгрузка заказов на склад;
- LIFO (стек): первым обрабатывается последний добавленный элемент. Примеры: история «Назад» в браузере и мобильном приложении, отмена действий (undo), стек вызовов в программе;
- очередь с приоритетом: порядок задаёт приоритет, а не время. Так работают SLA в поддержке: инцидент с остановкой продаж идёт раньше вопроса про отчёт;
- дек (deque): добавлять и забирать можно с обоих концов, пригодится, если задачу нужно вернуть в начало очереди.
Дальше покажите, как это ложится в требования. В брокерах порядок не бесплатный: в Kafka он гарантирован только внутри одной партиции, поэтому все события одного заказа отправляют с одним ключом. В RabbitMQ при нескольких потребителях и повторной доставке порядок обработки тоже может нарушиться. Аналитик фиксирует в спецификации, где порядок обязателен, а где достаточно идемпотентной обработки.
Если спросят про склад: FIFO и LIFO там методы списания запасов. LIFO запрещён МСФО и в российском бухучёте тоже не применяется, это полезно знать, если вы пишете требования к учётной системе.
Где спотыкаются
Называют LIFO «очередью» и не могут объяснить, чем стек отличается от очереди, на примере из своей предметной области.
Считают, что брокер сообщений сам по себе гарантирует порядок. Без ключа партиционирования и при нескольких потребителях события одного объекта приходят вперемешку.
Не задают вопрос «что при ошибке». Сообщение, упавшее с ошибкой, может уйти в конец очереди или в DLQ, и строгий FIFO уже нарушен. Это нужно описать в требованиях явно.