У меня есть сервер RabbitMQ в кластере (2 узла). Все очереди являются надежными, зеркальными, а все сообщения настроены как постоянные.
Я написал приложение для синхронизации изменений базы данных по очередям RabbitMQ.
В большинстве случаев очередь пуста, потому что потребитель может читать изменения так быстро, как производитель может их произвести.
К сожалению, при начальной синхронизации (когда все строки из всех таблиц передаются) в очереди находится много сообщений (например, 10 ГБ), ожидающих использования, потому что чтение данных из базы данных в большинстве случаев происходит быстрее, чем запись. Я думал, что эти сообщения будут сохранены на диск, но похоже, что все сообщения хранятся также в ОЗУ. Итак, через некоторое время вся оперативная память используется (независимо от того, сколько у меня есть), и она начинает блокировать издателей.
Кто-нибудь знает, почему RabbitMQ хранит все долговечные и постоянные сообщения также в ОЗУ? Это «конструктивная» особенность?
Я пробовал использовать сообщения разного размера (от 512 КБ до 5 МБ). Результат был таким же. Кроме того, подключение / отключение потребителя или установка для него другого QOS не имеет никакого значения.
Версии: RabbitMQ 3.1.0, Erlang R14B04
Это особенность, даже если ваши сообщения постоянны, RabbitMQ будет хранить данные в ОЗУ, причина в том, что если ОЗУ достаточно, нет необходимости нести расходы на чтение с диска. RabbitMQ воля заменить их на диск под нехваткой памяти (даже если это не постоянное сообщение).
Ваши издатели блокируют из-за управления потоком, вы можете переключить настройку, которая запускает управление потоком, с помощью vm_memory_high_watermark
.