0

我正在使用 RabbitMQ 管理泊坞窗图像。问题在于大约 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消息?

提前致谢。

4

1 回答 1

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

于 2020-11-13T18:58:37.637 回答