Skip to content

房间管理

qinwei edited this page Dec 14, 2022 · 7 revisions

房间管理是SONA平台最基础的功能,主要包含以下几个:

  • 创建房间
  • 关闭房间
  • 进入房间
  • 离开房间
  • 设置管理员
  • 踢人
  • 拉黑/取消拉黑
  • 禁言/取消禁言
  • 在线列表

聊天室与群组

SONA的房间分为 聊天室与群组,虽然都是房间,但是模式不一样,二者之间有比较明显的区别

聊天室

  • 一个用户同一时间只能加入一个房间
  • 房间没有人数限制
  • 不支持离线消息
  • 消息会有频控,不保证所有消息必达
  • 长连接断开即认定为离开房间,也会从在线列表中移除

群组

  • 一个用户可以同时加入多个群组
  • 群组一般都有人数限制
  • 支持离线消息
  • 消息没有频控,一般会基于推拉结合的方式保证消息不丢
  • 只有主动退出群组,才会从群组人员列表中移除

所有房间管理的操作都通过调用sona-service中的dubbo接口来实现,内部会自动根据申请的ProductCode 区分聊天室与群组

cn.bixin.sona.api.room.SonaRoomRemoteService

ProductCode

SONA平台是基于 产品码(ProductCode)来扩展的,不同的业务场景需要单独申请一个ProductCode,后续对房间的操作都基于 ProductCode 来关联。

使用步骤:

1、需要先在 t_product_config 表中新增一条记录

例如:现在有一个 直播业务,使用的聊天室模式,新增 product_code 为 LIVING,指定im_module 为 CHATROOM, 并添加相应的 房间相关配置 如果是 游戏房业务,使用的群组模式,新增 product_code 为 GAMING,指定im_module 为 GROUP, 并添加相应的 房间相关配置

CREATE TABLE `t_product_config` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `product_code` varchar(32) NOT NULL DEFAULT '' COMMENT '产品码',
  `short_code` varchar(16) NOT NULL COMMENT '产品短码',
  `im_module` varchar(16) NOT NULL DEFAULT '' COMMENT 'im模块 CHATROOM=聊天室 GROUP=群组',
  `stream_supplier` varchar(16) NOT NULL DEFAULT '' COMMENT '流供应商',
  `type` varchar(16) NOT NULL DEFAULT '' COMMENT '流类型 AUDIO=音频流 VIDEO=视频流',
  `push_mode` varchar(16) NOT NULL DEFAULT '' COMMENT '推流模式',
  `pull_mode` varchar(16) NOT NULL DEFAULT '' COMMENT '拉流模式',
  `enter_notify_switch` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否下发进房消息',
  `check_admin` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否校验管理员 0=否 1=是',
  `need_replay` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否需要回放功能 0=否 1=是',
  `client_type` tinyint(4) NOT NULL DEFAULT '2' COMMENT '客户端类型 1=weblink 2=commonlink 3=wechatlink',
  `bitrate` int(11) NOT NULL DEFAULT '96000' COMMENT '播放器码率',
  `im_send_type` tinyint(4) DEFAULT '1' COMMENT '短连 1 长连2',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `product_code` (`product_code`),
  UNIQUE KEY `short_code` (`short_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品配置表';

2、调用 创建房间 接口,请求参数里指定 申请的 ProductCode,接口会返回创建的 roomId,

业务方调用创建房间接口后,可以在自己的数据库中保存sona的 roomId,并和自己的业务房间号做映射,后续对房间的操作直接基于roomId,不需要再带上ProductCode了

房间配置

SONA 中有2张房间配置表,配置字段完全一样 :

  • t_product_config 基于ProductCode维度的配置

  • t_room_config 基于房间维度的配置

如果当前 roomId 单独配置了 t_room_config,则以t_room_config中的配置为准

CREATE TABLE `t_room_config` (
  `room_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '房间ID',
  `product_code` varchar(32) NOT NULL DEFAULT '' COMMENT '产品码',
  `im_module` varchar(16) NOT NULL DEFAULT '' COMMENT 'im模块 CHATROOM=聊天室 GROUP=群组',
  `stream_supplier` varchar(16) NOT NULL DEFAULT '' COMMENT '流供应商',
  `type` varchar(16) NOT NULL DEFAULT '' COMMENT '流类型 AUDIO=音频 VIDEO=视频',
  `push_mode` varchar(16) NOT NULL DEFAULT '' COMMENT '推流模式',
  `pull_mode` varchar(16) NOT NULL DEFAULT '' COMMENT '拉流模式',
  `enter_notify_switch` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否下发进房消息',
  `check_admin` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否校验管理员 0=否 1=是',
  `need_replay` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否需要回放功能 0=否 1=是',
  `client_type` tinyint(4) NOT NULL DEFAULT '2' COMMENT '客户端类型 1=weblink 2=commonlink 3=wechatlink',
  `bitrate` int(11) NOT NULL DEFAULT '96000' COMMENT '播放器码率',
  `im_send_type` tinyint(4) DEFAULT '1' COMMENT '1=短连 2=长连',
  `short_code` varchar(16) NOT NULL DEFAULT '' COMMENT '产品短码',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`room_id`),
  KEY `idx_product_code` (`product_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='房间配置表';

进入房间

sona/enter 接口主要是为了拿到当前房间的配置,包括IM和实时音视频的相关配置

如果当前房间是群组模式,会把当前用户加入到群组中

enter成功后,sona-sdk 就会和 长连接网关建立一条房间连接,后续可以通过长连接收发消息

在线列表

  1. 对于群组模式的房间,获取列表就是 当前群组的所有用户列表,不管用户是否长连在线
  2. 对于聊天室模式的房间,获取在线列表,是拿到当前房间内所有长链在线的用户列表

对于sona来说,用户是否在线,完全依赖长连接,长连在就认为在线,长链不在就认为离线

由于移动网络的不稳定,长连可能会频繁的断链重连,为了规避这种情况,在线列表处理时会延时检测,在长连异常断开后不会立刻就从在线列表中移除,而是延迟一定时间后再次判断长连是否重连成功,如果成功则不做任何操作,失败则从在线列表中移除

如果是正常的业务leave 则立即从在线列表中移除

online

其他操作

其他房间操作比较简单,可以参考 sona 的接口文档描述

接口文档

Clone this wiki locally