详解Node.js amqplib 连接 Rabbit MQ最佳实践
客户端设置connection_name
在建立连接时,设置connection_name属性,可以在RabbitMQManagerment中查看到连接来自那个实例。
amqp.connect(rabbitMqAddress,{ clientProperties:{ connection_name:'yourhostname' } })
队列属性autoDeletedurable
如无必要,建议将队列设置成自动删除,这个在TCP连接断开后,队列会自动删除。另外也不要使用持久化队列。
channel.assertQueue(queueName,{ autoDelete:true, durable:false })
connnection和channel管理
connnection的内存消耗。一个connection至少要使用100kb的内存空间,过多的connetion占用将会导致内存溢出,服务崩溃等问题。(我曾遇到过生产系统,RabbitMQ连接过多,系统一直处于崩溃边缘的险境)
重用connection或者channel,而不要重复开关,下面给出AMQP各个阶段所耗费的tcp包,重复的开关,将会导致
- AMQPconnections:7TCPpackages
- AMQPchannel:2TCPpackages
- AMQPpublish:1TCPpackage(moreforlargermessages)
- AMQPclosechannel:2TCPpackages
- AMQPcloseconnection:2TCPpackages
Total14-19packages(+Acks)
一个进程,一个channel,一个connection,如果一个pod向RabbitMQ建立了多条tcp连接,你就要警惕了。
监控进程与RabbitMQTCP连接数,将NodeJS的运行信息写入influxDB,并在grafana做监控和告警。其中tcp连接数可以使用shelljs执行命令获取。
functiongetRabbitMqConnnectionCount(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/blog/2017-12-29-part1-rabbitmq-best-practice.html
https://www.cloudamqp.com/blog/2018-01-08-part2-rabbitmq-best-practice-for-high-performance.html
https://www.cloudamqp.com/blog/2018-01-19-part4-rabbitmq-13-common-errors.html
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。