O RabbitMQ mantém mensagens na memória (estouro de memória)

1

Eu tenho o servidor RabbitMQ no cluster (2 nós). Todas as filas são duráveis, espelhadas e todas as mensagens são definidas como persistentes.

Eu escrevi o aplicativo para sincronizar as alterações do banco de dados nas filas do RabbitMQ.

Na maioria dos casos, a fila está vazia porque o consumidor pode ler as alterações com a mesma velocidade que o produtor pode produzir.

Infelizmente na sincronização inicial (quando todas as linhas de todas as tabelas são transferidas) há muitas mensagens na fila (10 GB, por exemplo) esperando para serem consumidas, porque a leitura de dados do banco de dados é, na maioria dos casos, mais rápida do que a escrita. Eu pensei que essas mensagens serão salvas no disco, mas parece que todas as mensagens são armazenadas também na RAM. Então, depois de tudo, toda a RAM é usada (não importa o quanto eu tenha) e ela começa a bloquear os editores.

Alguém sabe por que o RabbitMQ mantém todas as mensagens duráveis e persistentes também na RAM? É o recurso "por design"?

Eu tentei usar tamanhos de mensagens diferentes (de 512kB a 5MB). Resultado foi o mesmo. Além disso, ter um consumidor conectado / não conectado ou definir um QOS diferente não faz diferença.

Versões: RabbitMQ 3.1.0, Erlang R14B04

    
por Tomáš Jecha 13.02.2014 / 17:40

1 resposta

0

É um recurso, mesmo que suas mensagens sejam persistentes, o RabbitMQ manterá as coisas na RAM, o raciocínio é que, se houver RAM suficiente, não haverá necessidade de incorrer no custo de uma leitura de disco. RabbitMQ irá trocar estes para o disco sob pressão de memória (mesmo quando não for uma mensagem persistente).

Seus editores estão bloqueando devido ao controle de fluxo, você pode alternar a configuração que aciona o controle de fluxo com vm_memory_high_watermark .

    
por 16.04.2015 / 19:42