直播互动解决方案
在线直播教育的场景通常会涉及多个直播间,且每个直播间中也会有多名成员。本文以单直播间、一名老师、两名学生的场景为例,说明如何使用云消息队列 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 版为您提供的客户端和后端应用示例代码,完成各个不同场景下的消息收发。