阿里云微消息队列 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实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time