站長資訊網
最全最豐富的資訊網站

一文淺析node中如何使用消息隊列

什么是消息隊列?下面本篇文章帶大家了解一下消息隊列的基本概念,介紹一下node中如何使用消息隊列,希望對大家有所幫助!

一文淺析node中如何使用消息隊列

1.消息隊列

什么是消息隊列

消息隊列就是消息的傳輸過程中保存消息的容器,本質是一個隊列(先進先出)

一文淺析node中如何使用消息隊列

消息指的是需要傳輸的數據,可以是一些文本,字符串,或者是對象等信息。

消息隊列則是兩個應用間的通信服務,消息的產生者將數據存放到消息隊列中就可以立即返回,不需要等待消息的接收者應答。即:生產者保證數據插入隊列,誰來取這條消息不需要管。消息的接收者則只專注于接受消息并處理?!鞠嚓P教程推薦:nodejs視頻教程、編程教學】

一文淺析node中如何使用消息隊列

消息隊列能做什么

  • 解耦 上面介紹了,消息隊列將消息的生產者和消息的接收者分開,彼此都不受影響。

  • 異步 異步就是為了減少請求的響應時間,消息的生產者只需要處理簡單的邏輯,并將數據放到消息隊列中即可返回,復雜的邏輯,比如:數據庫操作,IO操作由消息的接收者處理。

  • 削峰 消息隊列應用在服務時,能將瞬時大量涌入的請求信息保存到消息隊列中,并立即返回。再由消息的接收者根據數據處理請求。

  • 應用場景 游戲活動,秒殺活動,下單等會造成瞬時流量暴增的應用。

2.消息隊列的概念

介紹完消息隊列的基本信息,在開發消息隊列之前先介紹一下消息隊列的一些基本概念~

消息的生產者(producer)與消費者(customer)

上文提到的生產者消費者,提供的是

鏈接,通道與隊列

  • 鏈接(connection):表示服務程序與消息隊列之間的一條鏈接。一個服務程序可以創建多條鏈接。

  • 通道(channel):消息隊列鏈接之間的一個通,一個鏈接可以有多個通道。

  • 隊列(queue):消息隊列中存放數據的隊列,一個消息隊列服務可以有多個隊列。

總結一下,鏈接,通道隊列之間的關系是這樣的

一文淺析node中如何使用消息隊列

交換機(exchange)

消息隊列發送消息必須要有一個交換機,如果沒有指定則用的是默認的交換機。交換機的作用就是將消息才推到對應的隊列中。消息隊列中一共有4種交換機

  • Direct: 指定隊列模式,消息來了,只發給指定的Queue,其他Queue都收不到。

  • fanout: 廣播模式,消息來了,就會發送給所有的隊列。

  • topic: 模糊匹配模式,通過模糊匹配的方式進行相應轉發。

  • header: 與Direct模式類似。

3.node使用rabbitMQ

安裝rabbitMQ

  • 安裝rabbitMQ可以通過官網上進行下載安裝,傳送門
  • MAC可以直接用brew命令安裝
    brew install rabbitmq
    登錄后復制

  • 安裝完成后啟動rabbitmq服務

一文淺析node中如何使用消息隊列

然后再本地中訪問 http://localhost:15672/ 就可以看到rabbitmq服務的后臺。初始的賬號密碼均為 guest

一文淺析node中如何使用消息隊列

node項目安裝amqplib

amqplib是node中使用消息隊列的一套工具,可以讓我們快速地使用消息隊列

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

創建生產者

/** 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(); })();
登錄后復制

運行后在后臺可以看到新增了一個有100條消息的隊列

一文淺析node中如何使用消息隊列

創建消費者

/** customer.js 消費者 */  const amqplib = require('amqplib'); const config = require('./config');  const { connectUrl } = config;  (async () => {   let connection = await amqplib.connect(connectUrl);   const exchangeName = 'testExchange';   const key = 'testQueue';   // 創建兩個通道   const channel1 = await connection.createChannel();   const channel2 = await connection.createChannel();   // 指定一個交換機   await channel1.assertExchange(exchangeName, 'fanout', {     durable: true,   });   // 指定一個隊列   await channel1.assertQueue(key);   await channel1.bindQueue(key, exchangeName, key);   channel1.consume(key, (msg) => {     console.log('channel 1', msg.content.toString());   });    await channel2.assertExchange(exchangeName, 'fanout', {     durable: true,   });   await channel2.assertQueue(key);   await channel2.bindQueue(key, exchangeName, key);   channel2.consume(key, (msg) => {     console.log('channel 2', msg.content.toString());   }); })();
登錄后復制

執行后可以看到,兩個通道可以同時工作接收消息

一文淺析node中如何使用消息隊列

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
日韩精品中文字幕第2页| 麻豆一区二区三区精品视频| 精品日韩二区三区精品视频| 久久精品嫩草影院| 亚洲av日韩精品久久久久久a| 97久久久久人妻精品专区| 国产精品综合色区在线观看| 日韩精品少妇无码受不了| 四虎亚洲精品高清在线观看| 久久青青草原国产精品免费| 这里只有精品视频| 日韩精品福利视频一区二区三区| 91精品久久国产青草| 99久久精品国产高清一区二区| 日韩AV无码中文无码不卡电影| 国产成人精品久久久久 | 高清精品一区二区三区一区| 国产精品igao视频网网址| 无码国产亚洲日韩国精品视频一区二区三区 | 精品久久洲久久久久护士| 久久国产热精品波多野结衣AV| 在线精品亚洲一区二区小说| 精品中文字幕一区二区三区四区| 精品国产AV色欲果冻传媒| 久久精品免费一区二区| 国产精品国色综合久久| 精品国产三级a乌鸦在线观看| 久久精品国产亚洲av日韩| 国产精品美女一区二区三区| 精品国产伦一区二区三区在线观看 | 中文字幕精品三区无码亚洲| 性欧洲精品videos| 奇米影视国产精品四色| 亚欧洲精品在线视频免费观看| 国产精品中文字幕在线| 日韩精品专区在线影院重磅| 亚洲精品自拍视频| 国99精品无码一区二区三区| 国产一区二区三区在线观看精品| 日韩视频中文字幕精品偷拍| 日韩精品无码视频一区二区蜜桃|