如何使用NODEJS+REDIS開發一個消息隊列


作者: RobanLee

原創文章,轉載請注明: 蘿卜李 http://www.robanlee.com

 

MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們>。消 息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程序通過 隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。其中較為成熟的MQ產品有IBM WEBSPHERE MQ。

以上介紹仍舊來自百度百科.

 

消息隊列產品對比

目前比較流行的MQ有2種,ActiveMQ 以及 RabbitMQ , RabbitMQ性能號稱能夠達到每秒10000,而REDIS官方的壓力測試值在7-8萬之間,而且是去掉了網絡IO操作,真實情況我估計在每秒2-3萬的並發操作,但這個數目對於一般的應用應該足夠了.

 

Redis如何支持消息隊列?

在新版本的redis v2.6以上以及以上版本開始支持 subscribe 以及 publish 操作,  subscribe訂閱一個頻道,publish可以像頻道廣播消息. 這個機制最老的應用應該是算是聊天室了.

Sub/Pub 模式固然很好用,但是同樣有一個問題,就是如果有多個人訂閱了同一頻道,而這個頻道的數據只能被一個接收方處理,不能夠重復處理,這時該怎么辦?

解決方法有2種,

1. publish  將數據寫入到一個list or sorted list 隊列,寫完成后開始給終端廣播消息,告訴大家,有新的數據等待處理,這個時候,誰能pop到數據,就是誰處理,這個操作是原子性的,也就是說不會被重復處理.

2. 使用阻塞模式, redis提供了blpop brpop這種操作,也就是一直阻塞一個隊列,直到有數據來. 這種模式保證了數據的原子性,而且使應用程序可以支持分布式多台機器部署.

 

 

Sub/Pub模式 (sub.js):

var redis = require("redis");
var client = redis.createClient(6379, '127.0.0.1', {connect_timeout: 1});

//訂閱一個頻道
var sub = function(c) {
    var c = c || 'roban:test:channel';
    client.subscribe(c,function(e){
        console.log('starting subscribe channel:'+c);
    });
};

//訂閱一個頻道
sub();

//處理錯誤,如果出現錯誤,或者服務器斷開了鏈接,等待恢復時,繼續訂閱這個頻道
client.on('error', function(error) {
    console.log(error);
    sub();
});


//訂閱處理函數
client.on('message',function(err,response){
    console.log(response);
});

打開redis命令行,輸入以下命令:

publish roban:test:channel hello

發布這條信息后,sub端會輸出以下信息:

Robans-Pro:node robanlee$ node demo.js 
starting subscribe channel:roban:test:channel
hello


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM