发布> 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 消息的示例:
在该图上,我们看到符合范围心跳= 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上查找信息后,您可以找到两种解决方案:
我不喜欢第一种选择,因为它禁用了心跳,客户端应用程序无法及时了解 RabbitMQ 的不可访问性,这会产生很大的影响。数据安全风险,尤其是对发布者而言。
第二个选项也不是很清楚。增加多少?如果我们增加心跳,例如,最多 1800s ,它将起作用,例如,以 20 发送 500k 消息强>字符。还有大量数据吗?
以下是在心跳= 1800秒时发布 500k 消息的示例:
我们看到停机时间间隔大大增加了。
让我们将传输的消息量提高到 1000k :
我们看到停机时间增加了更多。
对于 Node.js 客户端应用程序,是否还有其他解决方案可以“嗅探”(客户端和服务器通过双向RPC协议相互反应,间隔为60秒),因此 RabbitMQ ?