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