Вопрос проверяет понимание механизмов гарантированной доставки сообщений в системах обмена сообщениями, что критично для построения отказоустойчивых распределенных приложений.
Надежная доставка сообщений — это способность системы гарантировать, что каждое отправленное сообщение будет успешно обработано получателем, даже при сбоях сети, падениях серверов или ошибках в приложении. Это достигается за счет комбинации протоколов подтверждений, повторных отправок и различных уровней гарантий.
Основные механизмы включают:
// Отправка с подтверждением от брокера
channel.confirmSelect();
channel.publish('exchange', 'routingKey', null, Buffer.from('message'));
await channel.waitForConfirms(); // ждем, пока брокер подтвердит
// Потребление с ручным подтверждением
channel.consume('queue', async (msg) => {
try {
await processMessage(msg);
channel.ack(msg); // подтверждаем успешную обработку
} catch (err) {
channel.nack(msg, false, true); // отклоняем и возвращаем в очередь
}
}, { noAck: false });Надежная доставка сообщений необходима в системах, где потеря данных недопустима: финансовые транзакции, заказы, логирование критических событий. Выбор уровня гарантии зависит от требований к производительности и консистентности. Для большинства бизнес-приложений достаточно at-least-once с идемпотентными обработчиками.