emqtt & plugin for eggjs

emqtt简介

http://www.emqtt.com/docs/v2/index.html

EMQ 2.0 (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源 MQTT 消息服务器。

解决问题:
  • 长链接的消息订阅模型(基于tcp/websocket),好处是自己不用自定(web)socket的协议,性能>> 轮询
  • 据官网说能百万连接(?)
  • QOS
  • 开源的轮子

可能的问题:

  • 需要可靠性测试和压力测试
  • 开源的坑(开源版本弱于商业版本,开源漏洞修改不及时)
  • erlang二次开发困难

mqtt协议: http://www.emqtt.com/docs/v2/mqtt.html

栗子

# 启动emqtt服务器
unzip emqttd-macosx-v2.0.zip && cd emqttd

# 启动emqttd
./bin/emqttd start

# 检查运行状态
./bin/emqttd_ctl status

# 停止emqttd
./bin/emqttd stop

 node 和 浏览器使用mqtt.js : https://github.com/mqttjs/MQTT.js#browser

//使用 mqtt.js
var mqtt = require('mqtt')
var client  = mqtt.connect('mqtt://test.mosquitto.org')

client.on('connect', function () {
  client.subscribe('presence')
  client.publish('presence', 'Hello mqtt')
})

client.on('message', function (topic, message) {
  // message is Buffer
  console.log(message.toString())
  client.end()
})

egg mqtt plugin

需求

  1. egg获取(监听)mqtt服务器消息
  2. egg根据逻辑发布mqtt消息

解决方案

1

要求在egg js服务器中使用一个长期运行的进程进行处理:

egg js agent:

  • 多进程模型和进程间通讯: http://eggjs.org/zh-cn/core/cluster-and-ipc.html
  • 多进程研发模式增强: http://eggjs.org/zh-cn/advanced/cluster-client.html

在agent.js里面处理监听:

  • 使用emqtt 的$SYS主题订阅获得服务器信息: http://www.emqtt.com/docs/v2/guide.html#sys
    • 使用mqtt.js
  • 使用emqtt的http接口主动获得服务器信息:http://www.emqtt.com/docs/v2/rest.html
    • 此处注意需要进行http base认证(全明文传输包括用户名或者密码的信息,需要注意环境或者加密)
    • 可以使用egg的 agent.curl 实现
  • 处理错误,agent进程的稳定性要求高:
    • mqtt.js的错误
    • curl的错误
    • 其他

2

使用mqtt.js 根据逻辑处理:

  • 在agent里面处理业务
  • 给worker进行发消息(rpc)让其干活
  • 其他

3

插件化:订阅/监听逻辑写在插件根目录下的agent.js里面,发布逻辑看个人实现