Назад | Перейти на главную страницу

RabbitMQ хранит сообщения в памяти (переполнение памяти)

У меня есть сервер RabbitMQ в кластере (2 узла). Все очереди являются надежными, зеркальными, а все сообщения настроены как постоянные.

Я написал приложение для синхронизации изменений базы данных по очередям RabbitMQ.

В большинстве случаев очередь пуста, потому что потребитель может читать изменения так быстро, как производитель может их произвести.

К сожалению, при начальной синхронизации (когда все строки из всех таблиц передаются) в очереди находится много сообщений (например, 10 ГБ), ожидающих использования, потому что чтение данных из базы данных в большинстве случаев происходит быстрее, чем запись. Я думал, что эти сообщения будут сохранены на диск, но похоже, что все сообщения хранятся также в ОЗУ. Итак, через некоторое время вся оперативная память используется (независимо от того, сколько у меня есть), и она начинает блокировать издателей.

Кто-нибудь знает, почему RabbitMQ хранит все долговечные и постоянные сообщения также в ОЗУ? Это «конструктивная» особенность?

Я пробовал использовать сообщения разного размера (от 512 КБ до 5 МБ). Результат был таким же. Кроме того, подключение / отключение потребителя или установка для него другого QOS не имеет никакого значения.

Версии: RabbitMQ 3.1.0, Erlang R14B04

Это особенность, даже если ваши сообщения постоянны, RabbitMQ будет хранить данные в ОЗУ, причина в том, что если ОЗУ достаточно, нет необходимости нести расходы на чтение с диска. RabbitMQ воля заменить их на диск под нехваткой памяти (даже если это не постоянное сообщение).

Ваши издатели блокируют из-за управления потоком, вы можете переключить настройку, которая запускает управление потоком, с помощью vm_memory_high_watermark.