直播互動解決方案
在線直播教育的場景通常會涉及多個直播間,且每個直播間中也會有多名成員。本文以單直播間、一名老師、兩名學生的場景為例,說明如何使用云消息隊列 MQTT 版實現直播互動消息、禁言、成員上下線通知以及系統消息通知,其中,老師和學生的客戶端以HTML網頁為例,后端應用以Java為例。
背景信息
在直播互動的場景下,您需創建相應的數據互通規則實現云消息隊列 MQTT 版與云消息隊列 RocketMQ 版的數據互通,包含數據流入規則、數據流出規則以及客戶端上下線通知規則。
使用云消息隊列 MQTT 版的客戶端收發消息時,服務端會根據MQTT客戶端設置的Username和Password參數來進行鑒權。針對不同的權限驗證場景,Username和Password參數具備不同的含義。在此場景下,Token鑒權模式更加適用。詳細信息,請參見Token鑒權概述。
本文不涉及其他產品中的操作,如需了解其他產品的操作,請參見在線教育視頻直播最佳實踐。
文中提及的名詞概念,請參見下文中的名詞解釋。
場景詳情
四個場景均以一名老師和兩名學生的在線教育場景為例。老師和學生使用不同的MQTT客戶端,通過不同的Group ID分組,不同的老師和學生通過Device ID區分。同一直播間的客戶端發送和訂閱消息的Topic需分開創建和使用,以免云消息隊列 RocketMQ 版形成消費死循環。具體示例如下。
場景一:直播互動消息
例如,一個在線教育直播間中有三名成員,一名老師和兩名學生。學生A在直播間發文字消息,直播間所有成員全部可見。您可以將一個直播間與一個MQTT的Topic對應,例如客戶端發送消息使用的Topic為roomSend/message,訂閱消息使用的Topic為room/message/123456,其中:
roomSend為直播間所有客戶端發送消息使用的父級Topic,需要在云消息隊列 MQTT 版控制臺創建。
room為直播間所有客戶端訂閱的父級Topic,需要在云消息隊列 MQTT 版控制臺創建。
/message為自定義的二級Topic,無需在云消息隊列 MQTT 版控制臺創建,本示例中其含義為文字消息。
/123456為自定義的三級Topic,無需在云消息隊列 MQTT 版控制臺創建,本示例中其含義為直播間的ID。
同一個直播間的所有成員都訂閱room/message/123456 Topic。具體消息流向如下圖所示。
流程說明如下:
學生A通過客戶端發送一條消息至微消息隊列MQTT版。消息示例如下:
topic: "roomSend/message",body: "{ 'peer': 'xxx', 'roomId': '123456', 'msg': 'xxx' }"
說明HTML網頁客戶端發送的消息格式為JSON。
云消息隊列 MQTT 版根據創建的數據流出規則將消息轉發至云消息隊列 RocketMQ 版。
訂閱了云消息隊列 RocketMQ 版Topic的后端應用消費該消息以實現業務處理,例如內容審核。
后端應用將處理后的消息再次發送至云消息隊列 RocketMQ 版的Topic。
云消息隊列 RocketMQ 版根據創建的數據流入規則將該消息轉發至云消息隊列 MQTT 版。
云消息隊列 MQTT 版將該消息推送至所有網頁客戶端,涉及成員老師、學生A以及學生B。
場景二:學生禁言
此場景是使用云消息隊列 MQTT 版P2P消息收發功能的典型場景,老師禁止某位同學在直播間發言的指令消息會被發送至需要禁言的學生客戶端上實現禁言效果。同時,服務端也會添加禁言名單用于業務校驗和消息過濾。老師的客戶端需將消息發送至roomSend/command Topic,其中:
roomSend為直播間所有客戶端發送消息使用的父級Topic,需要在云消息隊列 MQTT 版控制臺創建。
command為自定義二級Topic,無需在云消息隊列 MQTT 版控制臺創建,command與message二級Topic作區分,表示指令類的消息。
P2P消息無需訂閱,此場景下示例值為room/p2p/GID_student@@@002。
具體消息流向如下圖所示。
流程說明如下:
老師通過客戶端發送一條禁言指令消息至云消息隊列 MQTT 版。
云消息隊列 MQTT 版根據創建的數據流出規則將消息轉發至云消息隊列 RocketMQ 版。
訂閱了云消息隊列 RocketMQ 版Topic的后端應用接收到該條指令消息后,進行必要檢驗處理并保存禁言名單用于后續過濾被禁言學生的消息。同時發送一條P2P消息(room/p2p/GID_student@@@002)給學生B的客戶端,使學生B的客戶端顯示禁言效果。
場景三:成員上下線通知
通過云消息隊列 MQTT 版的客戶端狀態異步通知功能,已在直播間的所有成員都可以收到其他成員上下線的通知消息。此場景下,所有的客戶端都需訂閱room/status Topic,其中:
room為父級Topic,需要在云消息隊列 MQTT 版控制臺創建。
status為自定義二級Topic,無需在云消息隊列 MQTT 版控制臺創建,本示例中表示與客戶端狀態相關的消息。
每個MQTT客戶端都訂閱該Topic后,當某個客戶端上下線時,MQTT服務都會觸發一條事件消息到云消息隊列 RocketMQ 版。具體消息流向如下圖所示。
流程說明如下:
云消息隊列 MQTT 版根據創建的上下線通知規則,將學生A進入直播間的上線事件消息發送至云消息隊列 RocketMQ 版。
訂閱了云消息隊列 RocketMQ 版Topic的后端應用消費該消息以實現業務處理,例如考勤記錄。
后端應用將處理后的消息再次發送至云消息隊列 RocketMQ 版的Topic。
云消息隊列 RocketMQ 版根據創建的數據流入規則將該消息轉發至云消息隊列 MQTT 版。
云消息隊列 MQTT 版將該消息廣播至所有客戶端,涉及成員老師、學生A以及學生B。
場景四:系統通知消息
此場景使用云消息隊列 MQTT 版的消息收發功能,系統的更新通知都會發送到直播間的所有成員。此場景下,所有的客戶端都需訂閱room/system Topic,其中:
room為父級Topic,需要在云消息隊列 MQTT 版控制臺創建。
system為自定義二級Topic,無需在云消息隊列 MQTT 版控制臺創建,本示例中表示系統發送的消息。
具體消息流向如下圖所示。
流程說明如下:
后端應用更新消息發送至云消息隊列 RocketMQ 版的Topic。
云消息隊列 RocketMQ 版根據創建的數據流入規則將該消息轉發至云消息隊列 MQTT 版。
云消息隊列 MQTT 版將該消息推送至所有客戶端,涉及成員老師、學生A和學生B。
操作流程
在線直播教育所涉及的四個場景的流程如下所示,各個場景所使用的云消息隊列 MQTT 版功能各不相同,因此使用的SDK客戶端代碼有所差異,請以每個場景的具體描述為準。
操作步驟
在云消息隊列 MQTT 版控制臺上,創建以下資源。
資源
示例值
參考文檔
實例
post-cn-0pp12gl****
父級Topic(一級Topic)
room:直播間客戶端訂閱的父級Topic。
roomSend:直播間客戶端發送消息的父級Topic。
子級Topic
各場景下的子級Topic示例如下:
直播互動消息場景:/message/123456
學生禁言場景:/command以及 /p2p/GID_student@@@002(典型的P2P消息場景)
成員上下線通知:/status
系統通知消息:/system
說明子級Topic無需創建。詳情請參見名詞解釋。
N/A
Group ID
老師:GID_teacher
學生:GID_student
規則
數據流入規則
數據流出規則
客戶端上下線通知規則
其中,老師和學生的客戶端與Group ID的對應關系如下所示。
角色
Group ID
Device ID
Client ID
老師
GID_teacher
001
GID_teacher@@@001
學生A
GID_student
001
GID_student@@@001
學生B
GID_student
002
GID_student@@@002
說明Device ID無需創建,詳細信息,請參見名詞解釋。
執行云消息隊列 MQTT 版為您提供的客戶端和后端應用示例代碼,完成各個不同場景下的消息收發。
名詞解釋
MQTT
一個基于訂閱/發布的長連接雙向通信模型,訂閱方便靈活,非常適合直播消息互動場景。云消息隊列 MQTT 版基于標準的MQTT協議,廣泛服務于終端應用場景。
MQTT服務器
云消息隊列 MQTT 版提供的MQTT協議交互的服務端節點,用于完成與MQTT客戶端和云消息隊列 RocketMQ 版各自的消息收發。
MQTT客戶端
用于和MQTT服務器交互的移動端節點,全稱為云消息隊列 MQTT 版客戶端。
父級Topic(Parent Topic)
MQTT協議基于Pub/Sub模型,因此任何消息都屬于一個Topic。根據MQTT協議,Topic存在多級,定義第一級Topic為父級Topic,使用云消息隊列 MQTT 版前,需先在控制臺創建該父級Topic,可以在云消息隊列 MQTT 版控制臺創建,或者直接在云消息隊列 RocketMQ 版的控制臺創建。
子級Topic(Subtopic)
MQTT的二級Topic,甚至三級Topic都是父級Topic下的子類。使用時無需在控制臺創建,直接在代碼中設置即可。命名格式為:父級Topic和各子級Topic間均使用正斜線(/)隔開,<父級Topic名稱>/<二級Topic名稱>/<三級Topic名稱>,例如,SendMessage/demo/producer。需要注意的是云消息隊列 MQTT 版限制父級Topic和子級Topic的總長度為64個字符,如果超出長度限制將會導致客戶端異常。您可以使用MQTT.fx客戶端驗證子級Topic發布和訂閱消息。
Client ID
云消息隊列 MQTT 版的Client ID是每個客戶端的唯一標識,要求全局唯一,使用相同的Client ID連接云消息隊列 MQTT 版服務會被拒絕。
Client ID由兩部分組成,組織形式為<GroupID>@@@<DeviceID>。Client ID的長度限制為64個字符,不允許使用不可見字符,具體限制請參見使用限制。
Group ID
用于指定一組邏輯功能完全一致的節點共用的組名,代表一類相同功能的設備。Group ID需要在云消息隊列 MQTT 版的控制臺創建。如何創建Group ID的具體步驟請參見MQTT快速入門。
Device ID
每個設備獨一無二的標識,由業務方自己指定。需要保證全局唯一,例如每個傳感器設備的序列號。
P2P消息
云消息隊列 MQTT 版在標準的MQTT協議基礎上提供的一種特殊消息,該類型消息無需普通的訂閱關系匹配,便可直接發送給指定的單個目標MQTT客戶端。更多信息,請參見P2P消息收發模式(MQTT)。
RTC服務器
阿里云音視頻通信RTC提供的音視頻相關媒體通道服務。
音視頻通信RTC
阿里云覆蓋全球的實時音視頻開發平臺,依托核心音視頻編解碼、信道傳輸、網絡調度技術,提供高可用、高品質、超低延時的音視頻通信服務,讓用戶快速搭建多端實時應用,適用于在線教育、視頻會議、互動娛樂、音視頻社交等場景。
直播場景需要傳輸流媒體服務,詳細信息,請參見什么是音視頻通信。