基于时间轮盘和播放器心跳的活跃用户集维护系统及方法
技术领域
本发明涉及视频直播中活跃用户集的维护技术领域,具体来讲是一种基于时间轮盘和播放器心跳的活跃用户集维护系统及方法。
背景技术
随着互联网技术的迅速发展,越来越多的用户可以使用电脑、手机等终端通过网络观看在线视频直播。在线视频直播是指利用互联网网络资源进行的现场视频直播服务,通过现场的视频拍摄同步发布到网络上,用户可以同一时间在网络上看到实时的现场情况。
在视频直播网站的业务场景中,很多直播间主播在发起互动活动或者网站在发起专题活动时,需要只针对观看当前直播间的活跃用户或者在网站上活跃的用户进行互动,这时就需要通过一个活跃用户集来对活跃用户进行实时记录和更新。
目前,在视频直播领域中,维护活跃用户集的通常思路为:当服务器连续一段时间内(通常需要自定义该时间,该时间即为超时时长Timeout)没有收到用户行为数据,就把该用户剔除出活跃用户集。具体来说,通常分为以下两种方式:
(1)针对每个用户,保存相应的“最后收到行为数据的时间lastReceiveTime”;然后通过一个定时器,每秒钟遍历一遍所有用户的用户会话,剔除那些满足以下公式的用户会话:
当前时间now-最后收到行为数据的时间lastReceiveTime>超时时长Timeout。
但是,由于这种做法全局只设有一个重复定时器repeated timer,因此每次超时都要检查全部用户会话信息,如果用户会话数目比较大(如同时保持上万个用户),则这种方式的检查量就会很大,且整个检查过程耗时严重,降低了实时性。
(2)基本与第一种方式相同,不同的是为每个用户会话设置一个一次性定时器one-shot timer,在定时器超时的时候就断开本会话,且在每次收到用户行为数据的时候更新该定时器。
此方法虽然一定程度上提高了检查的效率,但是需要设置很多一次性定时器,并需要频繁地更新定时器。如果连接数目较大,则会对“待更新计时器队列”造成压力,严重时还会造成系统拥塞甚至崩溃。
发明内容
本发明的目的是为了克服上述背景技术的不足,提供一种基于时间轮盘和播放器心跳的活跃用户集维护系统及方法,能基于正常用户观看视频时的播放器心跳数据产生活跃用户集,同时利用时间轮盘来对活跃用户集保持更新,不但及时高效,且不会对系统造成较大负荷。
为达到以上目的,本发明提供一种基于时间轮盘和播放器心跳的活跃用户集维护系统,包括若干用户终端和一个直播平台服务器,每个用户终端内设置有播放器心跳记录模块,直播平台服务器内设置有缓存预处理模块、分布式实时计算模块和活跃用户集功能模块;
所述播放器心跳记录模块用于:实时记录用户观看直播时播放器的心跳信息;并将记录的心跳信息上报给直播平台服务器;
所述缓存预处理模块用于:对各用户终端上报的心跳信息进行缓存和预处理;定时将缓存和预处理后的所有心跳信息以若干数据片的形式发送至分布式实时计算模块;
所述分布式实时计算模块包括若干个实时计算子模块,分布式实时计算模块用于将收到的每个数据片按照哈希策略分配给一个指定的实时计算子模块;每个实时计算子模块对数据片中的心跳信息进行解析并验证,将验证通过的心跳信息所对应的用户添加到当前时间对应的活跃用户集分片中,所述活跃用户集分片是将活跃用户集按照指定的活跃计算时间段划分成的若干分片;
所述活跃用户集功能模块用于:以指定的活跃计算时间段为周期,将当前时间对应的活跃用户集分片更新到已创建的时间轮盘中,所述时间轮盘为一种数据结构,其主体是一个首尾相连的循环列表,该循环列表中包含有若干个称之为槽的模块,每个槽中填充有一个活跃用户集分片,且该循环列表还具有一个指向队尾的指针。
在上述技术方案的基础上,所述播放器的心跳信息包括用户ID和按照特定规则生成的识别码,所述识别码的生成规则为:时间戳+用户终端设备API获取的终端设备ID+随机数。
在上述技术方案的基础上,识别码为固定长度,且经加密处理。
在上述技术方案的基础上,所述活跃用户集功能模块以指定的活跃计算时间段为周期,将当前时间对应的活跃用户集分片更新到已创建的时间轮盘中时,具体操作过程为:每经过指定的活跃计算时间段后,时间轮盘中每个槽内的活跃用户集分片向队首前移一格;将当前时间对应的活跃用户集分片更新到位于队尾的槽内;将时间轮盘上的指针向队首前移一格。
本发明还提供一种基于时间轮盘和播放器心跳的活跃用户集维护系统,包括以下步骤:A、每个用户终端的播放器心跳记录模块实时记录用户观看直播时播放器的心跳信息;将记录的心跳信息上报给直播平台服务器;B、直播平台服务器的缓存预处理模块对各个用户终端上报的心跳信息进行缓存和预处理;C、缓存预处理模块定时将缓存和预处理后的所有心跳信息以若干数据片的形式发送至分布式实时计算模块;分布式实时计算模块将每个数据片按照哈希策略分配给一个指定的实时计算子模块;D、每个实时计算子模块对数据片中的心跳信息进行解析并验证,将验证通过的心跳信息所对应的用户添加到当前时间对应的活跃用户集分片中;E、活跃用户集功能模块以活跃计算时间段为周期,定期将当前时间对应的活跃用户集分片更新到已创建的时间轮盘中。
在上述技术方案的基础上,步骤A中所述播放器的心跳信息包括用户ID和按照特定规则生成的识别码,该识别码的生成规则为:时间戳+用户终端设备API获取的终端设备ID+随机数;步骤B中,所述缓存预处理模块进行缓存时,会丢弃不符合要求的心跳信息;所述不符合要求的心跳信息包括:用户ID为空或者用户ID不符合数据字段类型的心跳信息、时间戳格式错误的心跳信息、以及用户终端类型标识非法的心跳信息。
在上述技术方案的基础上,步骤C中,缓存预处理模块定时将缓存和预处理后的所有心跳信息以若干数据片的形式发送至分布式实时计算模块,具体包括以下操作:缓存预处理模块每隔1秒钟将当前缓存和预处理后的所有心跳信息发送至分布式实时计算模块,每次发送时将心跳信息组合成若干小于等于1M的数据片进行发送。
在上述技术方案的基础上,步骤C中,分布式实时计算模块将每个数据片按照哈希策略分配给一个指定的实时计算子模块,具体包括以下操作:分布式实时计算模块为每个数据片分配一个唯一的ID号,将该ID号按照实时计算子模块的个数取模,获得的余数则对应指定的实时计算子模块的ID号;将数据片分配给对应ID号的实时计算子模块。
在上述技术方案的基础上,步骤A中所述播放器的心跳信息包括用户ID和按照特定规则生成的识别码,该识别码的生成规则为:时间戳+用户终端设备API获取的终端设备ID+随机数;步骤D具体包括以下操作:每个实时计算子模块对数据片中每个心跳信息包含的识别码进行解密,然后解析识别码,取出时间戳和终端设备ID;分别校验时间戳是否在合理范围内、终端设备ID是否符合规范;若上述校验均通过,则将验证通过的心跳信息的用户ID添加到当前时间对应的一个活跃用户集分片中,否则,直接丢弃该识别码对应的心跳信息,结束。
在上述技术方案的基础上,步骤E具体包括以下操作:每经过指定的活跃计算时间段后,时间轮盘中每个槽内的活跃用户集分片向队首前移一格;将当前时间对应的活跃用户集分片更新到位于队尾的槽内;将时间轮盘上的指针向队首前移一格。
本发明的有益效果在于:
1、本发明基于正常用户观看视频时的播放器心跳数据产生相应的活跃用户集分片,该活跃用户集分片是将活跃用户集按照指定的活跃计算时间段划分成的若干分片,只有播放器心跳数据正常有效的用户才作为活跃用户添加到到与当前时间对应的活跃用户集分片中。在此基础上,同时利用时间轮盘来对活跃用户集保持更新,以指定的活跃计算时间段为周期,定期将当前时间对应的活跃用户集分片更新到已创建的时间轮盘中,从而完成对活跃用户集的及时维护。
与现有技术相比,本发明并不是采用重复定时器或一次性定时器,而是基于播放器心跳和时间轮盘来对活跃用户集进行更新维护,不但及时高效,而且不会对系统造成较大负荷,能在某些互动活动中,有效限制非活跃用户的参与,保证互动活动的有效进行。
2、本发明中,活跃用户集分片是按照指定的活跃计算时间段进行划分的,并且活跃用户集功能模块也是以指定的活跃计算时间段为维护周期。该活跃计算时间段可根据实际使用需要自行设置和调整,活跃用户集分片的个数也就可以相应调整,这就使得活跃用户的统计颗粒度可根据需要进行设置和调整(即可按小时活跃度、分钟活跃度或其他活跃度来统计计算),且相应的时间轮盘周期也可对应调整(即可按1小时维护、1分钟维护或其他周期来维护),灵活性强,适用性高。
3、本发明中,直播平台服务器设置有缓存预处理模块,该缓存预处理模块不仅能对各用户终端上报的心跳信息进行缓存和预处理,还能定时将缓存和预处理后的所有心跳信息以若干数据片的形式发送至分布式实时计算模块;并且,该分布式实时计算模块由若干个实时计算子模块组成,每个数据片被分配到指定的一个实时计算子模块进行处理,多个实时计算子模块就能同时处理多个数据片,处理效率极高,实时性更强。
4、本发明中,对数据片是按照哈希策略来选择所要上报的实时计算子模块的,目的是为了提高分布式实时计算模块的水平扩展能力,使得分布式实时计算模块可以根据要处理的数据量的规模来相应增减实时计算子模块的个数。
附图说明
图1为本发明实施例中基于时间轮盘和播放器心跳的活跃用户集维护系统的结构框图;
图2为时间轮盘的结构示意图;
图3为本发明实施例中基于时间轮盘和播放器心跳的活跃用户集维护方法的流程图。
具体实施方式
下面结合附图及具体实施例对本发明作进一步的详细描述。
参见图1所示,本发明实施例提供一种基于时间轮盘和播放器心跳的活跃用户集维护系统,包括若干用户终端和一个直播平台服务器,每个用户终端内设置有播放器心跳记录模块,直播平台服务器内设有缓存预处理模块、分布式实时计算模块和活跃用户集功能模块。
其中,播放器心跳记录模块用于:实时记录用户观看直播时播放器的心跳信息;将记录的心跳信息上报给直播平台服务器。
可以理解的是,播放器的心跳信息包括:用户ID(即用户唯一性的ID)和按照特定规则生成的识别码,该识别码的生成规则为:时间戳+用户终端设备API获取的终端设备ID(终端设备ID是用户终端设备的唯一ID)+随机数;该识别码为固定长度,且生成后经加密处理。
缓存预处理模块用于:对各用户终端上报的心跳信息进行缓存和预处理;定时将缓存和预处理后的所有心跳信息以若干数据片的形式发送至分布式实时计算模块。
分布式实时计算模块包括若干个实时计算子模块,分布式实时计算模块用于将收到的每个数据片按照哈希策略分配给一个指定的实时计算子模块;每个实时计算子模块对数据片中的心跳信息进行解析并验证,将验证通过的心跳信息的用户ID添加到当前时间对应的活跃用户集分片中,该活跃用户集分片是指:预先将活跃用户集按照指定的活跃计算时间段划分成的若干分片。例如:若指定的活跃计算时间段为1小时,则活跃用户集对应一天24小时,就有24个相应的活跃用户集分片;若指定的活跃计算时间段为1分钟,则活跃用户集对应一天24*60=1440分钟,就有1440个相应的活跃用户集分片。
活跃用户集功能模块用于:以指定的活跃计算时间段为周期(如以1小时或1分钟等为周期),将当前时间对应的活跃用户集分片更新到已创建的时间轮盘中;如图2所示,已创建的时间轮盘为一种数据结构,其主体是一个首尾相连的循环列表(circular buffer),该循环列表中包含有若干个称之为槽(slot)的模块,每个槽中填充有一个活跃用户集分片,且该循环列表还具有一个指向队尾的指针(tail)。
参见图3所示,本发明实施例还提供一种应用上述系统的基于时间轮盘和播放器心跳的活跃用户集维护方法,包括以下步骤:
步骤S1:每个用户终端的播放器心跳记录模块实时记录用户观看直播时播放器的心跳信息;将记录的心跳信息组装成JSON格式,并对JSON字符串进行BASE64编码;将编码后的心跳信息上报给直播平台服务器,转入步骤S2。
步骤S2:直播平台服务器的缓存预处理模块对各个用户终端上报的心跳信息进行缓存并预处理(统一数据格式),转入步骤S3。
具体来说,缓存预处理模块进行缓存的具体过程为:对各个用户终端上报的心跳信息的JSON字符串进行BASE64解码,丢弃不符合要求的心跳信息。其中,不符合要求的心跳信息包括:用户ID为空或者用户ID不符合数据字段类型的心跳信息、时间戳格式错误的心跳信息、以及用户终端类型标识非法的心跳信息等。
并且,心跳信息经预处理之后的数据格式如下:
步骤S3:缓存预处理模块定时将缓存和预处理后的所有心跳信息以若干数据片的形式发送至分布式实时计算模块;分布式实时计算模块将收到的每个数据片按照哈希策略分配给一个指定的实时计算子模块,转入步骤S4。
实际操作时,步骤S3中缓存预处理模块定时将缓存和预处理后的所有心跳信息以若干数据片的形式发送至分布式实时计算模块,具体包括以下操作:缓存预处理模块每隔1秒钟将当前缓存和预处理后的所有心跳信息发送至分布式实时计算模块,每次发送时将心跳信息组合成若干小于等于1M的数据片进行发送,即每个数据片由至少一个完整的心跳信息组成,且组成的数据片大小小于等于1M。例如:当前缓存的心跳信息一共有三个,其大小分别为0.3M、0.4M和0.5M,则此次发送时,可将0.3M、0.4M的两个心跳信息组成一个数据片,再将0.5M的心跳信息组成另一个数据片;最后将这两个数据片一起发送至分布式实时计算模块。
进一步地,步骤S3中分布式实时计算模块将收到的每个数据片按照哈希策略分配给一个指定的实时计算子模块,具体包括以下操作:分布式实时计算模块为每个数据片分配一个唯一的ID号,将该ID号按照实时计算子模块的个数取模,获得的余数则对应指定的实时计算子模块的ID号;将数据片分配给对应ID号的实时计算子模块。本发明中,对数据片按哈希策略来选择所要上报的实时计算子模块,目的是为了提高分布式实时计算模块的水平扩展能力,使得分布式实时计算模块可以根据要处理的数据量的规模来相应增减实时计算子模块的个数。
步骤S4:每个实时计算子模块对数据片中每个心跳信息包含的识别码进行解密,然后解析识别码,取出时间戳和终端设备ID;分别校验时间戳是否在合理范围内(即时间戳与当前服务器的时间差是否在一分钟内)、终端设备ID是否符合规范(即再校验终端设备ID是否满足识别码的生成规则);若上述校验均通过,说明该识别码对应的心跳信息有效,则将验证通过的心跳信息的用户ID添加到当前时间对应的一个活跃用户集分片中,转入步骤S5;否则,直接丢弃该识别码对应的心跳信息,结束。
步骤S5:活跃用户集功能模块以指定的活跃计算时间段为周期,定期将当前时间对应的活跃用户集分片更新到已创建的时间轮盘中,结束。
具体来说,以指定的活跃计算时间段为周期,定期将当前时间对应的活跃用户集分片更新到已创建的时间轮盘中,具体操作如下:
步骤S501:每经过指定的活跃计算时间段后,时间轮盘中每个槽内的活跃用户集分片向队首前移一格(本发明中,定义沿顺时针方向向队首移动为前移),此时,位于队首的槽内的活跃用户集分片被移出并销毁,位于队尾的槽为空,转入步骤S502;
步骤S502:将当前时间对应的活跃用户集分片更新到位于队尾的槽内,转入步骤S503;
步骤S503:将时间轮盘上的指针向队首前移一格。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。