通過云消息隊列 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的更多信息,請參見名詞解釋