Проверяет понимание назначения и преимуществ использования очередей сообщений в распределённых системах.
Очереди сообщений — это промежуточный слой, который принимает данные от одного сервиса и хранит их до тех пор, пока другой сервис не будет готов их обработать. Основная цель — сделать взаимодействие между компонентами асинхронным и слабосвязанным. Вместо прямого HTTP-вызова, который блокирует выполнение, отправитель просто публикует сообщение в очередь и продолжает работу.
Это решает несколько задач: сглаживание пиковых нагрузок, когда сообщения накапливаются и обрабатываются постепенно; повышение отказоустойчивости, так как если получатель временно недоступен, сообщение не теряется; упрощение масштабирования, потому что можно добавлять несколько обработчиков одной очереди.
Типичная схема включает продюсера (отправителя), брокер (очередь) и консьюмера (получателя). Продюсер отправляет сообщение, брокер сохраняет его, а консьюмер забирает и обрабатывает. Если консьюмеров несколько, они могут конкурировать за сообщения, что увеличивает пропускную способность.
// Пример на Node.js с использованием библиотеки amqplib
const amqp = require('amqplib');
async function send() {
const conn = await amqp.connect('amqp://localhost');
const ch = await conn.createChannel();
const q = 'tasks';
await ch.assertQueue(q);
ch.sendToQueue(q, Buffer.from('Hello'));
console.log('Sent');
}
async function receive() {
const conn = await amqp.connect('amqp://localhost');
const ch = await conn.createChannel();
const q = 'tasks';
await ch.assertQueue(q);
ch.consume(q, (msg) => {
console.log('Received:', msg.content.toString());
ch.ack(msg);
});
}Очереди используются в микросервисной архитектуре для обмена событиями, в системах обработки заказов, логирования, уведомлений, а также для интеграции с внешними сервисами. Популярные брокеры: RabbitMQ, Apache Kafka, Redis Streams.
Итог: Очереди сообщений стоит применять, когда нужно развязать сервисы, сгладить нагрузку или обеспечить гарантированную доставку данных. Они особенно полезны в высоконагруженных и распределённых системах, где важна надёжность и масштабируемость.