RabbitMQ Node.js 示例

RabbitQM 处理和管理消息队列的中间人(broker)。可简单理解为邮局,你在程序中写好消息,指定好收件人,剩下的事件就是 RabbitMQ 的工作了,它会保证收件人正确收到邮件。

任何发送邮件的程序都是 Producer,消息队列可理解为邮筒,新件将堆积在此处。所有待处理的消息都以队列形式存储,总体上看来就是一个巨大的消息 buffer,至于存储量与设置的内存及硬件有关。任何应用都可以向队列添加消息,也可以多个消费者都在从队列中获取消息。

而 consumer 即是消息队列中消息的应用,其处于等待接收来自 RabbitMQ 发送来的消息。

消息生产者,消费者及 RabbitMQ 这个中间人三者不必同时存在于同一机器上,实际运用时也确实大部分不会部署在同一机器上,比如有专门的机器作为 RabbitMQ 实体,而应用程序会部署在其他的集群。应用程序可以是同时负责生产消息的,也同时是消费者。

[外链图片转存失败(img-EX1LFZjf-1569335036093)(http://www.jqhtml.com/wp-content/uploads/2019/5/RjYVVr.png)]

来自官方文档中关于 RabbitMQ 消息列队的示意图

安装
通过官网提供的地址下载相应平台的程序进行安装,Mac 可通过 Homebrew 进行安装:

$ brew update && brew install rabbitmq

启动
如果使用 Homebrew 安装,可通过 brew services start rabbitmq 命令来启动 RabbitMQ 服务。

$ brew services start rabbitmq

==> Successfully started rabbitmq (label: homebrew.mxcl.rabbitmq)
或直接运行 /usr/local/sbin/rabbitmq-server。

启动后,会有一个可视化的管理后台,可通过 http://localhost:15672/ 访问,用户名密码皆为 guest。

基于 Node.js 的 Hello World 示例

通过 amqp.node 展示 RabbitMQ 在 Node.js 中应用的一个示例。

RabbmitMQ 支持多种协议进行通信,amqp.node 使用的是 AMQP 0-9-1 这一开源协议,后者专门为处理消息而设计。作为客户端消费消息,使用的是 amqp.node client 模块,但 RabbitMQ 本身是支持多种客户端的。

初始化一个 Node,js 项目然后通过以下命令安装 amqp.node 模块:

$ mkdir rabbitmq-demo && yarn init -y
$ yarn add amqplib

发送消息

创建 send.js 文件,在其中编写发送消息的逻辑,它将连接到 RabbitMQ 发送消息然后退出。

首先建立到 RabbitMQ 服务的连接,

#!/usr/bin/env node
 
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(error0, connection) {});

连接建立成功后,创建一个通道(channel),具体的发送将会在这个通道中进行。

amqp.connect('amqp://localhost', function(error0, connection) {
  if (error0) {
    throw error0;
  }
  connection.createChannel(function(error1, channel) {});
});

发送消息前,需要先声明一个队列,然后将消息发送到该队列:

amqp.connect('amqp://localhost', function(error0, connection) {
  if (error0) {
    throw error0;
  }
  connection.createChannel(function(error1, channel) {
    if (error1) {
      throw error1;
    }
    var queue = 'hello';
    var msg = 'Hello world';
 
    channel.assertQueue(queue, {
      durable: false
    });
 
    channel.sendToQueue(queue, Buffer.from(msg));
    console.log(" [x] Sent %s", msg);
  });
});

队列的创建是一个幂等操作,只该队列不存在的情况才会新建。

最后关闭连接并退出。

setTimeout(function() {
    connection.close();
    process.exit(0);
}, 500);

完整的 send.js

#!/usr/bin/env node
 
var amqp = require('amqplib/callback_api');
 
amqp.connect('amqp://localhost', function(error0, connection) {
    if (error0) {
        throw error0;
    }
    connection.createChannel(function(error1, channel) {
        if (error1) {
            throw error1;
        }
 
        var queue = 'hello';
        var msg = 'Hello World!';
 
        channel.assertQueue(queue, {
            durable: false
        });
        channel.sendToQueue(queue, Buffer.from(msg));
 
        console.log(" [x] Sent %s", msg);
    });
    setTimeout(function() {
        connection.close();
        process.exit(0);
    }, 500);
});

接收消息

下面开始编写消费者,消费者做的事情是监听来自 RabbitMQ 的消息并处理。

创建 receive.js,引入 amqp.node 模块,流程和发送者一样,也是先创建连接,然后创建通道,在通道中声明需要监听的队列:

#!/usr/bin/env node
 
var amqp = require('amqplib/callback_api');
 
amqp.connect('amqp://localhost', function(error0, connection) {
  if (error0) {
    throw error0;
  }
  connection.createChannel(function(error1, channel) {
    if (error1) {
      throw error1;
    }
    var queue = 'hello';
 
    channel.assertQueue(queue, {
      durable: false
    });
  });
});

这里的队列声明不会与发送者那边的冲突,因为上面提到过,队列只在不存在的情况下才会重新生成。这里再次声明可以保证监听前队列已经存在。并且实际场景下,消费者有可能是在发送者之前启动的。

然后添加监听的逻辑:

console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", queue);
 
channel.consume(queue, function(msg) {
    console.log(" [x] Received %s", msg.content.toString());
}, {
    noAck: true
});

完整的 receive.js

#!/usr/bin/env node
 
var amqp = require('amqplib/callback_api');
 
amqp.connect('amqp://localhost', function(error0, connection) {
    if (error0) {
        throw error0;
    }
    connection.createChannel(function(error1, channel) {
        if (error1) {
            throw error1;
        }
 
        var queue = 'hello';
 
        channel.assertQueue(queue, {
            durable: false
        });
 
        console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", queue);
 
        channel.consume(queue, function(msg) {
            console.log(" [x] Received %s", msg.content.toString());
        }, {
            noAck: true
        });
    });
});

运行

分别在命令行启动上面两个程序,查看打印的信息。

$ node send.js
 [x] Sent Hello World!
 
$ node receive.js
 [*] Waiting for messages in hello. To exit press CTRL+C
 [x] Received Hello World!
另外,可通过 sudo rabbitmqctl list_queues 手动查看 RabbitMQ 中的消息。

$ /usr/local/sbin/rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name    messages
hello   0

如果发现 rabbitmqctl 命令不可用,需要添加 /usr/local/sbin 到环境变量中,

export PATH=/usr/local/sbin:$PATH

其中 fish shell 通过添加如下命令到 fish 的配置文件即可:

set -gx PATH /usr/local/sbin $PATH

相关资源
RabbitMQ Introduction
Node.js code for RabbitMQ tutorials
squaremo/amqp.node

Node.js中使用RabbitMQ,您可以使用amqp.node包。首先,您需要安装amqp.node包并引入它。然后,您可以使用amqp.connect方法创建RabbitMQ服务器的连接,指定连接URL。在连接回调函数中,您可以通过调用conn.createChannel方法创建一个通道。接下来,您可以使用通道的方法来声明队列、发送消息和接收消息。例如,使用assertQueue方法声明一个队列,使用sendToQueue方法发送消息,使用consume方法接收消息。下面是一个使用amqp.node包的例子: get.js: ```javascript var amqp = require('amqplib/callback_api'); amqp.connect('amqp://localhost', function(err, conn) { // 创建连接 conn.createChannel(function(err, ch) { var q = 'test'; ch.assertQueue(q, {durable: false}); ch.consume(q, function(msg) { // 接收消息 console.log("get Message", msg.content.toString()); }, {noAck: true}); }); }); ``` push.js: ```javascript var amqp = require('amqplib/callback_api'); amqp.connect('amqp://localhost', function(err, conn) { // 创建连接 conn.createChannel(function(err, ch) { var q = 'test'; var msg = 'Hello World!'; ch.assertQueue(q, {durable: false}); ch.sendToQueue(q, new Buffer(msg)); // 发送消息 console.log("Send message:", msg); }); setTimeout(function() { conn.close(); process.exit(0) }, 500); }); ``` 以上是一个简单的使用amqp.node包在Node.js中使用RabbitMQ示例。您可以根据自己的需求进行更改和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Node.js使用rabbitMQ(一)](https://blog.csdn.net/weixin_34402090/article/details/85850603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值