阿里云微消息队列 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

相关文章

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

如何通过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