使用 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會員
7內容數
軟體開發 & 金融投資的日常筆記
留言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 環境,解決權限不足問題,確保系統的穩定備份與恢復功能。讀者將學會如何有效管理日誌數據和進行必要的快照操作,提升系統的可靠性和數據安全性。
本篇參與的主題活動
當流量至上成為標準,性騷擾被輕描淡寫、受害者被噤聲,我們是否還能給孩子一個安全的未來?作為父親,我無法接受這種價值觀繼續影響下一代。我們該做的,不是遺忘,而是改變環境——拒絕縱容、用行動發聲,讓孩子知道「尊重是底線,說不是權利」。這不只是關於孫生,而是關於我們願意為未來的孩子守住什麼樣的世界。
學習《小狗錢錢》的理財方法,並透過實際操作,達成財務目標與自我提升。從記帳、設定目標、寫夢想清單、成功日記,到發展副業,分享如何將書中方法應用於生活中,並體會到理財不僅僅是管理金錢,更是規劃生活,實現夢想的重要過程。
比較2017年與2024年日本東北旅遊照片,對比藏王樹冰、銀山溫泉、山寺等景點在不同時間的景觀差異,即使地點相同,不同時間的體驗與感受截然不同,珍惜每個當下的珍貴回憶。2024年因暖冬導致雪景不如預期,反觀2017年的雪景壯觀美麗。新聞報導2025年日本東北暴雪,衷心祈願一切平安。
經過年末年初的大掃除,大家是否也好好整頓了自己的居家環境呢?身為家有幼童的媽媽,我也是歷經多次的練習,才調整到適合自己的清潔節奏,在此與大家分享我的清潔小撇步,每個習慣幾乎不超過5分鐘,就能換得一室乾淨,一起來看吧!
記錄一場前往屏東縣三地門鄉德文山(觀望山)的登山之旅,分享路線規劃、登山心得、沿途風景與美食體驗,並提醒登山客注意入山證申請及避免錯過三角點。
薪水的高低,從來不是努力的問題,而是思維的選擇。年薪百萬的人,不是單靠埋頭苦幹,而是透過「創造價值」決定自己的價格。他們懂得提升不可取代性、創造多重收入、主動尋找機會、投資自己,讓財富加速成長。與其等加薪,不如掌握「決定薪資的能力」。這篇文章,讓你看清真正的收入差距,從現在開始,為自己創造更高價值!
當流量至上成為標準,性騷擾被輕描淡寫、受害者被噤聲,我們是否還能給孩子一個安全的未來?作為父親,我無法接受這種價值觀繼續影響下一代。我們該做的,不是遺忘,而是改變環境——拒絕縱容、用行動發聲,讓孩子知道「尊重是底線,說不是權利」。這不只是關於孫生,而是關於我們願意為未來的孩子守住什麼樣的世界。
學習《小狗錢錢》的理財方法,並透過實際操作,達成財務目標與自我提升。從記帳、設定目標、寫夢想清單、成功日記,到發展副業,分享如何將書中方法應用於生活中,並體會到理財不僅僅是管理金錢,更是規劃生活,實現夢想的重要過程。
比較2017年與2024年日本東北旅遊照片,對比藏王樹冰、銀山溫泉、山寺等景點在不同時間的景觀差異,即使地點相同,不同時間的體驗與感受截然不同,珍惜每個當下的珍貴回憶。2024年因暖冬導致雪景不如預期,反觀2017年的雪景壯觀美麗。新聞報導2025年日本東北暴雪,衷心祈願一切平安。
經過年末年初的大掃除,大家是否也好好整頓了自己的居家環境呢?身為家有幼童的媽媽,我也是歷經多次的練習,才調整到適合自己的清潔節奏,在此與大家分享我的清潔小撇步,每個習慣幾乎不超過5分鐘,就能換得一室乾淨,一起來看吧!
記錄一場前往屏東縣三地門鄉德文山(觀望山)的登山之旅,分享路線規劃、登山心得、沿途風景與美食體驗,並提醒登山客注意入山證申請及避免錯過三角點。
薪水的高低,從來不是努力的問題,而是思維的選擇。年薪百萬的人,不是單靠埋頭苦幹,而是透過「創造價值」決定自己的價格。他們懂得提升不可取代性、創造多重收入、主動尋找機會、投資自己,讓財富加速成長。與其等加薪,不如掌握「決定薪資的能力」。這篇文章,讓你看清真正的收入差距,從現在開始,為自己創造更高價值!
你可能也想看
Google News 追蹤
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
在這篇教學文章中,我們將展示如何使用 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