通过微消息队列 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 和消息队列 MQ 实现统一的跨网络的管理架构,具体的 SDK 说明请参见微消息队列 MQTT消息队列 MQ 文档。

其中使用微消息队列 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 的更多信息,请参见名词解释