Длинный ответ от Node.js клиента при публикации - PullRequest
1 голос
/ 25 мая 2020

Столкнулся с проблемой пульса отказов от 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 сообщений:

send 100k messages

На графике мы видим небольшие провалы, которые соответствуют интервалу 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 можно найдите два решения:

  1. Установите значение heartbeats = 0 , тем самым отключив такт
  2. Увеличьте значение heartbeats до более высокое значение, например heartbeats = 1800s

Мне не понравился первый вариант, поскольку он отключил heartbeats клиентское приложение не знает своевременно о недоступности RabbitMQ и это создаст значительный риск для безопасность данных, особенно для издателей.

Второй вариант тоже не совсем понятен. На сколько увеличиться? Если мы увеличим сердцебиение , скажем, до 1800 , он будет работать, например, для отправки 500k сообщений в 20 символах. А если данных больше?

Вот пример публикации 500к сообщений в то время, когда heartbeats = 1800s :

send 500k messages

Мы видим, что интервалы простоев значительно увеличились.

Давайте увеличим объем передаваемых сообщений даже до 1000k :

send 1000k messages 1 hours

send 1000k messages 8 hours

Мы видим, что время простоя увеличилось еще больше.

Есть любые другие решения для клиентского приложения Node.js для «сниффинга» (клиент и сервер отвечают друг другу через двунаправленный протокол RP C, очищающий в интервале 60 секунд) с помощью RabbitMQ ?

...