阿里云微消息队列 MQTT

2024-05-31 07:08
文章标签 阿里 队列 消息 mqtt 云微

本文主要是介绍阿里云微消息队列 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1017543

相关文章

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一