Ответ
Да, интегрировал системы обмена сообщениями в нескольких распределенных Node.js-приложениях. Выбор конкретного брокера зависел от требований проекта.
RabbitMQ (AMQP): Использовал для микросервисной архитектуры в проекте по обработке заказов, где важна гарантированная доставка и routing flexibility.
// Producer с подтверждениями
const channel = await connection.createChannel();
await channel.assertExchange('orders', 'direct', { durable: true });
await channel.assertQueue('order.process', { durable: true });
await channel.bindQueue('order.process', 'orders', 'new.order');
// Публикация с persistent сообщениями
channel.publish('orders', 'new.order', Buffer.from(JSON.stringify(order)), {
persistent: true,
contentType: 'application/json',
headers: { 'retry-count': 0 }
});
// Consumer с обработкой ошибок и retry логикой
channel.consume('order.process', async (msg) => {
try {
const order = JSON.parse(msg.content.toString());
await processOrder(order);
channel.ack(msg);
} catch (error) {
// DLQ паттерн
if (msg.properties.headers['retry-count'] >= 3) {
channel.sendToQueue('order.dlq', msg.content, { persistent: true });
channel.ack(msg);
} else {
channel.nack(msg, false, false); // Отправка в retry очередь
}
}
}, { noAck: false });
Kafka: Применял в аналитической платформе для обработки потоковых данных. Использовал kafkajs с consumer groups и exactly-once семантикой там, где это было критично.
Практические решения:
- Реализовал dead letter queues для обоих брокеров
- Настраивал мониторинг через Prometheus метрики (сообщения в очередях, latency)
- Использовал schema registry (Confluent) с Avro для контрактов сообщений в Kafka