Столкнулся с проблемой пульса отказов от Node.js клиента (npm -пакет amqplib ) при публикации > 150k уникальные сообщения 20 символов каждое.
Я отправляю сообщения на al oop со следующим кодом:
// Publication message
function publish(ch, exchange, routing_key, content, callback_publish) {
let result = false;
const message = content.toString();
try {
// Trying to publishing message
ch.publish(exchange, routing_key, content, {persistent: true},
(err, ok) => {
if (err) {
console.log('[AMQP] Error publishing message:', err);
} else {
result = true;
}
callback_publish(result, message);
});
} catch (e) {
console.log('[AMQP] Posting exception message:', e.message);
callback_publish(result, message);
}
}
// ch = ...
// exchange = ...
// routing_key = ...
// Receive messages to send
const msgs = messages.get_publisher_messages_to_send()
let j = 1;
// Sending messages
for (let i = 0; i < count_messages; i++) {
const msg = msgs[i];
const content = Buffer.from(msg);
console.log('[AMQP] Message sending:', msg, '(', i + 1,')');
publish(ch, exchange, routing_key, content, (res, msg) => {
console.log('[AMQP] Result of sending', res, 'for message:', msg, '(', j, ')');
j++;
});
}
Пример непрерывной публикации 100k сообщений:
На графике мы видим небольшие провалы, которые соответствуют интервалу heartbeats = 60s .
Но как только объем сообщений увеличивается, например до 500k сообщений, длина «шага» также увеличивается и значение heartbeats = 60s становится недостаточно. В журналах RabbitMQ появляется сообщение вида:
2020-05-22 10: 34: 36.975 [ошибка] <0,24252.1> закрытие соединения AMQP <0,24252 .1> (192.168.56.25:58446 -> 192.168.56.17:5672): пропущенные биения от клиента, тайм-аут: 60 с
Мы видим, что если RabbitMQ отправляет пульс на клиентское приложение, если оно не отвечает, RabbitMQ отключает его.
После поиска информации в официальной документации и на Inte rnet можно найдите два решения:
- Установите значение heartbeats = 0 , тем самым отключив такт
- Увеличьте значение heartbeats до более высокое значение, например heartbeats = 1800s
Мне не понравился первый вариант, поскольку он отключил heartbeats клиентское приложение не знает своевременно о недоступности RabbitMQ и это создаст значительный риск для безопасность данных, особенно для издателей.
Второй вариант тоже не совсем понятен. На сколько увеличиться? Если мы увеличим сердцебиение , скажем, до 1800 , он будет работать, например, для отправки 500k сообщений в 20 символах. А если данных больше?
Вот пример публикации 500к сообщений в то время, когда heartbeats = 1800s :
Мы видим, что интервалы простоев значительно увеличились.
Давайте увеличим объем передаваемых сообщений даже до 1000k :
Мы видим, что время простоя увеличилось еще больше.
Есть любые другие решения для клиентского приложения Node.js для «сниффинга» (клиент и сервер отвечают друг другу через двунаправленный протокол RP C, очищающий в интервале 60 секунд) с помощью RabbitMQ ?