本文主要是介绍阿里云微消息队列 MQTT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
因为工作上的事情比较繁忙,近期的博客更新率已经创了新低,所以想着把一些工作上的调研笔记📒进行一些分享,希望可以帮助到想了解特定知识的小伙伴。
今天推荐给大家的是阿里云的MQTT队列服务,笔者早期发不过去EMQ-MQTT系列,但是现在整个集群连接规模已经破了百万,也涌现出了很多问题:
- 集群稳定性堪忧,大流量会导致雪崩使用iptable限流也只能缓解
- 安全性堪忧,密码规则认证过于简单,虽然有TLS证书配置但是相比之下资源消耗是不加TLS的四倍,如果用TLS终结前置服务器最少16台也是恐怖的支出和维护成本
- MQTT并不适用于服务端通讯,EMQ把消息和服务端专业队列对接是需要购买高级版本,开源版本做不到
- 全球化支持堪忧,自建集群在全球提供服务的稳定性一直是个风险点
基于以上几类问题笔者最终选择演进到阿里云提供的MQTT能力能够有效解决以上问题
- 云服务提供强大的并发连接能力和高可用,不怕雪崩问题
- 阿里云有一套完整的Token体系无需自建安全模式,TLS也无需你关系具体细节
- 阿里云消息可以直接和RocketMQ打通,各种高级特性都可以使用,保障消息达到和消息追踪可以省下很多功夫
- 阿里云支持全球节点通过阿里云专线同步消息到RockerMQ供服务器处理
一、基础资料:
管理后台地址:https://mqtt.console.aliyun.com/#/Index
文档地址:https://help.aliyun.com/document_detail/42419.html
推荐内核版本:V3.3.0(账号需要单独升级才能使用)
二、客户端连接规范
Group名称(对应不同的):
-
GID_online-shop
-
GID_qpos
ClientName:
-
GID_online-shop@@@
-
GID_qpos@@@
Topic规则:
-
主Topic名称(general用于公共消息):
-
/online-shop/
-
/qpos/
-
/general/
-
-
批量接受消息Topic名称:
-
/online-shop/shopid//sub
-
/qpos/shopid//sub
-
/general/shopid//sub
-
-
批量发送Topic名称:
-
/online-shop/shopid//push
-
/qpos/shopid//push
-
/general/shopid//push
-
-
P2P通讯Topic名称:
-
/online-shop/p2p/
-
/qpos/p2p/
-
username:Token|{KEY}|{name}
password:token
PS:连接信息获取通过API进行获取,使用登录的省份token进行获取,连接信息和对应的topic均由云端进行返回
三、服务端连接规范
服务端不连接MQTT协议和终端通讯,直接连接RocketMQ能力来和终端进行通讯(云端无需直接连接MQTT)
实例名:DEV
api路由:
-
/b/v1/mqtt/qpos/TokenAuth
-
/b/v1/mqtt/online-shop/TokenAuth
接受消息:
-
online-shop-mqtt-push
-
qpos-mqtt-push
发送消息:
-
online-shop-mqtt-push
-
qpos-mqtt-push
消费者Group名:GID_online_shop_mqtt
上下线消息RocketMQ接受规则:
-
online-shop -> online-shop-mqtt-updown
-
qpos -> qpos-mqtt-updown
四、FAQ清单:
问题一:申请的token怎么连接,填在密码一栏还是用户名一栏?
客户端:必须按照约定形式将 Token 作为连接参数设置到 Password 中,每次连接时上传。
问题二:Group起到什么作用,我们设备是使用同一是否可以?
Group 可以对接入方进行分组,每个client要区分分组
问题三:topic是用户批量发送消息使用的有数量限制,云端和设备端通讯时应当使用何种方式 才是最佳实践 ?
通过P2P模式下可以无需单独定义Topic,可通过GID_xxxx@@@DEVICEID_001直接通讯
P2P 消息收发模式(MQTT)_功能概述_V3.x.x 文档合集_微消息队列 MQTT 版-阿里云
问题四:是否能够使用QOS2来保障消息绝对到达安卓设备仅一次?
QOS2无法使用到离线消息的能力,在有离线消息需求的场景下使用QOS1最佳,但是端有可能会收到多次重复消息,需要判断有效性进行去重
名词解释_产品简介_V3.x.x 文档合集_微消息队列 MQTT 版-阿里云
问题五:对于离线消息是否可以利用RocketMQ+MQTT来达到必定到达的效果,无需独立维护消息确认逻辑(如果设备不在线推送一条,设备上线了能收到吗?);
直接支持有现成DEMO
Demo 工程_SDK 参考_V3.x.x 文档合集_微消息队列 MQTT 版-阿里云
问题六:上下线感知能力,断线多久会有通知
如果客户端断网2分钟就会有断链通知
致命问题:当前MQTT消息流入RocketMQ回丢失掉topic和client无法正常接收消费;
解决方案一:在发送body的同时发送topic和client信息带入其中
解决方案二:开发一个中转程序来吧消息中转会RocketMQ
五、最佳实践
-
如何建立和shopID或用户身份的关系
-
在连接断开事件中维护一下数据
-
shopid对于的设备LIST
-
clientID 对应的 shoID
-
-
使用topic 子 topic 来
-
-
token怎么返回给设备端
-
Token有效期:30天
-
如果因为Token失效无法连接,需要重新获取Token
-
完成登录动作后,安卓请求获取MQTT配置接口拉取配置
- token、连接地址、ClientID、P2P通讯Topic名称、店铺子Topic名称
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4LeK9Oik-1615689375720)(https://tcs.teambition.net/storage/111v50c2480780c64a90ef1907e45574b79b?Signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBcHBJRCI6IjU5Mzc3MGZmODM5NjMyMDAyZTAzNThmMSIsIl9hcHBJZCI6IjU5Mzc3MGZmODM5NjMyMDAyZTAzNThmMSIsIl9vcmdhbml6YXRpb25JZCI6IiIsImV4cCI6MTYxNjI5NDA0MiwiaWF0IjoxNjE1Njg5MjQyLCJyZXNvdXJjZSI6Ii9zdG9yYWdlLzExMXY1MGMyNDgwNzgwYzY0YTkwZWYxOTA3ZTQ1NTc0Yjc5YiJ9.RpuuS8axA5CNlITaCf-B7APn229pLlyZE_qUysRgFl0&download=image.png “”)]
-
权限控制,避免恶意跨店铺发送消息
- 对任何连接MQTT的Client明确控制能够使用的topic只有云端可以对所有topic进行消息收发
-
使用TLS安全连接
- 使用 8883 端口 和 ssl协议
-
客户端需要按照最佳实践监听系统推送
Token 客户端接口_Token 鉴权模式_MQTT 客户端权限验证_V3.x.x 文档合集_微消息队列 MQTT 版-阿里云
使用细节
后端推送固定格式
{action : "goods-update",data : {"shopid":55},time : 1596412800
}
发送消息:
data := `
{action : "goods-update",data : {"shopid":55},time : 1596412800
}
`result, err := aliyunmq.GetProducer("aliyunmq").SendMessageSync(&rocketmq.Message{Topic: "qpos-mqtt-push",Body: data,Tags: "general/shopid/1338/sub",
})
这篇关于阿里云微消息队列 MQTT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!