← Назад к вопросам
Какой принцип работы у queue?
1.2 Junior🔥 191 комментариев
#Алгоритмы и структуры данных
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Принцип работы очередей (Queue)
Очереди — FIFO (First In First Out) структуры данных для асинхронной обработки.
FIFO Принцип
[1] [2] [3] [4] [5]
↑ ↑
Отвод (Dequeue) Вход (Enqueue)
Простая реализация
class Queue<T> {
private items: T[] = [];
enqueue(item: T): void { this.items.push(item); }
dequeue(): T | undefined { return this.items.shift(); }
peek(): T | undefined { return this.items[0]; }
size(): number { return this.items.length; }
}
RabbitMQ
import amqp from 'amqplib';
// Отправить
const channel = await connection.createChannel();
await channel.assertQueue('task_queue', { durable: true });
channel.sendToQueue('task_queue', Buffer.from(JSON.stringify(task)), { persistent: true });
// Получить
channel.consume('task_queue', async (msg) => {
const data = JSON.parse(msg.content.toString());
await processTask(data);
channel.ack(msg);
});
Redis Queue (Bull)
import Queue from 'bull';
const emailQueue = new Queue('email');
await emailQueue.add(
{ email: 'user@example.com' },
{ attempts: 3, backoff: { type: 'exponential', delay: 2000 } }
);
emailQueue.process(async (job) => {
await sendEmail(job.data.email);
return { success: true };
});
Kafka (Event Streaming)
const producer = kafka.producer();
await producer.send({
topic: 'user-events',
messages: [{ key: userId, value: JSON.stringify(event) }],
});
const consumer = kafka.consumer({ groupId: 'email-group' });
await consumer.subscribe({ topic: 'user-events' });
await consumer.run({
eachMessage: async ({ message }) => {
const event = JSON.parse(message.value.toString());
if (event.type === 'user.created') await sendWelcomeEmail(event);
},
});
Сравнение
| Очередь | Персистентность | Потребители | Скорость | Случай |
|---|---|---|---|---|
| In-Memory | Нет | 1 | Максимальная | Dev/тесты |
| Redis | Да | 1+ | Высокая | Задачи |
| RabbitMQ | Да | 1+ | Средняя | Микросервисы |
| Kafka | Да | N | Средняя | Event streaming |
Паттерны
Асинхронная обработка:
await emailQueue.add({ email }); // Сразу возвращаем, обработка в background
Rate limiting:
const queue = new Queue('api', {
limiter: { max: 100, duration: 60000 }, // 100 за 60 сек
});
Dead Letter Queue для ошибок:
emailQueue.on('failed', async (job, error) => {
await dlq.add(job.data); // Отправить в очередь ошибок
});
Best Practices
- Идемпотентность — обработчик безопасно срабатывает дважды
- Повторы — exponential backoff при ошибках
- Мониторинг — трекируй размер очереди
- Таймауты — устанавливай для обработчиков
- Логирование — логируй каждую задачу
Выбор очереди
- Redis (Bull) — для большинства Node.js приложений
- RabbitMQ — микросервисы, гарантии доставки
- Kafka — event streaming, масштабирование
- In-Memory — development, простые очереди