การจัดการหน่วยความจำ RabbitMQ ด้วย Docker

ฉันใช้อิมเมจนักเทียบท่าการจัดการ RabbitMQ ปัญหาเกิดขึ้นหลังจากเวลาทำงานประมาณ 1 สัปดาห์ พื้นที่ดิสก์และหน่วยความจำเกือบหมด ฉันต้องยุติการทำงานอีกครั้งและรีสตาร์ทเพื่อให้ทำงานได้ตามปกติ แต่เมื่อทำเช่นนั้น ข้อความที่มีอยู่ในคิวทั้งหมดจะสูญหายไป

คำสั่งที่ฉันใช้เพื่อเริ่มเซิร์ฟเวอร์ rabbitmq คือ : docker run --rm -it --hostname my-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

ฉันใช้ข้อความถาวรและคิวที่คงทน

จำนวนคิวจะอยู่ที่ประมาณ 70

การเชื่อมต่อต่อวินาทีอาจแตกต่างกันตั้งแต่ 5 ถึง 100

ฉันใช้โมดูล amqplib npm เพื่อโต้ตอบกับ RabbitMQ โดยใช้ Nodejs

ฉันทำอะไรผิดหรือเปล่า? หรือฉันควรกำหนดค่าบนเซิร์ฟเวอร์ใด ๆ โดยตรงแทนหากใช้อิมเมจนักเทียบท่า มีวิธีใดบ้างที่จะลบเฉพาะข้อความ acknowledged?

ขอบคุณล่วงหน้า.


person Pranesh A S    schedule 13.11.2020    source แหล่งที่มา


คำตอบ (1)


นี่คือคำจำกัดความของความทนทานตามเอกสารอย่างเป็นทางการของ rabbitmq:

ความทนทาน

คิวสามารถคงทนหรือชั่วคราวได้ ข้อมูลเมตาของคิวถาวรจะถูกจัดเก็บไว้ในดิสก์ ในขณะที่ข้อมูลเมตาของคิวชั่วคราวจะถูกจัดเก็บไว้ในหน่วยความจำเมื่อเป็นไปได้ ความแตกต่างเดียวกันนี้เกิดขึ้นกับข้อความในเวลาเผยแพร่ในบางโปรโตคอล เช่น AMQP 0-9-1 และ MQTT

ในสภาพแวดล้อมและกรณีการใช้งานที่ความทนทานเป็นสิ่งสำคัญ แอปพลิเคชันต้องใช้คิวที่คงทน และตรวจสอบให้แน่ใจว่าการเผยแพร่ทำเครื่องหมายข้อความที่เผยแพร่ว่าคงอยู่

ดังนั้นหากคุณใช้ความทนทานในส่วนข้อความ แสดงว่าคุณกำลังเก็บข้อมูลเหล่านั้นไว้ในที่เก็บข้อมูล rabbitmq มาพร้อมกับฟังก์ชันที่คุณสามารถตอบรับข้อความของคุณได้ หากคุณตอบรับข้อความ ข้อความนั้นจะถูกลบออกจากคิว ดังนั้นคุณจึงมีสองทางเลือกสำหรับ ack:

  1. ใช้โหมดตอบรับอัตโนมัติ { noAck: true } :

    channel.consume(queue, function(msg) { // ข้อความของมันอยู่ที่นี่! }, { noAck: true });

  2. รับทราบคู่มือ:

    channel.consume(queue, function(msg) { // ข้อความของมันอยู่ที่นี่! // ฉันสามารถรับเองได้ channel.ack(msg); }, { noAck: false });

จึงมีบทความสำหรับการเพิ่มประสิทธิภาพของ rabbitmq: https://www.cloudamqp.com/blog/2018-01-08-part2-rabbitmq-best-practice-for-high-Performance.html

person Babak Abadkheir    schedule 13.11.2020