作者: 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