阿里云微消息队列 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",
})
文振熙 CSDN认证博客专家 Go/GoLang PHP 分布式
六年技术研发经验、四年后端技术架构经验,带领管理过45+技术团队和技术架构团队,从零到一帮助公司组建了后端团队、 运维团队和大数据团队,并且不断演进推广前沿技术;

多年来一直坚持产出优质原创博文,共创作169篇原创博客,全网阅读量破百万,并且被CSDN开源社区授予CSDN认证专家,

参加或主导多个开源项目研发(PhalApi、GoCore、GoRSA、KT-connect);
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页