通过微消息队列 MQTT 版所提供的服务,可采用统一的框架,即云控制台,来管理不同部署模式的云存储网关 CGS(Cloud Storage Gateway),并实现安全合规的公网和私网穿透,以此提供一致的用户体验。
名词解释
- MQTT
- 一种物联网和移动互联网领域的行业标准协议,适合移动终端之间的数据传输。微消息队列 MQTT 版默认支持该协议。
- 云存储网关 CSG(Cloud Storage Gateway)
- 下文简称 CSG,是一款可在用户的互联网数据中心 IDC(Internet Data Center)和阿里云上部署的网关实例,以阿里云 OSS 为后端存储,通过低成本的虚拟机服务器,给云上和云下应用提供业界标准的 NFS 和 CIFS 文件存储服务,以及 iSCSI 的块存储服务。详情请参见云存储网关官网文档。
- MQTT 服务器
- 微消息队列 MQTT 版提供的 MQTT 协议交互的服务端节点,用于接收消息并转发消息。
- MQTT 客户端
- 用于和 MQTT 服务器交互的节点,本方案中特指 CSG 实例侧的客户端。
- RDS
- 阿里云推出的一种稳定可靠、可弹性伸缩的在线数据库服务。
- SLS
- 阿里云推出的日志存储服务,用于审计和溯源。
背景信息
CSG 是一款帮助用户在现有本地应用程序、基础设施和数据存储与阿里云之间实现无缝集成的存储服务。通过可在本地和云上部署的兼容行业标准存储协议的虚拟设备,将现有的存储应用程序和工作负载连接阿里云存储服务,无缝对接阿里云的存储和计算平台。
CSG 有以下两种部署形态:
- 通过虚拟机方式部署和运行在用户自己的 IDC
- 直接部署和运行在阿里云的虚拟网络环境中的 ECS 上向用户提供服务
在这两种部署模式下,CSG 实例都是采用的私网部署,特别是在用户 IDC 部署的 CSG 虚拟机,出于安全的考虑,没有公网可以访问的 IP 地址,无法被 CSG 云控制台直接访问。部署在阿里云上的 CSG 也不太适合采用公网 IP 地址的形式和云控制台通讯,会有安全隐患和被攻击的可能。
微消息队列 MQTT 版即可用于实现 CSG 云控制台和两种部署模式下的 CSG 实例的互通。
CSG 的两种部署模式下的公网和私网互通的架构图如图 1 所示。

方案架构
微消息队列 MQTT 版用于消息的推送和收集,把部署在不同地理位置的 CSG 通过消息推送和主动拉取的方法,下发控制指令和收集 CSG 实例状态,用于在控制台的展示。同时基于微消息队列 MQTT 版的推送功能也实现了输出 API 用于对每个 CSG 实例的管理。整体架构如图 2 所示。

方案优势
本方案的优势如下所述:
- 服务能力强,可弹性伸缩。
- 微消息队列 MQTT 版消息传输能力无限扩展,CSG 实例数量增加无需担心系统能力不足。
- 微消息队列 MQTT 版支持百万级设备毫秒级推送完成,CSG 的控制指令无拥塞。
- 微消息队列 MQTT 版传输支持 SSL/TLS 加密,无需担心数据泄露。
- 所有服务节点高可用,稳定性高。
- 多种语言 SDK 支持方便服务端和应用端的开发。
- 私网和公网同时支持,适配多种网络需求。
注意事项
上述流程简要描述了如何使用微消息队列 MQTT 版和消息队列 RocketMQ 版实现统一的跨网络的管理架构,具体的 SDK 说明请参见微消息队列 MQTT 版和消息队列 RocketMQ 版文档。
其中使用微消息队列 MQTT 版构建跨网络的信令传输时,相关的消息类型设计以及参数设计请尽可能遵循如下原则:
- 客户端 ID 映射
MQTT 协议要求每个客户端都有一个全局唯一的 Client ID,Client ID 由以下两部分组成,这两部分通过 “@@@” 分隔符连接,只需要保证最终的 Client ID 唯一且总长度不超过 64 个字符即可:
- 前缀 Group ID:Group ID 需在微消息队列 MQTT 版控制台申请。建议 Group ID 按照 CSG 控制台所在的阿里云地域进行分类,例如华东1(杭州)和华东2(上海)采用不同的 Group ID,方便定位出有问题的地域和消息队列。
- 后缀 Device ID:Device ID 由应用生成。Device ID 可以和每个 CSG 实例的 ID 进行一一映射,确保全局唯一。
Client ID 的更多信息请参见名词解释。
- Topic 名称映射
使用微消息队列 MQTT 版收发消息需要了解 MQTT 协议订阅关系的模型,详情请参见协议文档和官网文档。
MQTT 是遵循发布/订阅模型的消息协议,订阅关系和 Topic 符合目录树格式,Topic 可分为父级 Topic 和子级 Topic,Topic(包含父级 Topic 和子级 Topic)的总长度不能超过 64 个字符:- 父级 Topic:通常称目录树第一级的 Topic 为父级 Topic。父级 Topic 需要在微消息队列 MQTT 版控制台申请后才可使用,申请后相当于一个 Namespace。
- 子级 Topic:目录树第一级的 Topic 的后续部分称为子级 Topic。子级 Topic 无需申请,业务方可以随意指定。
Topic 的更多信息请参见名词解释。
业务方设计用于消息收发的 Topic 时,需要遵循以下原则:
- 上行消息(CSG 实例发给管控服务的消息)和下行消息(管控服务发给 CSG 实例的消息)使用不同的父级 Topic。
- 不同优先级或者消息量级差别比较大的消息使用不同的父级 Topic。
对于上文描述的交互流程,建议使用微消息队列 MQTT 版提供的 P2P 消息。P2P 消息不需要订阅,发送方直接指定对端接收即可,详情请参见 P2P 消息收发模式(MQTT)。
- 收发消息参数设计
由于 CSG 控制台是利用 MQTT 模拟的 RPC 调用,控制台下发的消息,没有返回值就直接用 noreply 表示,无需重复接受之前的消息。控制台会在接到错误码后,提示用户再次下发指令。需在 MQTT 客户端做以下配置:
- cleanSession 参数设置为 “true”
cleanSession 的更多信息,请参见名词解释。
在文档使用中是否遇到以下问题
更多建议
匿名提交