乐趣区

Node.js amqplib 连接 Rabbit MQ 最佳实践

客户端设置 connection_name
在建立连接时,设置 connection_name 属性,可以在 RabbitMQ Managerment 中查看到连接来自那个实例。
amqp.connect(rabbitMqAddress, {
clientProperties: {
connection_name: ‘your host name’
}
})
队列属性 autoDelete durable
如无必要,建议将队列设置成自动删除,这个在 TCP 连接断开后,队列会自动删除。另外也不要使用持久化队列。
channel.assertQueue(queueName, {
autoDelete: true,
durable: false
})
connnection 和 channel 管理

connnection 的内存消耗。一个 connection 至少要使用 100kb 的内存空间,过多的 connetion 占用将会导致内存溢出,服务崩溃等问题。(我曾遇到过生产系统,RabbitMQ 连接过多,系统一直处于崩溃边缘的险境)

重用 connection 或者 channel,而不要重复开关,下面给出 AMQP 各个阶段所耗费的 tcp 包,重复的开关,将会导致

AMQP connections: 7 TCP packages
AMQP channel: 2 TCP packages
AMQP publish: 1 TCP package (more for larger messages)
AMQP close channel: 2 TCP packages
AMQP close connection: 2 TCP packages

Total 14-19 packages (+ Acks)

一个进程,一个 channel, 一个 connection,如果一个 pod 向 RabbitMQ 建立了多条 tcp 连接,你就要警惕了。

监控进程与 RabbitMQ TCP 连接数,将 NodeJS 的运行信息写入 influxDB,并在 grafana 做监控和告警。其中 tcp 连接数可以使用 shelljs 执行命令获取。

function getRabbitMqConnnectionCount (params) {
shell.exec(`netstat -nt | grep ${rabbitmqHost} | wc -l`, (code, stdout, stderr) => {
try {
if (code === 0) {
rabbitMqConnnectionCount = parseInt(stdout) || 0
}
} catch (error) {
log.error(error.message)
}
})
}
参考

https://www.cloudamqp.com/blo…
https://www.cloudamqp.com/blo…
https://www.cloudamqp.com/blo…

退出移动版