摘要:允許接收和轉(zhuǎn)發(fā)消息。一個(gè)等待接收消息的程序是一個(gè)消費(fèi)者。發(fā)送者會(huì)先連接到發(fā)送一條消息,然后退出。注意這里的是要和之前的名稱一致。翻譯日期另因?yàn)橄肴腴T第一次想著翻譯,第一次然后希望多多提出不足。
gitBook https://joursion.gitbooks.io/...
Title: RabbitMQ tutorials ---- "Hello World" (Javascript)
原文
介紹RabbitMQ 是一個(gè)消息代理,其主要思想比較簡單。允許接收和轉(zhuǎn)發(fā)消息。你可以把RabbitMQ想成是一個(gè)郵局,當(dāng)你發(fā)一份郵件到郵箱,你相當(dāng)確定郵遞員最終會(huì)把這封信送到你的收件人那邊。
使用這個(gè)比喻,RabbitMQ可以是一個(gè)郵箱,或一個(gè)郵局,或一個(gè)郵遞員。
其與郵局主要的不同是實(shí)際上RabbitMQ并不處理內(nèi)容,而是接收,存儲(chǔ)然后轉(zhuǎn)發(fā)二進(jìn)制數(shù)據(jù)--消息(message)
在RabbitMQ的消息傳遞上,我們用一些術(shù)語來解釋:
生產(chǎn)(Producing) 意味著只做發(fā)送的事情。一個(gè)發(fā)送消息(message)的程序可以作為一個(gè)生產(chǎn)者(producer).圖如下,代號‘P’
隊(duì)列(queue)是一個(gè)郵箱的名字,存在在 RabbitMQ中。盡管消息(messages)是在RabbitMQ和你的應(yīng)用中傳遞,但是它們只能被存到一個(gè)隊(duì)列中。這個(gè)隊(duì)列沒有任何限制,可以存儲(chǔ)你想要的任何多的消息,實(shí)際上,它就是一個(gè)無限的Buffer,大量生產(chǎn)者可以把消息發(fā)送到一個(gè)
隊(duì)列中,消費(fèi)者們可以嘗試從一個(gè)隊(duì)列中去接收數(shù)據(jù)。一個(gè)隊(duì)列可以畫成下圖所示:上方是它的名字
消費(fèi)(Consuming)和接收的意思類似。一個(gè)等待接收消息的程序是一個(gè)消費(fèi)者(Consumer)。如下圖所示,代號“C”:
"Hello World" (使用amqp.node[1] 客戶端)在這個(gè)部分的引導(dǎo)中,我們會(huì)寫兩個(gè)Javascript小程序,一個(gè)生產(chǎn)者用來發(fā)送一條消息,一個(gè)消費(fèi)者來接收消息并打印出來??紤]到這只是一個(gè)起步入門的小代碼,消息傳送一個(gè)‘hello world’
在途中,“P”是我們的生產(chǎn)者,“C”是我們的消費(fèi)者,在中間的盒子是一個(gè)隊(duì)列(queue),一個(gè)RabiitMQ用來給消費(fèi)者代理的buffer.
amqp.node 客戶端庫
RabbitMQ 支持多種協(xié)議,在引導(dǎo)中,使用AMQP 0-9-1,它是一個(gè)開源的,通用的消息傳遞協(xié)議。支持很多不同語言的RabbitMQ的客戶端庫,在這里我們使用amqp.node (Javascript)
在一開始,我們使用npm 來安裝這個(gè)庫
$ npm install amqplib
現(xiàn)在我們已經(jīng)安裝了amqp.node了,我們可以寫一些代碼了
發(fā)送(Sending):
我們把消息發(fā)送者的文件取名send.js,同理,消息接收者的文件為receive.js。發(fā)送者會(huì)先連接到RabbitMQ,發(fā)送一條消息,然后退出。
在send.js中,我們先導(dǎo)入庫
#!/usr/bin/env node var amqp = require("amqplib/callback_api");
再連接到RabbitMQ服務(wù)器
amqp.connect("amqp://localhst), function(err, conn) {} )
接著我們創(chuàng)建一個(gè)通道(channel),之后大部分的API會(huì)使用這個(gè)通道
amqp.connect("amqp://localhost", function(err, conn) { conn.createChannel(function(err, ch) {}); });
去發(fā)送的時(shí)候,我們必需聲明一個(gè)隊(duì)列(queue),然后把消息發(fā)布到這個(gè)隊(duì)列中
amqp.connect("amqp://localhost", function(err, conn) { conn.createChannel(function(err, ch) { var q = "hello"; ch.assertQueue(q, {durable: false}); // Note: on Node 6 Buffer.from(msg) should be used ch.sendToQueue(q, new Buffer("Hello World!")); console.log(" [x] Sent "Hello World!""); }); });
聲明一個(gè)隊(duì)列是冪等的[2] -- 只有在不存在的時(shí)候才會(huì)被創(chuàng)建。消息(message)的內(nèi)容是一個(gè)位數(shù)組,所以你可以使用你喜歡的編碼。
最后,我們要關(guān)閉這個(gè)連接并且退出
setTimeout(function() { conn.close(); process.exit(0) }, 500);
接收(Receiving)
以上就是發(fā)送的代碼。我們的接收者是從RabbitMQ接收推送消息的,所以不同與發(fā)送者只需要發(fā)布一條簡單的消息,我們需要保持程序持續(xù)運(yùn)行,去監(jiān)聽消息并打印出來
在receive.js中,require同理
#!/usr/bin/env node var amqp = require("amqplib/callback_api");
基礎(chǔ)設(shè)置和send.js一致,先創(chuàng)建連接和通道,然后再聲明一個(gè)我們要去消費(fèi)的隊(duì)列(queue)。注意:這里的queue是要和之前sendToQueue的名稱一致。
amqp.connect("amqp://localhost", function(err, conn) { conn.createChannel(function(err, ch) { var q = "hello"; //和之前的要一致, ch.assertQueue(q, {durable: false}); }); });
注意:我們在這里也同樣需要聲明queue,因?yàn)槲覀兛赡芟葐?dòng)接收(receiver)再啟動(dòng)發(fā)送(sender),我們要保證當(dāng)我們?nèi)年?duì)列中取消息的時(shí)候,這個(gè)隊(duì)列是存在的。
我們將會(huì)告訴服務(wù)器,我們要從這個(gè)隊(duì)列取消息。由于推送給我們消息是異步的,我們需要寫一個(gè)回調(diào)函數(shù)(callback),當(dāng)RabbitMQ給消費(fèi)者推送消息的時(shí)候執(zhí)行。
這就是Channel.consume所作的
console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q); ch.consume(q, 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(err, conn) { conn.createChannel(function(err, ch) { var q = "hello"; ch.assertQueue(q, {durable: false}); console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q); ch.consume(q, function(msg) { console.log(" [x] Received %s", msg.content.toString()); }, {noAck: true}); }); });整合(Putting it all together)
現(xiàn)在我們可以運(yùn)行我們的這兩個(gè)腳本了,在終端,我們?nèi)ヅ苓@兩個(gè)腳本
sender:
$ ./sender.js
receive:
$ ./receive.js
reciever 中會(huì)打印一條從RabbitMQ中獲取到的消息,并會(huì)持續(xù)運(yùn)行(使用 ctrl+c 停止運(yùn)行),等待新的消息推送。所以,你可以在其他終端再跑一次sender。
如果你想查看隊(duì)列中的內(nèi)容,可以使用rabbitmqctl list_queues
Hello World
下一節(jié),將會(huì)講到去搭建一個(gè)簡單的工作隊(duì)列
[1]. amqplib API
[2]. 在編程中.一個(gè)冪等操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。
小結(jié): 消息隊(duì)列從字面上就是一個(gè)管理消息的隊(duì)列,存在消費(fèi)者和生產(chǎn)者,緩存隊(duì)列,他們可以訂閱同一個(gè)queue。
翻譯:Joursion
日期 :2016/12/21
另: 因?yàn)橄肴腴TRabbitMQ, 第一次想著翻譯,第一次...然后... 希望多多提出不足。 Thanks~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/88112.html
摘要:這樣的消息分發(fā)機(jī)制稱作輪詢。在進(jìn)程掛了之后,所有的未被確認(rèn)的消息會(huì)被重新分發(fā)。忘記確認(rèn)這是一個(gè)普遍的錯(cuò)誤,丟失。為了使消息不會(huì)丟失,兩件事情需要確保,我們需要持久化隊(duì)列和消息。 工作隊(duì)列 showImg(https://segmentfault.com/img/remote/1460000008229494?w=332&h=111); 在第一篇中,我們寫了一個(gè)程序從已經(jīng)聲明的隊(duì)列中收發(fā)...
摘要:生產(chǎn)者只能把消息發(fā)到交換器。是否要追加到一個(gè)特殊的隊(duì)列是否要追加到許多的隊(duì)列或者丟掉這條消息這些規(guī)則被定義為交換類型。有一點(diǎn)很關(guān)鍵,向不存在的交換器發(fā)布消息是被禁止的。如果仍然沒有隊(duì)列綁定交換器,消息會(huì)丟失。 發(fā)布與訂閱 (Publish/Subscribe) 在之前的章節(jié)中,我們創(chuàng)建了工作隊(duì)列,之前的工作隊(duì)列的假設(shè)是每個(gè)任務(wù)只被分發(fā)到一個(gè)worker。在這一節(jié)中,我們會(huì)做一些完全不一...
摘要:非貪婪匹配默認(rèn)情況下,正則表達(dá)式的量詞,都是進(jìn)行貪婪匹配,即匹配盡可能多的字符。參考正則表達(dá)式關(guān)于專注于微信小程序微信小游戲支付寶小程序和線上應(yīng)用實(shí)時(shí)監(jiān)控。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,付費(fèi)客戶有金山軟件百姓網(wǎng)等眾多品牌企業(yè)。 摘要:正則表達(dá)式是程序員的必備技能,想不想多學(xué)幾招呢? showImg(https://segmentfault.com/img/bV9L9n?w...
摘要:每個(gè)消費(fèi)者會(huì)得到平均數(shù)量的。為了確保不會(huì)丟失,采用確認(rèn)機(jī)制。如果中斷退出了關(guān)閉了,關(guān)閉了,或是連接丟失了而沒有發(fā)送,會(huì)認(rèn)為該消息沒有完整的執(zhí)行,會(huì)將該消息重新入隊(duì)。該消息會(huì)被發(fā)送給其他的。當(dāng)消費(fèi)者中斷退出,會(huì)重新分派。 Work模式 原文地址showImg(https://segmentfault.com/img/bVbqlXr?w=694&h=252); 在第一章中,我們寫了通過一個(gè)...
摘要:主題模式在上一章我們改進(jìn)了我們的日志系統(tǒng),如果使用我們只能簡單進(jìn)行廣播,而使用則允許消費(fèi)者可以進(jìn)行一定程度的選擇。為的會(huì)同時(shí)發(fā)布到這兩個(gè)。當(dāng)為時(shí),會(huì)接收所有的。當(dāng)中沒有使用通配符和時(shí),的行為和一致。 主題模式 在上一章我們改進(jìn)了我們的日志系統(tǒng),如果使用fanout我們只能簡單進(jìn)行廣播,而使用direct則允許消費(fèi)者可以進(jìn)行一定程度的選擇。但是direct還是有其局限性,其路由不支持多個(gè)...
閱讀 2529·2021-09-24 10:29
閱讀 3810·2021-09-22 15:46
閱讀 2580·2021-09-04 16:41
閱讀 2986·2019-08-30 15:53
閱讀 1265·2019-08-30 14:24
閱讀 3058·2019-08-30 13:19
閱讀 2174·2019-08-29 14:17
閱讀 3526·2019-08-29 12:55