我正在使用RabbitMQ管理docker映像。问题是在大约1周的正常运行时间后,磁盘空间和内存几乎耗尽。我需要再次终止并重新启动它才能正常工作,但这样做会丢失队列中所有现有的消息。
我用来启动rabbitmq服务器的命令是:docker run --rm -it --hostname my-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
我使用的是持久消息和持久队列。
否。排队的人数将在70人左右。
每秒连接数可能在5到100 之间变化
我使用amqplib npm模块使用Nodejs与RabbitMQ交互。
我做错什么了吗?或者,如果使用docker映像,我应该直接在任何服务器上进行配置吗?有没有办法只删除acknowledged
消息?
提前谢谢。
这是根据rabbitmq官方文件对耐久性的定义
耐久性
队列可以是持久的,也可以是暂时的。持久队列的元数据存储在磁盘上,而临时队列的元数据尽可能存储在内存中。在某些协议(例如AMQP 0-9-1和MQTT(中,在发布时对消息进行了相同的区分。
在持久性很重要的环境和用例中,应用程序必须使用持久队列,并确保发布将已发布的消息标记为持久化
因此,如果您在消息部分使用耐久性,则意味着您正在将它们存储到存储器中。rabbitmq提供了一个可以确认消息的功能如果确认消息,它将从队列中删除。所以ack有两个选项:
-
使用自动确认模式{noAck:true}:
channel.cump(队列,函数(msg({//信息本身就在这里!}{noAck:true});
-
ack manualiy:
channel.cump(队列,函数(msg({//信息本身就在这里!//我可以手动确认channel.ack(消息(;}{noAck:false});
因此有一篇关于优化rabbitmq:https://www.cloudamqp.com/blog/2018-01-08-part2-rabbitmq-best-practice-for-high-performance.html