aumentar o rendimento do RabbitMQ em várias máquinas
-
20-12-2019 - |
Pergunta
Estou usando logstash e elasticsearch para construir um sistema de log.RabbitMQ usado para enfileirar mensagens de log entre dois logstashs.
O caminho da mensagem é como abaixo:
source log -> logstash -> rabbitMQ -> logstash(parse) -> elasticsearch
Mas eu descobri que, não importa quanta máquina eu adicionei ao RabbitMQ, ele usa apenas um recurso de máquina para processar mensagens.
Encontrei um artigo que diz que o cluster apenas aumenta a confiabilidade e a redundância para evitar a perda de mensagens.
Mas o que eu quero é aumentar a taxa de transferência (entrada e saída) de todo o cluster RabbitMQ adicionando mais máquinas.
Como configuro meu cluster RabbitMQ para aumentar sua produtividade?
Quaisquer comentários são apreciados.
--
PS.preciso adicionar mais informações aqui.
No limite do meu sistema, o teste é, posso receber mensagens de 7.000/s e gerar mensagens de 1.700/s em um sistema de cluster de 4 máquinas, mas não habilitar HA e apenas vincular 1 troca a 1 fila e a fila apenas vincular a 1 nó.acho que 1 fila vinculada a 1 nó é o gargalo de transferência.E é difícil alterar a chave de roteamento agora, então temos apenas uma chave de roteamento e queremos distribuir mensagens para diferentes nós para aumentar o rendimento de todo o sistema.
abaixo está minha configuração do indexador logstash
rabbitmq {
codec => "json"
auto_delete => false
durable => true
exchange => "logstash-exchange"
key => "logstash-routingKey"
queue => "logstash-queue"
host => "VIP-of-rabbitMQ"
user => "guest"
password => "guest"
passive => false
exclusive => false
threads => 4
prefetch_count => 512 }
Solução
Você precisa adicionar mais filas.Eu acho que você está usando apenas uma fila.Em outras palavras, você está vinculado a um processo erlang.O que você quer é usar várias filas:
Aqui está um exemplo rápido e sujo de como adicionar alguma lógica ao logstash para enviar mensagens para filas diferentes:
filter {
# check if path contains source subfolder
if "foo" in [path] {
mutate { add_field => [ "source", "foo"] }
}
else if "bar" in [path] {
mutate { add_field => [ "source", "bar"] }
}
else {
mutate { add_field => [ "source", "unknown"] }
}
}
Então na sua saída:
rabbitmq {
debug => true
durable => true
exchange_type => "direct"
host => "your_rabbit_ip"
key => "%{source}"
exchange => "my_exchange"
persistent => true
port => 5672
user => "logstash"
password => "xxxxxxxxxx"
workers => 12
}
Atualizada:
Dê uma olhada nos repositórios que esse cara tem:https://github.com/simonmacmullen
Acho que você vai se interessar por este:https://github.com/simonmacmullen/random-exchange
This exchange type is for load-balancing among consumers.