发布时来自Node.js客户端的长信号心跳

时间:2020-05-25 14:22:30

标签: node.js rabbitmq

发布> 150k时,从 Node.js 客户端(npm软件包 amqplib )解决了心跳故障的问题/ strong>每条 20 个字符的唯一消息。

我正在使用以下代码循环发送消息:

// 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

在该图上,我们看到符合范围心跳= 60s 的小幅度下降。

但是,一旦消息量增加,例如,增加到 500k 消息,“步长”的长度也会增加,并且心跳= 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 会断开连接。

official documentation和Internet上查找信息后,您可以找到两种解决方案:

  1. 设置心跳= 0 的值,从而禁用心跳
  2. 心跳的值提高到更高的值,例如心跳= 1800秒

我不喜欢第一种选择,因为它禁用了心跳,客户端应用程序无法及时了解 RabbitMQ 的不可访问性,这会产生很大的影响。数据安全风险,尤其是对发布者而言。

第二个选项也不是很清楚。增加多少?如果我们增加心跳,例如,最多 1800s ,它将起作用,例如,以 20 发送 500k 消息强>字符。还有大量数据吗?

以下是在心跳= 1800秒时发布 500k 消息的示例:

send 500k messages

我们看到停机时间间隔大大增加了。

让我们将传输的消息量提高到 1000k

send 1000k messages 1 hours

send 1000k messages 8 hours

我们看到停机时间增加了更多。

对于 Node.js 客户端应用程序,是否还有其他解决方案可以“嗅探”(客户端和服务器通过双向RPC协议相互反应,间隔为60秒),因此 RabbitMQ

0 个答案:

没有答案