通过微消息队列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所示。

图 1. 混合云存储部署
混合云存储部署

方案架构

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

图 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的更多信息,请参见名词解释