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)
    }
  })
}

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章