Maison >interface Web >js tutoriel >Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud

Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud

青灯夜游
青灯夜游avant
2023-01-17 19:48:312311parcourir

Qu'est-ce qu'une file d'attente de messages ? L'article suivant vous présentera les concepts de base des files d'attente de messages et vous présentera comment utiliser les files d'attente de messages dans Node. J'espère qu'il vous sera utile !

Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud

1. File d'attente de messages

Qu'est-ce qu'une file d'attente de messages

Une file d'attente de messages est un conteneur qui enregistre les messages pendant le processus de transmission des messages. Il s'agit essentiellement d'une file d'attente (premier entré, premier sorti)

Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud

Message fait référence aux données qui doivent être transmises, qui peuvent être du texte, une chaîne ou un objet et d'autres informations. 消息指的是需要传输的数据,可以是一些文本,字符串,或者是对象等信息。

消息队列则是两个应用间的通信服务,消息的产生者将数据存放到消息队列中就可以立即返回,不需要等待消息的接收者应答。即:生产者保证数据插入队列,谁来取这条消息不需要管。消息的接收者则只专注于接受消息并处理。【相关教程推荐:nodejs视频教程编程教学

Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud

消息队列能做什么

  • 解耦 上面介绍了,消息队列将消息的生产者和消息的接收者分开,彼此都不受影响。

  • 异步 异步就是为了减少请求的响应时间,消息的生产者只需要处理简单的逻辑,并将数据放到消息队列中即可返回,复杂的逻辑,比如:数据库操作,IO操作由消息的接收者处理。

  • 削峰 消息队列应用在服务时,能将瞬时大量涌入的请求信息保存到消息队列中,并立即返回。再由消息的接收者根据数据处理请求。

  • 应用场景 游戏活动,秒杀活动,下单等会造成瞬时流量暴增的应用。

2.消息队列的概念

介绍完消息队列的基本信息,在开发消息队列之前先介绍一下消息队列的一些基本概念~

消息的生产者(producer)与消费者(customer)

上文提到的生产者消费者,提供的是

链接,通道与队列

  • 链接(connection):表示服务程序与消息队列之间的一条链接。一个服务程序可以创建多条链接

  • 通道(channel):消息队列链接之间的一个通,一个链接可以有多个通道

  • 队列(queue):消息队列中存放数据的队列,一个消息队列服务可以有多个队列。

总结一下,链接,通道队列之间的关系是这样的

Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud

交换机(exchange)

消息队列发送消息必须要有一个交换机,如果没有指定则用的是默认的交换机。交换机的作用就是将消息才推到对应的队列中。消息队列中一共有4种交换机

  • Direct: 指定队列模式,消息来了,只发给指定的Queue,其他Queue都收不到。

  • fanout: 广播模式,消息来了,就会发送给所有的队列。

  • topic: 模糊匹配模式,通过模糊匹配的方式进行相应转发。

  • header: 与Direct模式类似。

3.node使用rabbitMQ

安装rabbitMQ

  • 安装rabbitMQ可以通过官网上进行下载安装,传送门
  • MAC可以直接用brew命令安装
    brew install rabbitmq
  • 安装完成后启动rabbitmq服务

Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud

然后再本地中访问 http://localhost:15672/ 就可以看到rabbitmq服务的后台。初始的账号密码均为 guest

File d'attente des messages est un service de communication entre deux applications. Le générateur du message peut revenir immédiatement après avoir stocké les données dans la file d'attente des messages, sans attendre le messageRécepteur répond. Autrement dit : Producer garantit que les données sont insérées dans la file d'attente, et peu importe qui reçoit le message. Le destinataire du message se concentre uniquement sur la réception du message et son traitement. [Tutoriels associés recommandés : tutoriel vidéo nodejs, Enseignement de la programmation

Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœudUn article analysant brièvement comment utiliser la file d'attente de messages dans le nœud

Que peut faire la file d'attente des messages

  • 🎜🎜Découplage🎜 Comme introduit ci-dessus, la file d'attente des messages combine les producteurs et les producteurs des messages Les destinataires du message sont distincts et ne sont pas affectés les uns par les autres. 🎜
  • 🎜🎜Asynchrone🎜 L'asynchrone consiste à réduire le temps de réponse des requêtes. Le producteur de messages n'a besoin que de traiter une logique simple et de placer les données dans la file d'attente des messages pour les renvoyer, telles que : Opérations de base de données. et les opérations IO sont gérées par le 🎜récepteur du message🎜. 🎜
  • 🎜🎜Peak Shaving🎜 Lorsque l'application de file d'attente de messages est en cours de diffusion, elle peut enregistrer l'afflux instantané d'informations de demande dans la file d'attente de messages et le renvoyer immédiatement. La demande est ensuite traitée en fonction des données par le destinataire du message. 🎜
  • 🎜🎜Scénarios d'application🎜 Applications telles que des activités de jeu, des activités de vente flash, des commandes, etc. qui provoqueront une augmentation instantanée du trafic. 🎜

🎜2. Le concept de file d'attente de messages🎜🎜🎜Après avoir présenté les informations de base sur la file d'attente de messages, introduisons la file d'attente de messages avant de développer le message. file d'attente. Quelques concepts de base~🎜🎜🎜🎜Le producteur et le consommateur du message🎜🎜🎜🎜Le producteur et le consommateur mentionnés ci-dessus, sont fournis 🎜🎜🎜🎜 liens, canaux et files d'attente 🎜🎜🎜
  • 🎜Lien (connexion) : Représente un lien entre le programme de service et la file d'attente des messages. 🎜Un programme de service peut créer plusieurs liens🎜. 🎜
  • 🎜Canal : Un canal entre les liens de file d'attente de messages 🎜Un lien peut avoir plusieurs canaux🎜. 🎜
  • 🎜Queue (queue) : La file d'attente qui stocke les données dans la file d'attente des messages. Un service de file d'attente de messages peut avoir plusieurs files d'attente. 🎜
🎜Pour résumer, la relation entre les liens et les files d'attente des canaux est la suivante🎜🎜Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud🎜🎜🎜🎜Commutateur (échange)🎜🎜🎜🎜File d'attente des messages🎜Lors de l'envoi d'un message🎜, il doit y avoir un commutateur. S'il n'est pas spécifié, le commutateur par défaut est utilisé. Le rôle du commutateur est de pousser les messages vers la file d'attente correspondante. Il existe un total de 4 types de commutateurs dans la file d'attente des messages🎜
  • 🎜Direct : spécifiez le mode de file d'attente lorsqu'un message arrive, il sera uniquement envoyé à la file d'attente spécifiée et les autres files d'attente ne le recevront pas. . 🎜
  • 🎜fanout : mode diffusion, lorsqu'un message arrive, il sera envoyé à toutes les files d'attente. 🎜
  • 🎜sujet : Mode de correspondance floue, transfert correspondant via la correspondance floue. 🎜
  • 🎜header : similaire au mode Direct. 🎜

🎜3.node utilise RabbitMQ🎜🎜🎜🎜🎜Installer RabbitMQ🎜🎜🎜
  • L'installation de RabbitMQ peut être effectuée via le site officiel Téléchargez et installez, Portail
  • MAC peut directement utiliser la commande Brew pour installer
    /** product.js 消费者 */
    
    
    const amqplib = require('amqplib');
    const config = require('./config');
    
    const { connectUrl } = config;
    
    (async () => {
      const connection = await amqplib.connect(connectUrl);
    
      const channel = await connection.createChannel();
      const exchangeName = 'testExchange';
      const key = 'testQueue';
      const sendMsg = 'hello rabbitmq';
        
      // 知道交换机类型
      await channel.assertExchange(exchangeName, 'fanout', {
        durable: true,
      });
        
      // 指定一个队列
      await channel.assertQueue(key);
    
      for (let i = 0; i < 100; i++) {
        channel.publish(exchangeName, key, Buffer.from(`${sendMsg} ${i}`));
      }
    
      await channel.close();
      await connection.close();
    })();
  • Une fois l'installation terminée, démarrez le service Rabbitmq
🎜Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud🎜🎜Ensuite, visitez http://localhost:15672/ localement pour voir l'arrière-plan du service lapinmq. Le mot de passe initial du compte est invité🎜🎜🎜🎜🎜🎜🎜installation du projet de nœud amqplib🎜🎜🎜

amqplib是node中使用消息队列的一套工具,可以让我们快速地使用消息队列

地址:https://www.npmjs.com/package/amqplib

创建生产者

/** product.js 消费者 */


const amqplib = require(&#39;amqplib&#39;);
const config = require(&#39;./config&#39;);

const { connectUrl } = config;

(async () => {
  const connection = await amqplib.connect(connectUrl);

  const channel = await connection.createChannel();
  const exchangeName = &#39;testExchange&#39;;
  const key = &#39;testQueue&#39;;
  const sendMsg = &#39;hello rabbitmq&#39;;
    
  // 知道交换机类型
  await channel.assertExchange(exchangeName, &#39;fanout&#39;, {
    durable: true,
  });
    
  // 指定一个队列
  await channel.assertQueue(key);

  for (let i = 0; i < 100; i++) {
    channel.publish(exchangeName, key, Buffer.from(`${sendMsg} ${i}`));
  }

  await channel.close();
  await connection.close();
})();

运行后在后台可以看到新增了一个有100条消息的队列

Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud

创建消费者

/** customer.js 消费者 */

const amqplib = require(&#39;amqplib&#39;);
const config = require(&#39;./config&#39;);

const { connectUrl } = config;

(async () => {
  let connection = await amqplib.connect(connectUrl);
  const exchangeName = &#39;testExchange&#39;;
  const key = &#39;testQueue&#39;;
  // 创建两个通道
  const channel1 = await connection.createChannel();
  const channel2 = await connection.createChannel();
  // 指定一个交换机
  await channel1.assertExchange(exchangeName, &#39;fanout&#39;, {
    durable: true,
  });
  // 指定一个队列
  await channel1.assertQueue(key);
  await channel1.bindQueue(key, exchangeName, key);
  channel1.consume(key, (msg) => {
    console.log(&#39;channel 1&#39;, msg.content.toString());
  });

  await channel2.assertExchange(exchangeName, &#39;fanout&#39;, {
    durable: true,
  });
  await channel2.assertQueue(key);
  await channel2.bindQueue(key, exchangeName, key);
  channel2.consume(key, (msg) => {
    console.log(&#39;channel 2&#39;, msg.content.toString());
  });
})();

执行后可以看到,两个通道可以同时工作接收消息

Un article analysant brièvement comment utiliser la file d'attente de messages dans le nœud

更多node相关知识,请访问:nodejs 教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer