-
Notifications
You must be signed in to change notification settings - Fork 42
房间管理
房间管理是SONA平台最基础的功能,主要包含以下几个:
- 创建房间
- 关闭房间
- 进入房间
- 离开房间
- 设置管理员
- 踢人
- 拉黑/取消拉黑
- 禁言/取消禁言
- 在线列表
SONA的房间分为 聊天室与群组,虽然都是房间,但是模式不一样,二者之间有比较明显的区别
- 一个用户同一时间只能加入一个房间
- 房间没有人数限制
- 不支持离线消息
- 消息会有频控,不保证所有消息必达
- 长连接断开即认定为离开房间,也会从在线列表中移除
- 一个用户可以同时加入多个群组
- 群组一般都有人数限制
- 支持离线消息
- 消息没有频控,一般会基于推拉结合的方式保证消息不丢
- 只有主动退出群组,才会从群组人员列表中移除
所有房间管理的操作都通过调用sona-service中的dubbo接口来实现,内部会自动根据申请的ProductCode 区分聊天室与群组
cn.bixin.sona.api.room.SonaRoomRemoteService
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 就会和 长连接网关建立一条房间连接,后续可以通过长连接收发消息
- 对于群组模式的房间,获取列表就是 当前群组的所有用户列表,不管用户是否长连在线
- 对于聊天室模式的房间,获取在线列表,是拿到当前房间内所有长链在线的用户列表
对于sona来说,用户是否在线,完全依赖长连接,长连在就认为在线,长链不在就认为离线
由于移动网络的不稳定,长连可能会频繁的断链重连,为了规避这种情况,在线列表处理时会延时检测,在长连异常断开后不会立刻就从在线列表中移除,而是延迟一定时间后再次判断长连是否重连成功,如果成功则不做任何操作,失败则从在线列表中移除
如果是正常的业务leave 则立即从在线列表中移除

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