使用 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
留言分享你的想法!
avatar-img
嘿洽啦
1會員
7內容數
軟體開發 & 金融投資的日常筆記
嘿洽啦的其他內容
2024/11/22
RabbitMQ 和 Kafka 是兩種流行的消息處理工具,各自擅長不同的應用場景。RabbitMQ 以低延遲和靈活的消息路由著稱,適合即時通信和微服務;Kafka 則專注於高吞吐量和數據持久化,適用於大規模數據流和實時分析。本文比較了它們的性能、擴展性和安全性,幫助你選擇最符合需求的解決方案。
Thumbnail
2024/11/22
RabbitMQ 和 Kafka 是兩種流行的消息處理工具,各自擅長不同的應用場景。RabbitMQ 以低延遲和靈活的消息路由著稱,適合即時通信和微服務;Kafka 則專注於高吞吐量和數據持久化,適用於大規模數據流和實時分析。本文比較了它們的性能、擴展性和安全性,幫助你選擇最符合需求的解決方案。
Thumbnail
2024/11/22
Message Queue 和 Streaming Process 是分佈式系統中最重要的技術之一,但它們的應用場景和特性有明顯區別。消息隊列適合可靠的低延遲通信,而流處理專注於大規模數據流的實時分析。本文深入比較兩者特性,幫助你根據需求選擇合適的技術,打造更高效的系統架構!
Thumbnail
2024/11/22
Message Queue 和 Streaming Process 是分佈式系統中最重要的技術之一,但它們的應用場景和特性有明顯區別。消息隊列適合可靠的低延遲通信,而流處理專注於大規模數據流的實時分析。本文深入比較兩者特性,幫助你根據需求選擇合適的技術,打造更高效的系統架構!
Thumbnail
2024/11/22
本文介紹如何使用 Docker 部署 Kafka 和 Zookeeper,並透過 Node.js 實現 Kafka 的訊息生產者與消費者。內容涵蓋 Kafka 和 Zookeeper 的 Docker 配置、使用 KafkaJS 進行訊息生產與消費,並透過 API 來發送和接收消息。
Thumbnail
2024/11/22
本文介紹如何使用 Docker 部署 Kafka 和 Zookeeper,並透過 Node.js 實現 Kafka 的訊息生產者與消費者。內容涵蓋 Kafka 和 Zookeeper 的 Docker 配置、使用 KafkaJS 進行訊息生產與消費,並透過 API 來發送和接收消息。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
本文介紹了 Docker 的基本概念,包括 Docker Image、Docker Container、Dockerfile、Docker Compose 及其應用情境,如開發與測試環境、微服務架構和持續整合/持續部署。瞭解這些內容能幫助開發人員更有效地利用 Docker 進行應用程式的部署和管理。
Thumbnail
本文介紹了 Docker 的基本概念,包括 Docker Image、Docker Container、Dockerfile、Docker Compose 及其應用情境,如開發與測試環境、微服務架構和持續整合/持續部署。瞭解這些內容能幫助開發人員更有效地利用 Docker 進行應用程式的部署和管理。
Thumbnail
我們在「【🔒 MLOps - Airflow】使用docker compose架設Airflow」有教您如何使用Docker來架設Airflow的環境, 而這個章節我們準備在DAG的流程中設計一個呼叫Docker去執行作業的節點, 這對於我們容器化的工作流會非常有幫助, 而且運行過程中也減少對主機
Thumbnail
我們在「【🔒 MLOps - Airflow】使用docker compose架設Airflow」有教您如何使用Docker來架設Airflow的環境, 而這個章節我們準備在DAG的流程中設計一個呼叫Docker去執行作業的節點, 這對於我們容器化的工作流會非常有幫助, 而且運行過程中也減少對主機
Thumbnail
本文詳細介紹了如何使用 Docker 環境構建 Laravel 後端和 Nuxt 前端,並通過 Nginx 進行反向代理來協調它們的互動。從 docker-compose.yml 配置到各個服務的設定,讓開發環境穩定運行,並提供了常用的 Docker 指令以便於操作。
Thumbnail
本文詳細介紹了如何使用 Docker 環境構建 Laravel 後端和 Nuxt 前端,並通過 Nginx 進行反向代理來協調它們的互動。從 docker-compose.yml 配置到各個服務的設定,讓開發環境穩定運行,並提供了常用的 Docker 指令以便於操作。
Thumbnail
※ 必備開發環境: Node.Js環境。 Npm或yarn套件管理工具。 Docker倉庫套件:可以快速建立MySQL的資料庫。 下載 Docker Desktop:Docker Desktop for Windows。 ※ Docker快速建立MySQL資料庫,使用步驟: 準備Dock
Thumbnail
※ 必備開發環境: Node.Js環境。 Npm或yarn套件管理工具。 Docker倉庫套件:可以快速建立MySQL的資料庫。 下載 Docker Desktop:Docker Desktop for Windows。 ※ Docker快速建立MySQL資料庫,使用步驟: 準備Dock
Thumbnail
我們在「【Message Queue - Kafka】串流時代的超入門簡介」有介紹到關於Kafka的基礎概念, 那麼本章節主要著重於生產者(Producer)的面向來細部探討, 看看生產者(Producer)究竟是什麼? 有哪些應該要注意的? 我們今天的主題除了說明生產者(Producer)的
Thumbnail
我們在「【Message Queue - Kafka】串流時代的超入門簡介」有介紹到關於Kafka的基礎概念, 那麼本章節主要著重於生產者(Producer)的面向來細部探討, 看看生產者(Producer)究竟是什麼? 有哪些應該要注意的? 我們今天的主題除了說明生產者(Producer)的
Thumbnail
RabbitMQ是一個開源的消息代理軟件,通常用於實現應用程序之間的異步通訊。它允許應用程序發送和接收消息,而不必直接與其他應用程序進行交互。
Thumbnail
RabbitMQ是一個開源的消息代理軟件,通常用於實現應用程序之間的異步通訊。它允許應用程序發送和接收消息,而不必直接與其他應用程序進行交互。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News