【Node.js】初识 RabbitMQ

news2024/9/23 3:13:15

概述

MQ 顾名思义,是消息队列。

RabbitMQ 是一个消息队列系统,用于实现异步通信。基于 AMQP。AMQP(高级消息队列协议) 实现了对于消息的排序,点对点通讯,和发布订阅,保持可靠性、保证安全性。

在 Node.js 的微服务架构中,RabbitMQ 可以作为服务之间的消息传递中介,帮助解耦系统组件并提升系统的扩展性和可靠性。支持主流操作系统和多种语言。

通过 RabbitMQ,你可以让一个服务发送消息到队列,另一个服务从队列中消费消息。这种机制使服务之间可以异步通信,特别适合那些不需要立即响应的场景,例如订单处理、日志记录、通知推送等。

下面通过一个电商平台的例子讲解如何使用 Node.js 和 RabbitMQ 来实现异步的订单处理。

RabbitMQ 概念

  • Producer(生产者):发送消息到 RabbitMQ 的服务(到交换器中)。
  • Consumer(消费者):从 RabbitMQ 队列中接收和处理消息的服务。
  • Message(消息):在RabbitMQ中,消息是传递的基本单元。它由消息体和可选的属性组成。
  • Queue(队列):消息存储的地方,生产者把消息发送到队列,消费者从队列中接收消息。
  • Exchange(交换器):RabbitMQ 用于接收生产者的消息,并根据某种规则将其路由到一个或多个队列。
  • Routing Key(路由键):用于帮助交换器将消息路由到正确的队列。
    在这里插入图片描述

上图来源:小满zs

RabbitMQ 的安装

erlang 的安装

Rabbit MQ的依赖环境 erlang ,MQ是基于这个语言开发的。

官网下载erlang:erlang

在这里插入图片描述

然后一直选择默认即可。

安装完成之后,配置一个环境变量。

在这里插入图片描述

在这里插入图片描述

power shell 测试:

在这里插入图片描述

RabbitMQ 的安装

RabbitMQ官网

在这里插入图片描述

然后一直默认即可。

之后还是需要配置下环境变量。

还是类似的操作:

在这里插入图片描述

安装 RabbitMQ 的可视化面板

直接在终端 安装MQ插件拥有可视化面板:

rabbitmq-plugins enable rabbitmq_management

在这里插入图片描述

启动 MQ ,MQ 默认使用端口为 5672:

rabbitmq-server.bat start

在这里插入图片描述

这里有部分同学可能启动失败,是因为在安装 RabbitMQ 的时候,最后一步默认安装后启动 RabbitMQ 被自动勾选了,所以我们需要打开服务,手动停止 RabbitMQ 服务,然后使用 MQ 的插件手动启动 服务就可以了。

在这里插入图片描述

启动好后该终端不要关闭,访问 http://localhost:15672/#/ 账号密码都是 guest:

在这里插入图片描述

就进入了 MQ 的可视化界面。

Node.js 使用 RabbitMQ

这边它的官网也是由很多语言的使用教程 JavaScript使用 MQ:

在这里插入图片描述

安装必要的依赖

在 Node.js 中使用 RabbitMQ,通常会用到 amqplib 这个库来与 RabbitMQ 进行交互。

npm install amqplib express

express 帮助我们快速启动服务。

RabbitMQ 示例:异步订单处理

我们以订单服务为例来说明如何通过 RabbitMQ 实现异步订单处理。假设系统中有两个服务:

  • 订单服务(Order Service):负责接收用户订单,并将订单消息发送到 RabbitMQ 队列。
  • 支付服务(Payment Service):从 RabbitMQ 队列中接收订单信息并处理支付。
订单服务(生产者)

订单服务接收到用户创建订单的请求后,会将订单信息发送到 RabbitMQ 的队列中,而不需要立即处理支付流程。

// order-service.js 生产者
const express = require('express');
const amqp = require('amqplib/callback_api');
const app = express();
app.use(express.json());

let channel = null;

// 连接 RabbitMQ 并创建一个频道
amqp.connect('amqp://localhost:5672', (error, connection) => {
    if (error) {
        throw error;
    }
    connection.createChannel((err, ch) => {
        if (err) {
            throw err;
        }
        channel = ch;
        // 创建队列
        const queue = 'orderQueue';
        channel.assertQueue(queue, { durable: false });
    });
});

// 订单服务 API
app.post('/order', (req, res) => {
    const order = { userId: req.body.userId, productId: req.body.productId };

    // 将订单发送到 RabbitMQ 队列
    channel.sendToQueue('orderQueue', Buffer.from(JSON.stringify(order)), {
        persistent: true // 持久化消息(避免服务器宕机) 底层原理是 存储在磁盘
    });
    console.log("Order sent to queue:", order);

    res.status(201).json({ message: 'Order placed successfully!' });
});

// 启动订单服务
app.listen(3001, () => {
    console.log('Order service is running on port 3001');
});

在这里,订单服务通过 sendToQueue() 方法将订单信息发送到名为 orderQueue 的队列中。

支付服务(消费者)

支付服务从 orderQueue 中获取订单,并处理订单支付。

// payment-service.js 消费者
const amqp = require('amqplib/callback_api');

// 连接 RabbitMQ 并创建一个频道
amqp.connect('amqp://localhost:5672', (error, connection) => {
    if (error) {
        throw error;
    }
    connection.createChannel((err, channel) => {
        if (err) {
            throw err;
        }

        const queue = 'orderQueue';

        // 确保队列存在
        channel.assertQueue(queue, {
            durable: false // 队列和交换机的持久化
        });

        // 从队列中消费消息
        console.log('Waiting for messages in %s. To exit press CTRL+C', queue);
        channel.consume(queue, (msg) => {
            const order = JSON.parse(msg.content.toString());
            console.log('Received order:', order);

            // 假设支付处理逻辑
            setTimeout(() => {
                console.log('Payment processed for order:', order);
                channel.ack(msg); // 确认消息处理完成
            }, 1000);
        }, {
            noAck: false // 确保消息处理完成后才确认
        });
    });
});

支付服务通过 consume() 方法从 orderQueue 中获取订单消息,并处理支付逻辑。每次支付处理完成后,支付服务会调用 ack() 方法确认消息已经成功处理。

开启一个 http 请求,进行测试:

POST http://localhost:3001/order HTTP/1.1
Content-Type: application/json

{
  "userId": 1,
  "productId": 1
}

响应:

{
  "message": "Order placed successfully!"
}

在这里插入图片描述
在这里插入图片描述

RabbitMQ 的工作流程

  1. 用户通过订单服务创建订单。
  2. 订单服务将订单信息发送到 RabbitMQ 队列中。
  3. 支付服务从队列中接收订单消息,并异步处理订单支付。

这个流程使订单服务和支付服务解耦。订单服务只需要把消息发送到队列,支付服务则在后台处理支付逻辑。这样的架构具有以下优势:

  • 异步处理:订单服务不需要等待支付完成,响应用户请求变得更加快速。
  • 解耦:订单服务和支付服务可以独立扩展和维护,互不依赖。
  • 负载均衡:可以轻松地扩展多个支付服务实例,从同一个队列中消费消息,提升系统的处理能力。
  • 而且服务之间使用不同的语言也是完全可以的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2139074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LAMP+WordPress

一、简介 LAMP: L:linux——操作系统,提供服务器运行的基础环境。A:apache(httpd)——网页服务器软件,负责处理HTTP请求和提供网页内容。M:mysql,mariadb——数据库管理…

PCL 窗口可视化两个点云

目录 一、概述 1.1原理 1.2实现步骤 1.3 应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 本文将介绍如何使用PCL库…

8.4Prewitt算子边缘检测

基本原理 Prewitt算子是一种用于边缘检测的经典算子,它通过计算图像中像素值的(一阶导数)梯度来检测边缘。Prewitt算子通常包括两个3x3的卷积核,一个用于检测水平方向上的边缘,另一个用于检测垂直方向上的边缘。 示例…

【动漫资源管理系统】Java SpringBoot助力,搭建一个高清动漫在线观看网站

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

【插件】【干货】用EPPlus在Unity中读写Excel表

EPPlus是什么我就不说了,你都点进来了肯定知道 几个常用的api 1.index下标都是从1开始的 2.可以读取任意单元格上的任意内容,不需要给excel表写规则 但是如果你写了规则,就需要自己用额外的代码 --- 数据结构去实现 3.打开excel表 ExcelP…

[数据集][目标检测]智慧交通铁路异物入侵检测数据集VOC+YOLO格式802张7类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):802 标注数量(xml文件个数):802 标注数量(txt文件个数):802 标注类别…

萤石举办2024清洁机器人新品发布会 多维智能再造行业标杆

导言:作为智慧生活守护者,萤石今日发布了两款清洁机器人,AI扫拖机器人RS20 Pro Ultra 和AI洗地机器人RX30 Max ,标志着萤石在智能清洁领域的全新突破。RS20 Pro Ultra基于CutFree 2.0内切割滚刷专利,有效解决毛发缠绕难…

速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读

文章目录 速通GPT系列几个重要概念1、微调的具体做法2、任务感知输入变换3、判别式训练模型 Abstract概括分析和观点1. 自然语言理解中的数据问题2. 生成预训练和监督微调的结合3. 任务感知输入变换4. 模型的强大性能 Introduction概括分析和观点1. 自然语言理解的挑战在于对标…

探索Python的HTML处理神器:pyquery的魔力

文章目录 探索Python的HTML处理神器:pyquery的魔力背景:为何选择pyquery?pyquery是什么?安装pyquery五个简单的库函数使用方法1. $:选择元素2. .text():获取文本内容3. .html():获取HTML内容4. …

SSM框架学习(三、MyBatis实践:提高持久层数据处理效率)

目录 一、Mybatis简介 1.简介 2.持久层框架对比 3.快速入门(基于Mybatis3方式) 4.ibatis方式的实现和原理 5.ibatis与mybatis之间的关系 二、Mybatis基本使用 1.向 sql 语句传参 (1)mybatis日志输出配置 (2&…

小程序开发设计-第一个小程序:创建小程序项目④

上一篇文章导航: 小程序开发设计-第一个小程序:安装开发者工具③-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142219152?spm1001.2014.3001.5501 须知:注:不同版本选项有所不同,并无大碍。 一、创…

主播和礼品检测系统源码分享

主播和礼品检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

SSH软链接后门从入门到应急响应

目录 1. 软链接与SSH软链接后门介绍 1.1 软链接介绍 1.2 SSH软连接后门介绍 2. 如何在已拿下控制权限的主机创建后门 2.1 使用root账户并执行ssh软链接后门命令: 2.2 连接软链接后门测试: 2.3 创建其它账户 ssh软连接后门命令 3. 如何进行应急…

笋丁网页自动回复机器人V3.0.0免授权版源码

笋丁网页机器人一款可设置自动回复,默认消息,调用自定义api接口的网页机器人。 此程序后端语言使用Golang,内存占用最高不超过30MB,1H1G服务器流畅运行。仅支持Linux服务器部署,不支持虚拟主机,请悉知&…

七. 部署YOLOv8检测器-quantization-analysis

目录 前言0. 简述1. 案例运行2. 补充说明3. 量化分析4. 探讨总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习课程第七章—部署YOLOv8检测器,一起来学习…

无限边界:现代整合安全如何保护云

尽管云计算和远程工作得到广泛采用,零信任网络也稳步推广,但边界远未消失。相反,它已被重新定义。就像数学分形的边界一样,现代网络边界现在无限延伸到任何地方。 不幸的是,传统工具在现代无限边界中效果不佳。现代边…

优化算法(三)—模拟退火算法(附MATLAB程序)

模拟退火算法(Simulated Annealing, SA)是一种基于概率的优化算法,旨在寻找全局最优解。该算法模拟金属退火过程中的物质冷却过程,逐渐降低系统的“温度”以达到全局优化的效果。它特别适用于解决复杂的组合优化问题。 一、模拟退…

深度学习笔记(6)文本分类

深度学习笔记(6)文本分类 文章目录 深度学习笔记(6)文本分类一、文本分析与关键词提取1.关键概念1.停用词2 Tf-idf:关键词提取 3.相似度 二、文本分析案例1.数据处理2.分词:实用结巴分词器3.清洗4.TF-IDF5.…

FastText 和 Faiss 的初探了解

概览 大模型目前已经是如火如荼的程度,各个大厂都有推出面向大众的基础大模型,同时诸多行业也有在训练专有大模型,而大模型的发展由来却是经过多年从文本检索生成、深度学习、自然语言处理,在Transformer架构出来后,才…

win11下面graphviz的用法

安装 安装graphviz 2.38版本 控制面板在变量path中增加E:\software\Graphviz\bin example.dot代码 digraph SignalPathway {node [fontname"SimHei"];edge [fontname"SimHei"];// 定义节点形状node [shapecircle];// 定义节点CellA [label"细胞 A&…