O que é uma fila de mensagens?
Uma fila de mensagens é um contêiner que salva mensagens durante o processo de transmissão de mensagens. É essencialmente uma fila (primeiro a entrar, primeiro a sair).
消息
refere-se aos dados que precisam ser transmitidos, que podem ser algum texto, string ou objeto e outras informações.
消息队列
é um serviço de comunicação entre duas aplicações.产生者
da mensagem pode devolvê-la imediatamente após armazenar os dados na fila de mensagens, sem esperar接收者
da mensagem. Ou seja:生产者
garante que os dados sejam inseridos na fila, e não importa quem recebe a mensagem.接收者
da mensagem se concentra apenas em recebê-la e processá-la.
Que
desacoplamento a fila de mensagens pode fazer Conforme apresentado acima, a fila de mensagens separa o produtor da mensagem e o receptor da mensagem, e nenhum deles é afetado pelo outro.
Assíncrono Assíncrono visa reduzir o tempo de resposta das solicitações. O produtor da mensagem só precisa processar a lógica simples e colocar os dados na fila de mensagens para retornar. Lógica complexa, como operações de banco de dados e operações de IO, são tratadas pelo receptor. a mensagem.
Redução de pico Quando o aplicativo de fila de mensagens está atendendo, ele pode salvar o fluxo instantâneo de informações de solicitação na fila de mensagens e devolvê-lo imediatamente. A solicitação é então processada com base nos dados do destinatário da mensagem.
Cenários de aplicação: atividades de jogos, atividades de venda relâmpago, realização de pedidos, etc., que causarão aumento instantâneo de tráfego.
Depois de apresentar as informações básicas da fila de mensagens, antes de desenvolver a fila de mensagens, vamos apresentar alguns conceitos básicos de fila de mensagens ~
produtor (produtor) e consumidor (cliente) de mensagens生产者
e消费者
mencionados acima
.
fornecer
links, canais e filas
Conexão: representa um link entre o programa de serviço e a fila de mensagens. Um programa de serviço pode criar vários links .
Canal: um canal entre links de fila de mensagens Um link pode ter vários canais .
Fila: uma fila que armazena dados em uma fila de mensagens. Um serviço de fila de mensagens pode ter várias filas.
Resumindo, a relação entre links e filas de canais é assim
A fila de mensagensdo Exchange (troca)
deve ter uma troca ao enviar mensagens . Se não for especificado, a troca padrão será usada. A função do switch é enviar mensagens para a fila correspondente. Há um total de 4 tipos de switches na fila de mensagens
: Direto: Especifique o modo de fila Quando uma mensagem chegar, ela será enviada apenas para a Fila especificada e outras Filas não a receberão.
fanout: Modo Broadcast, quando chega uma mensagem, ela será enviada para todas as filas.
tópico: modo de correspondência difusa, encaminhamento correspondente por meio de correspondência difusa.
cabeçalho: semelhante ao modo direto.
preparar instalar coelhomq
Em seguida, visite http://localhost:15672/ localmente para ver o histórico do serviço RabbitMQ. A senha inicial da conta é guest
amqplib é um conjunto de ferramentas para usar filas de mensagens no nó, o que nos permite usar filas de mensagens rapidamente.
Criar produtorEndereço: https://www.npmjs.com/package/amqplib
/**produto.js consumidor*/ const amqplib = require('amqplib'); constconfig = require('./config'); const {conectUrl} =config; (assíncrono() => { conexão const = aguarda amqplib.connect(connectUrl); const canal = aguarda conexão.createChannel(); const exchangeName = 'testExchange'; chave const = 'testQueue'; const sendMsg = 'olá coelhomq'; // Conheça o tipo de switch await channel.assertExchange(exchangeName, 'fanout', { durável: verdadeiro, }); //Especifique uma fila await channel.assertQueue(key); for (seja i = 0; i < 100; i++) { canal.publish(exchangeName, chave, Buffer.from(`${sendMsg} ${i}`)); } aguarde canal.close(); aguarde conexão.close(); })();
Após a execução, você pode ver em segundo plano que uma nova fila com 100 mensagens foi adicionada.
Criar consumidor/** cliente.js consumidor*/ const amqplib = require('amqplib'); constconfig = require('./config'); const {conectUrl} =config; (assíncrono() => { deixe conexão = aguarde amqplib.connect(connectUrl); const exchangeName = 'testExchange'; chave const = 'testQueue'; //Cria dois canais const channel1 = await connection.createChannel(); const canal2 = aguarda conexão.createChannel(); //Especifique uma troca await channel1.assertExchange(exchangeName, 'fanout', { durável: verdadeiro, }); //Especifique uma fila await channel1.assertQueue(key); aguarde canal1.bindQueue(chave, exchangeName, chave); canal1.consume(chave, (msg) => { console.log('canal 1', msg.content.toString()); }); aguarde canal2.assertExchange(exchangeName, 'fanout', { durável: verdadeiro, }); aguarde canal2.assertQueue(chave); aguarde canal2.bindQueue(chave, exchangeName, chave); canal2.consume(chave, (msg) => { console.log('canal 2', msg.content.toString()); }); })();
Após a execução, você pode ver que os dois canais podem funcionar ao mesmo tempo para receber mensagens.