我在集群中有RabbitMQ服务器(2个节点)。 所有的队列都是持久的,镜像的,所有的消息都被设置为持久的。
我编写了应用程序来同步RabbitMQ队列上的数据库更改。
在大多数情况下,队列是空的,因为消费者可以像生产者一样快地读取变化。
不幸的是,在初始同步时(当所有表中的所有行都被传输时),队列中有很多消息(例如10GB)正在等待消耗,因为从数据库中读取数据在大多数情况下比写入更快。 我以为这些消息将被保存到磁盘,但似乎所有的消息也存储在RAM中。 所以在使用所有RAM之后(无论我有多less),它开始阻止发布者。
有谁知道为什么RabbitMQ将所有持久和持久的消息也保存在RAM中? 这是“devise”function吗?
我试图使用不同的消息大小(从512kB到5MB)。 结果是一样的。 也有消费者连接/没有连接或设置不同的QOS,没有任何区别。
版本:RabbitMQ 3.1.0,Erlang R14B04
这是一个function,即使你的消息是持久的,RabbitMQ将把东西保存在RAM中,原因是如果有足够的RAM,就不需要花费读取磁盘的代价。 RabbitMQ 将在内存压力下将其交换到磁盘(即使它不是一个持久的消息)。
您的发布商由于stream量控制而被阻塞,您可以使用vm_memory_high_watermark切换触发stream量控制的设置。