欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-05 21:14:43
客户端设置connection_name 在建立连接时,设置connection_name属性,可以在rabbitmq managerment 中查看到连接来自那个实...

客户端设置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)
  }
 })
}

参考




以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。