MQTT-Node.js實(shí)現(xiàn)-Mosca簡(jiǎn)介

最近做了個(gè)即時(shí)通訊的小項(xiàng)目也在這期間接觸到了MQTT這個(gè)東西,如果你能搜到這篇博客钉跷,說(shuō)明你對(duì)MQTT起碼有大致了解的弥鹦,就不在這進(jìn)行介紹了。今天我們要講的是MQTT的一個(gè)node.js實(shí)現(xiàn)-----Mosca,由于本身對(duì)MQTT規(guī)范了解也不深,在這里就主要以代碼為主彬坏。

什么是Mosca

Mosca是MQTT在Node.js中的一個(gè)Broker的開(kāi)源實(shí)現(xiàn)朦促,通俗講也就是MQTT中的Server實(shí)現(xiàn)。
同時(shí)作者也維護(hù)著MQTT.js這一模塊栓始,這一模塊大家可理解為MQTT的Client實(shí)現(xiàn)务冕。而縱觀整個(gè)Node.js的module中比較有分量的也就以上兩個(gè)module.

如何實(shí)現(xiàn)即時(shí)聊天功能

沒(méi)有調(diào)研過(guò)其他的聊天軟件是怎么實(shí)現(xiàn)一對(duì)一推送的,下面簡(jiǎn)單介紹下MQTT是怎么實(shí)現(xiàn)的幻赚。MQTT是簡(jiǎn)單的發(fā)布訂閱模式禀忆,也就是說(shuō)當(dāng)一條消息發(fā)出去的時(shí)候,誰(shuí)訂閱了誰(shuí)就會(huì)受到落恼,而應(yīng)用于即時(shí)通訊的話油湖,我們就需要進(jìn)行1對(duì)1的進(jìn)行聊天,這時(shí)候我們就需要领跛,每個(gè)客戶端訂閱自己的一個(gè)專(zhuān)屬channel乏德,然后由Broker來(lái)進(jìn)行推送(Broker做的話,可以實(shí)現(xiàn)消息過(guò)濾吠昭,離線消息等)喊括。

在這過(guò)程中也遇到了一些問(wèn)題,比如對(duì)于即時(shí)通訊來(lái)說(shuō)矢棚,客戶端應(yīng)該以什么作為自己的專(zhuān)屬channel郑什,在我接手這個(gè)項(xiàng)目之前他們訂閱的是設(shè)備號(hào),這樣其實(shí)有很多問(wèn)題蒲肋,無(wú)法實(shí)現(xiàn)多設(shè)備同時(shí)在線蘑拯。每次用戶換設(shè)備登陸,服務(wù)器端都需要將相應(yīng)的離線消息進(jìn)行轉(zhuǎn)移兜粘,耗時(shí)耗力而且一些需求無(wú)法滿足申窘,所以我覺(jué)得客戶端訂閱應(yīng)該以用戶的唯一ID為channel,這樣就實(shí)現(xiàn)了客戶端多設(shè)備在線孔轴,以及離線消息等功能剃法。

如何實(shí)現(xiàn)離線消息功能

這里所說(shuō)的離線消息是指,當(dāng)設(shè)備離線Mqtt斷開(kāi)了之后路鹰,這時(shí)候向用戶推送的數(shù)據(jù)贷洲,會(huì)在用戶下次上線的時(shí)候推給用戶。

這個(gè)地方客戶端有兩個(gè)關(guān)鍵點(diǎn):

  • 客戶端cleanSession需要設(shè)置為false.則該鏈接便會(huì)認(rèn)為是持久連接晋柱,當(dāng)鏈接斷開(kāi)的時(shí)候优构,發(fā)送的消息便會(huì)進(jìn)行報(bào)錯(cuò),直到下次鏈接再次建立雁竞,會(huì)將這些消息發(fā)送給客戶端
  • Qos標(biāo)志钦椭,在Mqtt標(biāo)準(zhǔn)鐘,對(duì)Qos有3種設(shè)置,在這里我們需要將Qos設(shè)置為1玉凯。更多Qos介紹势腮,請(qǐng)點(diǎn)擊

上面所說(shuō)的兩個(gè)關(guān)鍵是是客戶端需要設(shè)置的联贩。在在這里我們用到的Mosca也有需要注意的地方便是發(fā)布訂閱的模型選擇漫仆。詳情點(diǎn)擊ascoltatori。這一模塊是構(gòu)建Mosca的核心模塊之一泪幌。

我之前一同事進(jìn)行過(guò)測(cè)試盲厌,當(dāng)采用redis,mongodb作為發(fā)布訂閱模型的話會(huì)出現(xiàn)離線消息數(shù)據(jù)錯(cuò)亂的情況,經(jīng)過(guò)多次測(cè)試之后祸泪,我發(fā)現(xiàn)ZeroMQ吗浩,和RabbitMQ這種消息隊(duì)列的離線數(shù)據(jù)是完全按照發(fā)送的順序,離線發(fā)送没隘。

示例代碼

在這里我們將演示一下離線消息發(fā)送懂扼,在這里我們采用的是zeroMQ最為訂閱發(fā)布模型

Client pub

var mqtt = require('mqtt');

var client = mqtt.createClient(5112, '182.92.149.22');

//client.subscribe('presence');
var num = 0;
setInterval(function (){
  client.publish('order', 'Hello mqtt ' + (num++),{qos:1, retain: true});
}, 1000);

Client Sub

var mqtt = require('mqtt');

var client = mqtt.createClient(5112, 'localhost',{clientId:'1',clean:false});

client.subscribe('test',{qos:1});

client.on('message', function (topic, message) {
  console.log(message);
});

Mosca Server

var mosca = require('mosca')
var settings = {
  port: 5112,
  backend:{
     type: 'zmq',
      json: false,
      zmq: require("zmq"),  
      port: "tcp://127.0.0.1:33333",
      controlPort: "tcp://127.0.0.1:33334",
      delay: 5
  },
  persistence:{
    factory: mosca.persistence.Mongo,
    url: "mongodb://localhost:27017/mosca"
  }
};
var server = new mosca.Server(settings);
server.on('ready', function(){
    console.log('Mosca server is up and running');  
});
server.on('published', function(packet, client) {
  console.log('Published', packet.payload);
});

在上面我們看到我們使用zeromq作為發(fā)布訂閱模型, mongodb作為持久化Db右蒲,你可以先將Mosca server以及 Client pub啟動(dòng)阀湿,過(guò)一段時(shí)間你再啟動(dòng)Client sub。這時(shí)候你會(huì)發(fā)現(xiàn)瑰妄,收到的消息會(huì)是從1開(kāi)始的陷嘴,,

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末间坐,一起剝皮案震驚了整個(gè)濱河市灾挨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竹宋,老刑警劉巖劳澄,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蜈七,居然都是意外死亡浴骂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)宪潮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)溯警,“玉大人,你說(shuō)我怎么就攤上這事狡相√萸幔” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵尽棕,是天一觀的道長(zhǎng)喳挑。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么伊诵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任单绑,我火速辦了婚禮,結(jié)果婚禮上曹宴,老公的妹妹穿的比我還像新娘搂橙。我一直安慰自己,他們只是感情好笛坦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布区转。 她就那樣靜靜地躺著,像睡著了一般版扩。 火紅的嫁衣襯著肌膚如雪废离。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天礁芦,我揣著相機(jī)與錄音蜻韭,去河邊找鬼。 笑死柿扣,一個(gè)胖子當(dāng)著我的面吹牛肖方,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窄刘,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼窥妇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了娩践?” 一聲冷哼從身側(cè)響起活翩,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翻伺,沒(méi)想到半個(gè)月后材泄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吨岭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年拉宗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辣辫。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旦事,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出急灭,到底是詐尸還是另有隱情姐浮,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布葬馋,位于F島的核電站卖鲤,受9級(jí)特大地震影響肾扰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛋逾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一集晚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧区匣,春花似錦偷拔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)悦污。三九已至铸屉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間切端,已是汗流浹背彻坛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踏枣,地道東北人昌屉。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像茵瀑,于是被迫代替她去往敵國(guó)和親间驮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容