使用 Docker 部署 RabbitMQ 與 Node.js 實現訊息生產與消費

閱讀時間約 10 分鐘

RabbitMQ 安裝與設定

我們將使用 Docker 安裝 RabbitMQ 並啟動服務。

1. 安裝 RabbitMQ: 使用以下命令來啟動 RabbitMQ 容器並設置必要的配置:

docker run -d --rm --name rabbitmq -p 5552:5552 -p 15672:15672 -p 5672:5672 -e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS='-rabbitmq_stream advertised_host localhost' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.13

這裡,-p 參數將 RabbitMQ 的端口映射到主機上:

  • 15672:RabbitMQ 管理界面
  • 5672:RabbitMQ 的 AMQP 協議端口
  • 5552:RabbitMQ 的管理插件端口

2.啟用 RabbitMQ 插件: 啟用流插件(rabbitmq_stream)和管理插件:

docker exec rabbitmq rabbitmq-plugins enable rabbitmq_stream rabbitmq_stream_management 

3.確認服務是否運行: 打開瀏覽器,訪問 http://localhost:15672/,您應該能夠看到 RabbitMQ 的管理界面,並使用預設的帳戶(用戶名:admin,密碼:admin)進行登入。


Node.js 整合 RabbitMQ

在這一部分,我們將使用 Node.js 搭建一個簡單的應用,並通過 RabbitMQ 進行訊息的生產與消費。

1. 安裝必要的套件

在開始之前,需要安裝 expressamqplib 兩個套件:

npm install express amqplib

2. 創建生產者(Producer)與消費者(Consumer)

producer.js:負責將消息發送到 RabbitMQ 隊列。

// producer.js
const amqp = require('amqplib');

const QUEUE = 'test_queue';

async function sendMessageToQueue(message) {
try {
const connection = await amqp.connect('amqp://admin:admin@localhost:5672');
const channel = await connection.createChannel();
await channel.assertQueue(QUEUE, { durable: false });

channel.sendToQueue(QUEUE, Buffer.from(message));
console.log(`[Producer] Message sent: ${message}`);
await channel.close();
await connection.close();
} catch (error) {
console.error('Error sending message to queue:', error);
}
}

module.exports = { sendMessageToQueue };

consumer.js:負責從 RabbitMQ 隊列中接收並處理消息。

// consumer.js
const amqp = require('amqplib');

const QUEUE = 'test_queue';

async function consumeMessages() {
try {
const connection = await amqp.connect('amqp://admin:admin@localhost:5672');
const channel = await connection.createChannel();
await channel.assertQueue(QUEUE, { durable: false });

channel.consume(QUEUE, (msg) => {
if (msg) {
console.log(`[Consumer] Received message: ${msg.content.toString()}`);
channel.ack(msg); // 確認消息
}
}, { noAck: false });

console.log(`[Consumer] Waiting for messages in queue: "${QUEUE}"`);
} catch (error) {
console.error('Error consuming messages:', error);
}
}

module.exports = { consumeMessages };

3. 創建 API 服務

我們將在 server.js 中設置一個 Express 伺服器,並在其中創建一個路由來觸發生產者發送消息,同時啟動消費者來處理隊列中的消息。

server.js

// server.js
const express = require('express');
const { sendMessageToQueue } = require('./producer');
const { consumeMessages } = require('./consumer');

const app = express();
const port = 3000;

// 設置解析 JSON 請求體
app.use(express.json());

// API 路由 - 發送消息到 RabbitMQ
app.post('/send-message', async (req, res) => {
const { message } = req.body;

if (!message) {
return res.status(400).json({ error: 'Message is required' });
}

try {
await sendMessageToQueue(message);
res.status(200).json({ status: 'Message sent to queue', message });
} catch (error) {
res.status(500).json({ error: 'Failed to send message to queue' });
}
});

// 啟動消費者,開始處理消息
consumeMessages();

// 啟動 Express 伺服器
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});

4. 測試整合

  • 啟動服務器: 執行以下命令啟動 Node.js 伺服器:
node server.js
  • 發送消息: 您可以使用 Postman 或其他 API 測試工具,向 http://localhost:3000/send-message 發送一個 POST 請求,請求體應包含 message 字段:
{
"message": "Hello RabbitMQ from API!"
}

如果消息成功發送,您將收到以下回應:

{
"status": "Message sent to queue",
"message": "Hello RabbitMQ from API!"
}
  • 消費者處理消息: 當消息發送到 RabbitMQ 隊列後,消費者會接收到消息並處理。您應該會在控制台中看到類似如下的輸出:
[Consumer] Received message: Hello RabbitMQ from API!

總結

  • 生產者(Producer)producer.js 負責將消息發送到 RabbitMQ 隊列。
  • 消費者(Consumer)consumer.js 用來從 RabbitMQ 隊列中接收並處理消息。
  • API 整合:在 server.js 中,我們提供了一個 API 路由來觸發消息生產,同時啟動消費者處理消息。

這個範例展示了如何將 RabbitMQ 與 Node.js 整合,建立一個簡單的生產者和消費者模型,並通過 API 發送消息。這樣的架構可應用於多種場景,例如事件驅動架構、分佈式系統等。






avatar-img
0會員
6內容數
軟體開發 & 金融投資的日常筆記
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
嘿洽啦 的其他內容
本文介紹如何使用 Docker 部署 Kafka 和 Zookeeper,並透過 Node.js 實現 Kafka 的訊息生產者與消費者。內容涵蓋 Kafka 和 Zookeeper 的 Docker 配置、使用 KafkaJS 進行訊息生產與消費,並透過 API 來發送和接收消息。
本文探討如何快速搭建 Graylog 和 Opensearch 以滿足專案需求,並詳細介紹日誌管理、手動備份、快照設定及自動備份的步驟。通過設置 Docker 環境,解決權限不足問題,確保系統的穩定備份與恢復功能。讀者將學會如何有效管理日誌數據和進行必要的快照操作,提升系統的可靠性和數據安全性。
本文介紹如何使用 Docker 部署 Kafka 和 Zookeeper,並透過 Node.js 實現 Kafka 的訊息生產者與消費者。內容涵蓋 Kafka 和 Zookeeper 的 Docker 配置、使用 KafkaJS 進行訊息生產與消費,並透過 API 來發送和接收消息。
本文探討如何快速搭建 Graylog 和 Opensearch 以滿足專案需求,並詳細介紹日誌管理、手動備份、快照設定及自動備份的步驟。通過設置 Docker 環境,解決權限不足問題,確保系統的穩定備份與恢復功能。讀者將學會如何有效管理日誌數據和進行必要的快照操作,提升系統的可靠性和數據安全性。
本篇參與的主題活動
BHC炸雞台灣首家分店於11/11台北大巨蛋地下街B2「遠東Garden City花園綠廊」正式登場,從國父紀念館捷運站五號出口步行約2分鐘。店面特別規畫內用和外帶動線,讓球迷們可以更快速外帶點餐,也有計畫明年擴展至南部。
BHC炸雞台灣首家分店於11/11台北大巨蛋地下街B2「遠東Garden City花園綠廊」正式登場,從國父紀念館捷運站五號出口步行約2分鐘。店面特別規畫內用和外帶動線,讓球迷們可以更快速外帶點餐,也有計畫明年擴展至南部。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
我們在「【Message Queue - Kafka】不斷的試誤…, 用Docker來嘗試安裝Kafka」有介紹如何架設kafka, 其中我們使用環境變數來進行kafka的配置, 但除了環境變數之外, 其實還能夠用檔案配置的方式來對kafka進行配置, 如此一來我們就可以將配置檔與啟動檔完全分開,
※ 補充說明: ※ npm 常用指令: ◦ npm init–y:快速初始化一個新的 Node.js 並建立一個 package.json 文件的命令。 ◦ npm info 套件名稱 version:快速查詢指定 npm 套件的最新版本號。 ◦ npm install套件名稱:用來安裝
Thumbnail
Node.js是一個JavaScript運行環境。它使用了一個非阻塞、事件驅動的I/O模型,使其非常適合用於數據密集型的即時應用程序。簡單來說,Node.js允許你使用JavaScript來編寫伺服器端代碼。 nvm 安裝nvm Windows : 點擊 Releases · coreybut
Thumbnail
前言 大家好上次我們教了如何下載 Docker Image 使用,今天我們要教如何產出自己的 Image,這次會使用一個 Dockerfile 範例,自行打包 Docker Image,初步練習使用 Docker 指令 下載 Dockerfile 教學檔案 在這裡我已經幫忙寫好一個 Docke
Thumbnail
前言 上次講到 Dockerfile、DockerImage、Docker Container 他們之間的關係,今天我們要來熟悉 Docker Image 如何使用,教你如何抓取雲端上的 Docker Image, Docker Image 下載來源 當我們今天要要使用 Docker Imag
Thumbnail
前言 上次我們初步體驗 Docker 快速佈署能力,今天我們要來講解 Dockerfile、Docker Image 與 Docker Container 這些常見的名詞,我們來了解在我們佈署的時候做哪些事情 Docker 佈署流程 首先看到如下圖上半部,在我們一個完整的佈署流程,我們會先將我
Thumbnail
前言 大家好在先前我們講了什麼是 Docker,Docker 好處有什麼以及怎麼安裝 Docker,今天我們要來開始初體驗 Docker 容器,使用後您會發現 Docker 非常的方便快速 Docker Hub 介紹 首先在開始學怎麼抓取 Docker Image 之前,我們要先來介紹 Doc
Thumbnail
前言 上次我們講到 Docker 的功用與好處,今天我們要在講解,如何安裝 Docker 這個容器,讓我們在之後的教學應用更好的實作與練習,現在讓我們開始吧 Docker Engine 與 Docker Desktop 首先在講解怎麼安裝 Docker 時,我們先講解 Docker Engin
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
我們在「【Message Queue - Kafka】不斷的試誤…, 用Docker來嘗試安裝Kafka」有介紹如何架設kafka, 其中我們使用環境變數來進行kafka的配置, 但除了環境變數之外, 其實還能夠用檔案配置的方式來對kafka進行配置, 如此一來我們就可以將配置檔與啟動檔完全分開,
※ 補充說明: ※ npm 常用指令: ◦ npm init–y:快速初始化一個新的 Node.js 並建立一個 package.json 文件的命令。 ◦ npm info 套件名稱 version:快速查詢指定 npm 套件的最新版本號。 ◦ npm install套件名稱:用來安裝
Thumbnail
Node.js是一個JavaScript運行環境。它使用了一個非阻塞、事件驅動的I/O模型,使其非常適合用於數據密集型的即時應用程序。簡單來說,Node.js允許你使用JavaScript來編寫伺服器端代碼。 nvm 安裝nvm Windows : 點擊 Releases · coreybut
Thumbnail
前言 大家好上次我們教了如何下載 Docker Image 使用,今天我們要教如何產出自己的 Image,這次會使用一個 Dockerfile 範例,自行打包 Docker Image,初步練習使用 Docker 指令 下載 Dockerfile 教學檔案 在這裡我已經幫忙寫好一個 Docke
Thumbnail
前言 上次講到 Dockerfile、DockerImage、Docker Container 他們之間的關係,今天我們要來熟悉 Docker Image 如何使用,教你如何抓取雲端上的 Docker Image, Docker Image 下載來源 當我們今天要要使用 Docker Imag
Thumbnail
前言 上次我們初步體驗 Docker 快速佈署能力,今天我們要來講解 Dockerfile、Docker Image 與 Docker Container 這些常見的名詞,我們來了解在我們佈署的時候做哪些事情 Docker 佈署流程 首先看到如下圖上半部,在我們一個完整的佈署流程,我們會先將我
Thumbnail
前言 大家好在先前我們講了什麼是 Docker,Docker 好處有什麼以及怎麼安裝 Docker,今天我們要來開始初體驗 Docker 容器,使用後您會發現 Docker 非常的方便快速 Docker Hub 介紹 首先在開始學怎麼抓取 Docker Image 之前,我們要先來介紹 Doc
Thumbnail
前言 上次我們講到 Docker 的功用與好處,今天我們要在講解,如何安裝 Docker 這個容器,讓我們在之後的教學應用更好的實作與練習,現在讓我們開始吧 Docker Engine 與 Docker Desktop 首先在講解怎麼安裝 Docker 時,我們先講解 Docker Engin