摘要:使用rabbitmq的訊息佇列,可以有效提高系統的峰值處理能力。
rabbitmq是訊息**(message broker),它支援多種非同步訊息處理方式,最常見的有:
rabbitmq還支援routing、topics、以及remote procedure calls (rpc)等方式。
對於不同的訊息處理方式,有一點是相同的,rabbitmq是介於訊息的生產者和消費者的中間節點,負責快取和分發訊息。rabbitmq接收來自生產者的訊息,快取到記憶體中,按照不同的方式分發給消費者。rabbitmq還可以將訊息寫入磁碟,保證持久化,這樣即使rabbitmq意外崩潰了,訊息資料不至於完全丟失。
最簡單的一點在於,它支援work queue等不同的訊息處理方式,可以用於不同的業務場景。對於我們fundebug來說,目前只用過rabbitmq的work queue,即訊息佇列。
使用訊息佇列,可以將不算緊急、但是非常消耗資源的計算任務,以訊息的方式插入到rabbitmq的佇列中,然後使用多個處理模組處理這些訊息。
這樣做最大的好處在於:提高了系統峰值處理能力。因為,來不及處理的訊息快取在rabbitmq中,避免了同時進行大量計算導致系統因超負荷執行而崩潰。而那些來不及處理的訊息,會在峰值過去之後慢慢處理掉。
另乙個好處在於解耦。訊息的生產者只需要將訊息傳送給rabbitmq,這些訊息什麼時候處理完,不會影響生產者的響應效能。
廣告:歡迎免費試用fundebug,為您監控線上**的bug,提高使用者體驗~
使用docker執行rabbitmq非常簡單,只需要執行一條簡單的命令:
sudo docker run -d --name rabbitmq -h rabbitmq -p 5672:5672 -v /var/lib/rabbitmq:/var/lib/rabbitmq registry.docker-cn.com/library/rabbitmq:3.7
對於不熟悉docker的朋友,我解釋一下docker的命令選項:
docker為官方映象提供了加速服務,因此命令中rabbit的docker映象名為registry.docker-cn.com/library/rabbitmq:3.7。
如果你不會docker,建議你學習一下。如果你不想學,ubuntu 14.04下安裝rabbitmq的命令是這樣的:
sudo echo "deb testing main" | sudo tee -a /etc/apt/sources.list
wget -o- | sudo apt-key add -
sudo apt-get update
sudo apt-get install rabbitmq-server
啟動rabbitmq:
sudo service rabbitmq-server start
下面,我們使用node.js實現乙個簡單訊息佇列。
訊息的生產者:sender.js
const amqp = require("amqplib");
const queue = "demo";
async function sendmessage(message));}
setinterval(function()
, 1000)
訊息的消費者:receiver.js
const amqp = require("amqplib");
const queue = "demo";
async function receivemessage());}
receivemessage();
我們用到了amqplib模組,用於與rabbitmq進行通訊,對於具體介面的細節,可以檢視文件。
在呼叫sendtoqueue時,將persistent屬性設為true,這樣rabbitmq關閉時,訊息會被儲存到磁碟。測試這一點很簡單:
由於rabbitmq容器將儲存資料的目錄(/var/lib/rabbitmq)以資料卷的形式儲存在本地主機,因此即使將rabbitmq容器刪除(sudo docker rm -f rabbitmq)後重新執行,效果也是一樣的。
另外,這段**採用了node.js最新的非同步**編寫方式:async/await,因此非常簡潔,感興趣的同學可以了解一下。
這個demo的執行方式非常簡單:
sudo ./start_rabbitmq.sh
node ./sender.js
node ./receiver.js
在receiver端,可以看到不停地列印"hello, fundebug!"。
在生產環境中,rabbitmq難免會出現重啟的情況,比如更換磁碟或者伺服器、負載過高導致崩潰。因為rabbitmq可以將訊息寫入磁碟,所以資料是"安全"的。但是,**中必須實現自動重連機制,否則rabbitmq停止時會導致node.js應用崩潰。這裡提供乙個自動重連的**示例,給大家參考:
訊息生產者:sender_reconnect.js
const amqp = require("amqplib");
const queue = "demo";
var connection;
// 連線rabbitmq
async function connectrabbitmq()
); connection.on("error", function(err)
);connection.on("close", function());}
catch (err)
}connectrabbitmq();
訊息消費者:receiver_reconnect.js
const amqp = require("amqplib");
const queue = "demo";
var connection;
// 連線rabbitmq
async function connectrabbitmq()
); connection.on("error", function(err)
);connection.on("close", function());}
catch (err)
}connectrabbitmq();
這樣的話,即使rabbitmq重啟,sender和receiver也可以自動重新連線rabbitmq。如果你希望監控rabbitmq是否出錯,不妨使用我們fundebug的node.js錯誤監控服務,在連線觸發"error"或者"close"事件時,第一時間傳送報警,這樣開發者可以及時定位和處理bug。 RabbitMQ入門教程 路由(Routing)
繫結 bindings 之前的文章中我們已經建立過bindings,如下 channel.queuebind queue queuename,exchange exchange name,routingkey routing key,arguments null 繫結 bindings 是指交換機 ...
RabbitMQ入門教程 二 簡介和基本概念
rabbitmq是乙個開源的amqp實現,伺服器端用erlang語言編寫,支援多種客戶端。用於在分布式系統中儲存 訊息,在易用性 擴充套件性 高可用性等方面表現不俗,訊息佇列是一種應用系統之間的通訊方法,是通過讀寫出入佇列的訊息來通訊 rpc則是通過直接呼叫彼此來通訊的 amqp advanced ...
CSS入門教程
css是 cascading style sheets 的簡稱,中文翻譯為 串接樣式表 也有人翻譯為 樣式表 css用以作為網頁的排版和風格設計,在web標準建站中,對css的熟悉和使用是相當重要的乙個內容。css的作用是彌補html的不足,讓網頁的設計更為靈活。這個文章只是為您介紹css的基礎應用...