gitBook https://joursion.gitbooks.io/...javascript
Title: RabbitMQ tutorials ---- 'Hello World' (Javascript)html
原文java
RabbitMQ 是一個消息代理,其主要思想比較簡單。容許接收和轉發消息。你能夠把RabbitMQ想成是一個郵局,當你發一份郵件到郵箱,你至關肯定郵遞員最終會把這封信送到你的收件人那邊。
使用這個比喻,RabbitMQ能夠是一個郵箱,或一個郵局,或一個郵遞員。
其與郵局主要的不一樣是實際上RabbitMQ並不處理內容,而是接收,存儲而後轉發二進制數據--消息(message)node
在RabbitMQ的消息傳遞上,咱們用一些術語來解釋:git
生產(Producing) 意味着只作發送的事情。一個發送消息(message)的程序能夠做爲一個生產者(producer).圖以下,代號‘P’npm
隊列(queue)是一個郵箱的名字,存在在 RabbitMQ中。儘管消息(messages)是在RabbitMQ和你的應用中傳遞,可是它們只能被存到一個隊列中。這個隊列沒有任何限制,能夠存儲你想要的任何多的消息,實際上,它就是一個無限的Buffer,大量生產者能夠把消息發送到一個
隊列中,消費者們能夠嘗試從一個隊列中去接收數據。一個隊列能夠畫成下圖所示:上方是它的名字編程
消費(Consuming)和接收的意思相似。一個等待接收消息的程序是一個消費者(Consumer)。以下圖所示,代號「C」:小程序
在這個部分的引導中,咱們會寫兩個Javascript小程序,一個生產者用來發送一條消息,一個消費者來接收消息並打印出來。考慮到這只是一個起步入門的小代碼,消息傳送一個‘hello world’
在途中,「P」是咱們的生產者,「C」是咱們的消費者,在中間的盒子是一個隊列(queue),一個RabiitMQ用來給消費者代理的buffer.api
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}); }); });
如今咱們能夠運行咱們的這兩個腳本了,在終端,咱們去跑這兩個腳本
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~