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

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

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

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

1.消息隊列

什么是消息隊列

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

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

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

消息隊列則是兩個應用間的通信服務,消息的產生者將數據存放到消息隊列中就可以立即返回,不需要等待消息的接收者應答。即:生產者保證數據插入隊列,誰來取這條消息不需要管。消息的接收者則只專注于接受消息并處理。【相關教程推薦: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號
亚洲一区二区三区国产精品无码| 国产拍揄自揄精品视频| 99re视频热这里只有精品7| 亚洲精品自在线拍| 99久久99久久久精品久久| 国产精品免费高清在线观看| 日韩精品无码一区二区三区四区 | 99久久这里只有精品| 亚洲精品tv久久久久| 人妻精品久久久久中文字幕| 日韩国产成人精品视频| 日韩人妻无码一区二区三区 | 亚洲国产第一站精品蜜芽| 99久久精品国产麻豆| 久久噜噜久久久精品66| 精品人妻少妇一区二区三区在线| 亚洲精品视频在线观看你懂的| 老司机免费午夜精品视频| 全国精品一区二区在线观看| 日韩精品无码免费视频| 西瓜精品国产自在现线| 日韩精品一区二区三区视频| 日韩a在线观看免费观看| 日本精品一区二区三区在线视频 | 久久久国产乱子伦精品作者| 日韩精品无码一区二区三区不卡| 久久99热66这里只有精品一| 久久国产精品亚洲综合| 亚洲2022国产成人精品无码区| 国产精品福利自产拍在线观看 | 日韩精品一区二区三区在线观看l| 国产精品自在线拍国产手机版| 国产乱人伦精品一区二区在线观看 | 久久久精品人妻一区二区三区 | 91亚洲国产成人久久精品| 666精品国产精品亚洲| 91麻精品国产91久久久久| 2021精品国产综合久久| 无码日韩精品一区二区免费| 久久精品视频在线看99| 无码国产精品一区二区高潮|