在Node.js中使用RabbitMQ系列一 Hello world

來源:互聯網
上載者:User

標籤:npm   ror   架構   upd   sum   var   接收   home   思想   

在前一篇文章中可伸縮架構簡短系列中提到過關於非同步問題。當時推薦使用RabbitMQ來做任務隊列的實現方案。本篇文章以Node.js為例子,來實際操作如何和RabbitMQ進行互動。

介紹

RabbitMQ是一個訊息代理。它最初的思想特別簡單:接受並且轉寄訊息。你可以將它想象為郵局:當你將郵件放到信箱中,你可以非常肯定快件員最終會將郵件交到接受人手中。你可以把RabbitMQ比喻為信箱、郵局和快遞員。RabbitMQ和郵局之間主要的區別是它不處理紙張,而是接受、儲存和轉寄位元據?訊息。

在RabbitMQ中,有一些基本術語:

  • 生產者:就是發送資訊這方。
  • 任務隊列:雖然資訊流在RabbitMQ和你的應用之間流動,它可以儲存在一個隊列中。隊列不受任何限制的約束,它可以儲存任意多的訊息,它本質上是一個無限的緩衝區。許多生產者可以將訊息發往到這個隊列中,許多消費者可以嘗試從這個隊列中接受資料。
  • 消費者:消費者和資訊接受者有相近的含義,一個消費者就是一個等待去接受資訊的程式。
安裝RabbitMQ server

開啟RabbitMQ的下載頁面(https://www.rabbitmq.com/download.html),下載安裝,這裡以Mac OSX平台安裝為例:
RabbitMQ依賴Erlang,由於Mac OSX本身已經安裝了Erlang,所以可以直接通過Homebrew來進行安裝。

$ brew update$ brew install rabbitmq

安裝完後,需要將/usr/local/sbin添加到$PATH,添加到./.bash_profile檔案,然後

$ source ./.bash_profile$ echo $PATH      // 檢查環境變數是否已經成功加入

安裝完成後就可以啟動RabbitMQ server了。

至此,安裝就完成了。運行rabbitmq-server命令時可能會報錯誤:ERROR: epmd error for host localhost: timeout (timed out),如果遇到這種情況,可以開啟/etc/hosts檔案,在檔案末尾加上 127.0.0.1 localhost即可解決問題。

Hello world

在這個部分,我會使用Javascript編寫兩個小程式。一個發送單個訊息的生產者和接收訊息並將其列印出來的消費者。我們將跳過在amqp.node API的一些細節,集中在這個非常簡單的事情。

在中,P代表生產者,C代表消費者,中間紅色代表的是任務隊列-訊息緩衝區

首先,使用npm安裝amqp.node

$ npm install amqplib
發送訊息

這裡我將訊息的寄件者稱作send.js,訊息接受者稱作receive.js,訊息寄件者會串連到RabbitMQ,發送一個訊息,最後退出。
首先引入amqplib這個模組:

var amqp = require(‘amqplib/callback_api‘);

串連到 RabbitMQ server

amqp.connect(‘amqp://localhost‘, function(err, conn) {});

接下來建立一個通道,

amqp.connect(‘amqp://localhost‘, function(err, conn) {  conn.createChannel(function(err, ch) {});});

為了發送訊息,我們需要定義一個隊列,我們可以將訊息發送到這個隊列中:

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!‘");  });});

最後,我們關閉串連,並且退出:

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

最終代碼參考:send.js

接受訊息

建立一個接受者的方式和寄件者是相同的。開啟一個串連和通道,並且申明一個需要處理的隊列。注意:這裡的隊列和寄件者裡面定義的隊列需要匹配。

amqp.connect(‘amqp://localhost‘, function(err, conn) {  conn.createChannel(function(err, ch) {    var q = ‘hello‘;    ch.assertQueue(q, {durable: false});  });});

這裡也定義隊列的原因:接受者可能比寄件者先開始執行。我們需要確保當接受者處理queue的時候,queue是存在的。
由於訊息的發送是非同步,我們需要提供一個回調,這樣,當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

運行代碼
// 先執行send.js$ ./send.js// 後執行receive.js$ ./receive.js

最終結果

在Node.js中使用RabbitMQ系列一 Hello world

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.