Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Node.js: message queue, retry, dead letter queue, persistence, circuit breaker

Как организовать хранение сообщений при отсутствии соединения с брокером?

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

Короткий ответ

При отсутствии соединения с брокером сообщения можно хранить локально в файловой системе или базе данных. Используйте паттерн Outbox: сохраняйте сообщение в локальную БД в одной транзакции с бизнес-операцией. Фоновый процесс периодически пытается отправить накопленные сообщения. При успехе — удаляет из локального хранилища. Для критичных данных применяйте очереди с подтверждением доставки и повторными попытками.

Длинный ответ

Проблема временной недоступности брокера

В распределенных системах брокер сообщений (RabbitMQ, Kafka) может быть временно недоступен из-за сетевых сбоев или перезагрузки. Если приложение в этот момент пытается отправить сообщение, оно может быть потеряно. Для обеспечения надежности применяют локальное хранение сообщений с последующей ретрансляцией.

Паттерн Outbox

Самый распространенный подход — паттерн Transactional Outbox. Сообщение сохраняется в локальную базу данных в той же транзакции, что и бизнес-данные. Отдельный фоновый процесс (publisher) читает неотправленные сообщения и отправляет их брокеру. После успешной отправки сообщение помечается как отправленное или удаляется.

// Пример на Node.js с PostgreSQL
async function createOrder(orderData) {
  const client = await pool.connect();
  try {
    await client.query('BEGIN');
    // 1. Сохраняем заказ
    await client.query('INSERT INTO orders ...', [orderData]);
    // 2. Сохраняем сообщение в outbox
    await client.query(
      'INSERT INTO outbox (event_type, payload, status) VALUES ($1, $2, $3)',
      ['order.created', JSON.stringify(orderData), 'pending']
    );
    await client.query('COMMIT');
  } catch (e) {
    await client.query('ROLLBACK');
    throw e;
  } finally {
    client.release();
  }
}

// Фоновый процесс отправки
async function processOutbox() {
  const messages = await pool.query(
    "SELECT * FROM outbox WHERE status = 'pending' ORDER BY created_at LIMIT 100"
  );
  for (const msg of messages.rows) {
    try {
      await broker.send(msg.event_type, msg.payload);
      await pool.query('UPDATE outbox SET status = $1 WHERE id = $2', ['sent', msg.id]);
    } catch (err) {
      // Логируем ошибку, повторная попытка позже
      console.error('Failed to send message', msg.id, err);
    }
  }
}

Альтернативные подходы

  • Локальный файл или очередь на диске: запись сообщений в файл с последующей отправкой. Менее надежно, чем БД, но проще.
  • In-memory буфер с периодической записью: для некритичных данных можно хранить сообщения в оперативной памяти с периодическим сбросом на диск.
  • Dead Letter Queue (DLQ): если после нескольких попыток сообщение не доставлено, оно помещается в DLQ для ручного анализа.

Вывод

Паттерн Outbox с использованием локальной БД — стандартный способ гарантировать доставку сообщений при сбоях брокера. Он подходит для микросервисных архитектур, где важна целостность данных. Для высоконагруженных систем можно комбинировать с механизмами повторных попыток и мониторингом DLQ.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Node.js

    Node.js

  • RabbitMQ

    RabbitMQ

Ключевые слова

#message queue

#retry

#dead letter queue

#persistence

#circuit breaker

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.