通过云消息队列 MQTT 版所提供的服务,可采用统一的框架,即云控制台,来管理不同部署模式的云存储网关CSG(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的更多信息,请参见名词解释