常见的mq有Kafka,RocketMQ和RabbitMQ,大家也很常见。 前者很常见,MQTT是什么呢?MQTT属于IoT也就是物联网的概念。
常见的mq有Kafka,RocketMQ和RabbitMQ,大家也很常见。MQTT是什么呢?
Kafka,RocketMQ和RabbitMQ属于微服务间的mq,而MQTT则属于IoT也就是物联网的概念。
mqtt.js是MQTT在nodejs端的实现。vue技术栈下的前端也可用。
mqtt.js官方为微信小程序和支付宝小程序也做了支持。微信小程序的MQTT协议名为 wxs ,支付宝小程序则是 alis 。
如果还是一脸懵逼,那么就跟随我通过mqtt.js去认识一下这个物联网领域的宠儿吧。
- 什么是微消息队列?
- MQTT关键名词解释
- P2P消息和Pub/Sub消息
- 封装的mqtt.js通用class
- 客户端发包函数sendPacket
- 客户端连接 mqtt.connect()
- 订阅topic mqtt.Client#subscribe()
- 发送消息 mqtt.Client#publish()
- 接收消息 mqtt.Client#“message”事件
什么是微消息队列?
消息队列一般分为两种:
- 微服务消息队列(微服务间信息传递,典型代表有RabbitMQ,Kafka,RocketMQ)
- 物联网消息队列(物联网端与云端消息传递,代表有MQTT)
目前我实践过的,也就是我们本篇博文深入分析的,是物联网消息队列的mqtt.js。
传统的消息队列(微服务间信息传递)
传统的微服务间(多个子系统服务端间)消息队列是一种非常常见的服务端间消息传递的方式。
典型代表有:RabbitMQ,Kafka,RocketMQ。
阿里云官网拥有AMQP(兼容RabbitMQ),Kafka,和RocketMQ这三种微服务消息队列,对于我们今后在实际项目中落地提供了很大的帮助。
更多微服务消息队列可查看: node-mq-tutorial
使用场景多种多样:
- 高并发:秒杀、抢票(FIFO)
- 共享型:积分兑换(多子系统共用积分模块)
- 通信型:服务端间消息传递(nodejs,java,python,go等等)
MQTT消息队列(物联网端与云间消息传递)
MQTT是一个物联网MQTT协议,主要解决的是物联网IoT网络情况复杂的问题。
阿里云有MQTT消息队列服务。通信协议支持MQTT,STOMP,GB-808等。数据传输层支持TCP长连接、SSL加密、Websocket等。
使用场景主要为数据传输:
- 车联网(远程控制,汽车数据上传)
- IM通讯(1对1单聊,1对多朋友圈)
- 视频直播(弹幕通知,聊天互动)
- 智能家居(电器数据上传,遥控指令)
目前我手上负责的运行了2年的聊天系统就是使用的这个服务,我们主要按照 设备serverPC 的方式, MQTT协议,Websocket传输协议 进行设备与PC间的数据通信。
MQTT关键名词解释
实例(Instance)
每个MQTT实例都对应一个全局唯一的服务接入点。
肉眼可见的区别就是在通过 mqtt.connect(url) 与server(broker)建立连接时,broker的url都是一致的。
假设有saleman1,salesman2···他们本地的前端与服务端间建立连接的url都是统一的,只是在clientId进行区分即可。
客户端Id(Client ID)
MQTT的Client ID是每个客户端的唯一标识,要求全局都是唯一的,使用同一个Client ID连接会被拒绝。
阿里云的ClientID由两部分组成 @@@ 。
通常情况下Group ID是多前端统一的,比如PC端,安卓移动端,ios移动端,DeviceID也是多前端统一的。
那么如何区分多端呢?可以对Client ID中间的@@@做修改。
比如:
let CID_PC = `@@@-PC`let CID_Android = `@@@-Android`let CID_IOS = `@@@-IOS`
组Id(Group ID)
用于指定一组逻辑功能完全一致的节点公用的组名,代表的是一类相同功能的设备。
Device ID
每个设备独一无二的标识。这个需要保证全局唯一,可以是每个传感器设备的序列号,可以是登录PC的userId。