RabbitMQ é um excelente projeto de código aberto que permite entregar centenas de milhares de mensagens por segundo ao seu aplicativo de forma rápida e eficiente. A entrada a seguir apresenta a maneira como você pode colocar um cluster RabbitMQ de três hosts separados. Para esse fim, usaremos o Docker e nos conectaremos ao cluster pronto usando o Node.js.

sobre RabbitMQ

RabbitMQ é um sistema de enfileiramento baseado no protocolo AMQP, o próprio sistema foi escrito em Erlang. Graças ao uso desta linguagem, o RabbitMQ é ideal para uso como um barramento de dados central na arquitetura de microsserviços. Esse trilho fornece um ótimo substrato para aplicações que permitem uma grande faixa dinâmica de desenvolvimento no paradigma DDD e CQRS. Como o barramento de dados (fila de mensagens) é a espinha dorsal da arquitetura, é importante que esteja sempre disponível e resistente a falhas. A arquitetura redundante se torna a escolha natural, ou seja, a replicação de dados em nós executivos separados.

a replicação no RabbitMQ é suportada nativamente no modo mestre-escravo. Isso significa que RabbitMQ sempre irá selecionar um nó para cada fila criada e ele irá redirecionar todas as mensagens para o verão, bem como recuperar mensagens dele para a leitura da fila, os outros nós (escravos), agem como um duplicador de dados pronto para assumir o papel de nó mestre em todos os momentos. Embora o maior sentido seja a replicação quando os nós estão espalhados em diferentes máquinas físicas, neste caso usarei um exemplo de replicação dentro da mesma máquina. RabbitMQ devido ao seu propósito-isto é, centenas de milhares de mensagens suportadas por segundo, não é preferido no modo de replicação em máquinas que não estão no mesmo rack de servidor. Isso se deve ao fato de que as mensagens permanecem na fila muito curtas e as suposições não devem ir além da RAM, replicá-las com base em uma conexão de rede em uma parte diferente do data center ou em um data center completamente diferente significaria reduções drásticas no desempenho, e nesta classe de sistema não pode ser oferecida. Além disso, ao colocar nós RabbitMQ próximos uns dos outros, minimizamos o risco da chamada partição de rede (o que é muito improvável no caso de uma roleta), ou seja, o fenômeno de interromper a comunicação entre nós de tal forma que pelo menos 2 nós de todo o cluster se considerem mestres. Mais sobre a partição de rede no contexto do RabbitMQ pode ser lido aqui.

portanto, a regra baseada na prática está colocando RabbitMQ no modo de replicação apenas no mesmo data center.

baixando imagens do Docker

presumo que você saiba o que é o Docker e como usá-lo, porque na próxima parte da entrada o usaremos amplamente

para começar, Comece baixando as imagens RabbitMQ apropriadas (junto com o plugin do painel de administração) e o nó.js, para isso, use os seguintes comandos:

docker pull 3.6.6-managementdocker pull node:11.10.1

o programa de Configuração RabbitMQ hosts

Para efeitos de apresentação, vamos lançar um RabbitMQ imagem à qual vai se conectar com o docker exec comando e invocar a shell bash para ser capaz de executar a configuração em nosso caminho. Vamos usar o comando:

docker run --hostname rabbit --name rabbit --rm -ti --net="host" rabbitmq:3.6.6-management /bin/bash

o comando acima executará a imagem do RabbitMQ que será excluída depois de sair do shell. A instância será conectada à nossa interface de rede, portanto, não precisamos nos preocupar com o encaminhamento de porta. Se a concha [email protected]:/# apareceu aos nossos olhos, significa que tudo correu bem.

o próximo passo é executar três processos RabbitMQ em portas separadas, cada processo receberá um nome exclusivo.

RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=rabbit rabbitmq-server -detachedRABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=hare rabbitmq-server -detachedRABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=john rabbitmq-server -detached

em seguida, com a ajuda do rabbitmqctl, anexamos os dois nós à raiz com o nome rabbit:

rabbitmqctl -n hare stop_apprabbitmqctl -n hare join_cluster [email protected]`hostname -s`rabbitmqctl -n hare start_apprabbitmqctl -n john stop_apprabbitmqctl -n john join_cluster [email protected]`hostname -s`rabbitmqctl -n john start_app

afinal, podemos abrir o navegador e digitar o endereço http://localhost:15672 para verificar se tudo correu bem, o console de gerenciamento de cluster deve apontar para todos os nós como na tela abaixo.

importante. Não desative o shell do contêiner do RabbitMQ, pois isso o removerá (a opção –rm no comando de inicialização do Docker)

temos a última coisa a fazer, embora o cluster RabbitMQ esteja pronto, precisamos configurar as políticas apropriadas. Esta função é implementada usando o painel de administração, mais informações sobre alta disponibilidade (HA) no RabbitMQ podem ser lidas na documentação.

acima é um exemplo de configuração de política HA. E Abaixo está o método de verificação. O número + 2 no nome do nó significa o número de hosts separados para os quais a fila é replicada.

instalação e download da biblioteca amqp no nó.js

o próximo passo é iniciar a instância do contêiner Docker com o nó.imagem js, para esse fim, execute o seguinte comando que também compartilha a interface de rede.

docker run -ti --rm --net="host" node:11.10.1 /bin/bash

então, no local escolhido pelo nosso site (por exemplo /home), criamos um diretório no qual colocamos os scripts necessários e instalamos a biblioteca amqp-connection-manager que permite a conexão ao RabbitMQ (ou outro sistema que implementa o protocolo AMQP) a partir do nível do nó.js.

npm install --save amqp-connection-manager

além disso, a biblioteca permite a adição de vários RabbitMQ endereços de host fornecendo um mecanismo para se reconectar em caso de falha de qualquer host. Esta é uma funcionalidade muito útil, porque se preocupa com uma conexão adequada com RabbitMQ e, no caso de uma falha, pode detectar mensagens na memória até que a conexão apareça de volta.

produtor de amostra-código do consumidor

agora que temos todos os componentes preparados, podemos começar a criar um código simples responsável por criar e receber mensagens. Para isso, criaremos dois arquivos e os preencheremos com um código.

produtor.js-o script se conecta à instância RabbitMQ e começa a enviar 10 Mensagens por segundo.

let q = 'tasks';let amqp = require('amqp-connection-manager');function sleep(ms) { if(ms setTimeout(resolve, ms));}let main = async () => { var connection = amqp.connect(); var channelWrapper = connection.createChannel({ json: true, setup: function(channel) { return channel.assertQueue(q, { durable: true }); } }); console.log('Starting message stream') while (true) { await channelWrapper.sendToQueue(q, { value: Math.random() }) await sleep(100) }}main()

consumidor.js-o script se conecta à instância RabbitMQ e começa a ler mensagens da fila.

let q = 'tasks';let amqp = require('amqp-connection-manager');let main = async () => { var connection = amqp.connect(); var channelWrapper = connection.createChannel({ json: true, setup: function(channel) { return channel.assertQueue(q, { durable: true }); } }); channelWrapper.addSetup(function(channel) { return Promise.all() });}main()

os arquivos criados dessa maneira podem ser executados separadamente usando o Node.js e watch as consumer.js recebem dados produzidos por producer.js. Para verificar a operação de replicação no cluster RabbitMQ, encorajo você a desativar durante a troca de dados por scripts um dos processos RabbitMQ para ver como a falha será tratada e como RabbitMQ selecionará o novo mestre e redirecionará as mensagens de acordo.

rabbitmqctl -n john stop_app

desativar uma das instâncias do RabbitMQ não afeta a produção ou o download de mensagens. As filas são replicadas automaticamente e a conexão recuperada sem a necessidade de implementar seus próprios mecanismos.

em resumo, o RabbitMQ é um ótimo sistema de filas que garante alta disponibilidade após uma configuração adequada que não causa muitos problemas. Um grande número de bibliotecas em muitos idiomas, por exemplo, Node.js, PHP, Java, Python, Golang, C / C++, permite fácil implementação do sistema no projeto. Recomendo a todos que leiam a documentação que explica muito claramente os problemas relacionados ao funcionamento do sistema e sua configuração correta, que é realmente extensa.

todo o código é mantido no repositório no Github

pesquisas semelhantes: nodejs rabbitmq / nodejs queue / rabbitmq queue nodejs