在线直播教育的场景通常会涉及多个直播间,且每个直播间中也会有多名成员。本文以单直播间、一名老师、两名学生的场景为例,说明如何使用云消息队列 MQTT 版实现直播互动消息、禁言、成员上下线通知以及系统消息通知,其中,老师和学生的客户端以HTML网页为例,后端应用以Java为例。

背景信息

使用云消息队列 MQTT 版需与后端存储队列绑定,目前仅支持云消息队列 RocketMQ 版,详细信息,请参见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。具体消息流向如下图所示。

场景1

流程说明如下:

  1. 学生A通过客户端发送一条消息至微消息队列MQTT版。消息示例如下:
    topic: "roomSend/message",body: "{ 'peer': 'xxx', 'roomId': '123456', 'msg': 'xxx' }"
    说明 HTML网页客户端发送的消息格式为JSON。
  2. 云消息队列 MQTT 版根据创建的数据流出规则将消息转发至云消息队列 RocketMQ 版
  3. 订阅了云消息队列 RocketMQ 版Topic的后端应用消费该消息以实现业务处理,例如内容审核。
  4. 后端应用将处理后的消息再次发送至云消息队列 RocketMQ 版的Topic。
  5. 云消息队列 RocketMQ 版根据创建的数据流入规则将该消息转发至云消息队列 MQTT 版
  6. 云消息队列 MQTT 版将该消息推送至所有网页客户端,涉及成员老师、学生A以及学生B。

场景二:学生禁言

此场景是使用云消息队列 MQTT 版P2P消息收发功能的典型场景,老师禁止某位同学在直播间发言的指令消息会被发送至需要禁言的学生客户端上实现禁言效果。同时,服务端也会添加禁言名单用于业务校验和消息过滤。老师的客户端需将消息发送至roomSend/command Topic,其中:

  • roomSend为直播间所有客户端发送消息使用的父级Topic,需要在云消息队列 MQTT 版控制台创建。
  • command为自定义二级Topic,无需在云消息队列 MQTT 版控制台创建,command与message二级Topic作区分,表示指令类的消息。
说明 P2P消息无需订阅,此场景下示例值为room/p2p/GID_student@@@002。

具体消息流向如下图所示。

场景2

流程说明如下:

  1. 老师通过客户端发送一条禁言指令消息至云消息队列 MQTT 版
  2. 云消息队列 MQTT 版根据创建的数据流出规则将消息转发至云消息队列 RocketMQ 版
  3. 订阅了云消息队列 RocketMQ 版Topic的后端应用接收到该条指令消息后,进行必要检验处理并保存禁言名单用于后续过滤被禁言学生的消息。同时发送一条P2P消息(room/p2p/GID_student@@@002)给学生B的客户端,使学生B的客户端显示禁言效果。

场景三:成员上下线通知

通过云消息队列 MQTT 版的客户端状态异步通知功能,已在直播间的所有成员都可以收到其他成员上下线的通知消息。此场景下,所有的客户端都需订阅room/status Topic,其中:

  • room为父级Topic,需要在云消息队列 MQTT 版控制台创建。
  • status为自定义二级Topic,无需在云消息队列 MQTT 版控制台创建,本示例中表示与客户端状态相关的消息。

每个MQTT客户端都订阅该Topic后,当某个客户端上下线时,MQTT服务都会触发一条事件消息到云消息队列 RocketMQ 版。具体消息流向如下图所示。

场景3

流程说明如下:

  1. 云消息队列 MQTT 版根据创建的上下线通知规则,将学生A进入直播间的上线事件消息发送至云消息队列 RocketMQ 版
  2. 订阅了云消息队列 RocketMQ 版Topic的后端应用消费该消息以实现业务处理,例如考勤记录。
  3. 后端应用将处理后的消息再次发送至云消息队列 RocketMQ 版的Topic。
  4. 云消息队列 RocketMQ 版根据创建的数据流入规则将该消息转发至云消息队列 MQTT 版
  5. 云消息队列 MQTT 版将该消息广播至所有客户端,涉及成员老师、学生A以及学生B。

场景四:系统通知消息

此场景使用云消息队列 MQTT 版的消息收发功能,系统的更新通知都会发送到直播间的所有成员。此场景下,所有的客户端都需订阅room/system Topic,其中:

  • room为父级Topic,需要在云消息队列 MQTT 版控制台创建。
  • system为自定义二级Topic,无需在云消息队列 MQTT 版控制台创建,本示例中表示系统发送的消息。

具体消息流向如下图所示。

场景4

流程说明如下:

  1. 后端应用更新消息发送至云消息队列 RocketMQ 版的Topic。
  2. 云消息队列 RocketMQ 版根据创建的数据流入规则将该消息转发至云消息队列 MQTT 版
  3. 云消息队列 MQTT 版将该消息推送至所有客户端,涉及成员老师、学生A和学生B。

操作流程

在线直播教育所涉及的四个场景的流程如下所示,各个场景所使用的云消息队列 MQTT 版功能各不相同,因此使用的SDK客户端代码有所差异,请以每个场景的具体描述为准。

live_house_process

操作步骤

  1. 云消息队列 MQTT 版控制台上,创建以下资源。
    资源示例值参考文档
    实例N/A创建MQTT实例并绑定后端存储资源
    父级Topic(一级Topic)
    • room:直播间客户端订阅的父级Topic。
    • roomSend:直播间客户端发送消息的父级Topic。
    创建MQTT Topic
    子级Topic各场景下的子级Topic示例如下:
    • 直播互动消息场景:/message/123456
    • 学生禁言场景:/command以及 /p2p/GID_student@@@002(典型的P2P消息场景)
    • 成员上下线通知:/status
    • 系统通知消息:/system
    说明 子级Topic无需创建。详情请参见名词解释
    N/A
    Group ID
    • 老师:GID_teacher
    • 学生:GID_student
    创建MQTT Group ID
    其中,老师和学生的客户端与Group ID的对应关系如下所示。
    角色Group IDDevice IDClient ID
    老师GID_teacher001GID_teacher@@@001
    学生AGID_student001GID_student@@@001
    学生BGID_student002GID_student@@@002
    说明 Device ID无需创建,详细信息,请参见名词解释
  2. 执行云消息队列 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个字符,如果超出长度限制将会导致客户端异常。
Client ID

云消息队列 MQTT 版的Client ID是每个客户端的唯一标识,要求全局唯一,使用相同的Client ID连接云消息队列 MQTT 版服务会被拒绝。

Client ID由两部分组成,组织形式为<GroupID>@@@<DeviceID>。Client ID的长度限制为64个字符,不允许使用不可见字符,具体限制请参见使用限制

Group ID
用于指定一组逻辑功能完全一致的节点共用的组名,代表一类相同功能的设备。Group ID需要在云消息队列 MQTT 版的控制台创建。
Device ID
每个设备独一无二的标识,由业务方自己指定。需要保证全局唯一,例如每个传感器设备的序列号。
P2P消息
云消息队列 MQTT 版在标准的MQTT协议基础上提供的一种特殊消息,该类型消息无需普通的订阅关系匹配,便可直接发送给指定的单个目标MQTT客户端。更多信息,请参见P2P消息收发模式(MQTT)
RTC服务器
阿里云音视频通信RTC提供的音视频相关媒体通道服务。
音视频通信RTC
阿里云覆盖全球的实时音视频开发平台,依托核心音视频编解码、信道传输、网络调度技术,提供高可用、高品质、超低延时的音视频通信服务,让用户快速搭建多端实时应用,适用于在线教育、视频会议、互动娱乐、音视频社交等场景。
直播场景需要传输流媒体服务,详细信息,请参见什么是音视频通信