当前位置: 首页 > 后端技术 > Node.js

【翻译】RabbitMQ教程(一)【JavaScript】

时间:2023-04-04 00:11:10 Node.js

gitBookhttps://joursion.gitbooks.io/...书名:RabbitMQ教程----'HelloWorld'(Javascript)原文介绍RabbitMQ作为一个消息代理,它的主要思想比较简单。允许接收和转发消息。你可以把RabbitMQ想象成一个邮局。当您向邮箱发送电子邮件时,您非常确定邮递员最终会将信件发送给您的收件人。用这个比喻,RabbitMQ可以是邮箱,也可以是邮局,也可以是邮递员。它和邮局的主要区别在于RabbitMQ并不真正处理内容,而是接收、存储和转发二进制数据——消息(message)在RabbitMQ的消息传递中,我们用一些术语来解释:ProductionmeansJustdothesending事物。发送消息(message)的程序可以作为生产者(producer)。如图,代号'P'队列(queue)是一个邮箱的名字,存在于RabbitMQ中。尽管消息在RabbitMQ和您的应用程序之间传递,但它们只能存储在一个队列中。这个队列没有限制,可以存储任意数量的消息。其实就是一个无限大的Buffer。大量生产者可以向队列发送消息,而消费者可以尝试从队列中接收消息。数据。可以画出一个队列,如下图所示:上面是它的名字Consuming和Receiving意思差不多。一个等待接收消息的程序就是一个消费者(Consumer)。如下图所示,代码名称“C”:“HelloWorld”(使用amqp.node[1]客户端)在指南的这一部分,我们将编写两个Javascript小程序,一个生产者用于发送消息,消费者接收消息并打印出来。考虑到这只是开始的一小段代码,传递一个'helloworld'的消息在途中,“P”是我们的生产者,“C”是我们的消费者,中间的框是一个队列,一个缓冲区.amqp.nodeRabiitMQ用来代理消费者。RabbitMQ支持多种协议。在bootstrap中,使用了AMQP0-9-1,这是一种开源的通用消息传递协议。支持多种不同语言的RabbitMQ客户端库,这里我们使用amqp.node(Javascript)一开始我们使用npm安装这个库$npminstallamqplib现在我们已经安装了amqp.node,我们可以写一些代码发送(Sending):我们将消息发送方的文件命名为send.js,同理,消息接收方的文件为receive.js。发送方将首先连接到RabbitMQ,发送消息,然后退出。在send.js中,我们首先导入库#!/usr/bin/envnodevaramqp=require('amqplib/callback_api');然后连接到RabbitMQ服务器amqp.connect('amqp://localhst),function(err,conn){})然后我们创建一个通道(channel),然后大部分的API都会使用这个通道amqp.connect('amqp://localhost',function(err,conn){conn.createChannel(function(err,ch){});});要发送,我们必须声明一个队列(queue),然后将消息发布到这个队列中varq='hello';ch.assertQueue(q,{durable:false});//注意:在Node6上应该使用Buffer.from(msg)ch.sendToQueue(q,newBuffer('HelloWorld!'));console.log("[x]发送'HelloWorld!'");});});Declareaqueueisidempotent[2]--只有当它不存在时才会被创建。消息的内容是一个位数组,所以你可以使用任何你喜欢的编码。最后,我们必须关闭连接并退出setTimeout(function(){conn.close();process.exit(0)},500);接收(Receiving)上面是发送的代码。我们的接收者接收的是来自RabbitMQ的推送消息,所以不同于发送者只需要发布一条简单的消息。我们需要保持程序运行,监听消息并打印出来。在receive.js中,require是一样的#!/usr/bin/envnodevaramqp=require('amqplib/callback_api');基本设置和send.js一致,先创建连接和通道,然后声明一个我们要消费的队列(queue)。注意:这里的queue要和前面sendToQueue的名字一样。amqp.connect('amqp://localhost',function(err,conn){conn.createChannel(function(err,ch){varq='hello';//和前面一致,ch.assertQueue(q,{durable:false});});});注意:这里我们还需要声明队列,因为我们可能先开始接收(receiver),然后才开始发送(sender),我们必须保证当我们从队列中取消息的时候,这个队列是存在的。我们将告诉服务器我们想从这个队列中获取消息。由于推送给我们的消息是异步的,所以我们需要写一个回调函数(callback)在RabbitMQ推送消息给消费者时执行。这就是Channel.consume所做的事情console.log("[*]Waitingformessagesin%s.ToexitpressCTRL+C",q);ch.consume(q,function(msg){console.log("[x]Received%s",msg.content.toString());},{noAck:true});下面是完整的receive.js代码(function(err,ch){varq='hello';ch.assertQueue(q,{durable:false});console.log("[*]正在等待%s中的消息。要退出,请按CTRL+C",q);ch.consume(q,function(msg){console.log("[x]Received%s",msg.content.toString());},{noAck:true});});});把它们放在一起现在我们可以运行我们的两个脚本,在终端中,让我们运行这两个脚本使用ctrl+c停止运行),等待新消息推送。因此,您可以在另一个终端再次运行sender。如果想查看队列的内容,可以使用rabbitmqctllist_queuesHelloWorld下一节会讲到搭建一个简单的工作队列[1]。amqplibAPI[2]。在编程中,幂等操作的特点是它的任意多次执行都将与一次执行产生相同的影响。总结:消息队列字面意思就是管理消息的队列。有消费者和生产者,缓存队列,他们可以订阅同一个队列。翻译:Joursion日期:2016/12/21另:因为想入门RabbitMQ,所以第一时间想到了翻译,第一时间...然后...希望大家多提建议。谢谢~