具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例所提供的直播间的频道访问方法和系统,适用于语音直播系统、视频点播直播系统、教育培训直播系统等,其可应用于如图1所示的系统中,请参考图1所示,图1为一个实施例的应用系统结构示意图,终端设备02可以是诸如个人电脑(PC)、智能手机(Smart phone)、平板电脑(Tablet PC)、个人数字助理(PDA)等设备,但并不局限于此。
终端设备02可以通过有线或无线方式等方式接入公共网络,如GPRS、Internet等,与服务端04进行通信。终端设备02上可运行访问直播间频道的客户端,客户端可以访问服务端04,并进入到对应的频道观看所需的直播内容;终端设备02的客户端将服务端04返回的直播内容呈现给客户端。
所述终端设备02可以是指一个设备也可以是指多个设备;服务端04包括实现各种后台功能的服务器设备,可以是一个服务器设备也可以是多个服务器设备构成的服务器群。
参考图2所示,图2为一个实施例的直播间的频道访问方法的流程图,包括如下步骤:
步骤S10,获取第一客户端的进入频道请求,建立所述第一客户端与对应频道的连接。
在此步骤中,对于进入直播间频道的客户端,在接收端其频道请求后,直播间服务器端响应其访问请求,建立所述第一客户端与对应频道之间的通信连接。
步骤S20,判断对应频道当前已在线接入的客户端数量是否达到预定的接入阈值。
在此步骤中,预设直播间频道排队的接入阈值,用于控制观看直播的客户端数量,以此控制观看直播的客户端数量,在新客户端进入频道后,判断当前在线客户端数量是否达到预定的接入阈值,从而确定该客户端是否需要进行排队。
步骤S30,若未达到所述接入阈值,将对应频道的业务信息发送至所述第一客户端。
在此步骤中,在当前频道的客户端数量未达到预定的接入阈值情况下,将对应频道的业务信息发送至所述第一客户端,客户端可以观看频道的直播内容;
步骤S40,若已达到所述接入阈值,将所述第一客户端加入到排队链表中进行缓存。
在此步骤中,在当前频道的客户端数量达到预定的接入阈值情况下,将进入频道的客户端加入到排队链表中进行缓存,从而实现对客户端的有效控制和管理。
对于排队链表,可以以客户端的ID为链表的数据元素,以第一客户端进入频道的时间来排列数据元素的逻辑顺序;排队链表中的客户端是暂时不允许观看而正在等待观看直播间频道的直播内容。
上述实施例的直播间的频道访问方法,通过接收和响应客户端进入频道请求,并建立与对应频道的连接;利用预定的接入阈值判断对应频道当前已在线接入的客户端数量,在未达到接入阈值情况下,控制客户端观看直播内容;如果达到预定的接入阈值,将该客户端加入到排队链表中进行缓存。从技术上限制了直播间的频道同时观看直播的客户端数,避免了同一时间内由于观看直播的客户端数量过多而对频道的直播服务处理造成过大压力,杜绝了直播系统崩溃的情况发生,提高了直播系统的稳定性,同时也可以实现对直播间频道的客户端访问进行有效管理。
对于上述实施例的排队链表的第一客户端的缓存处理,可以选择使用Redis来缓存直播间的频道的链表,实现对数据的高速缓存。
所述Redis是一个key-value存储系统,它支持存储多种value类型,包括string(字符串)、list(链表)、set(集合)、zset(即sorted set,有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,这些操作都是原子性的。而且redis也支持各种不同方式的排序。
对于上述实施例的排队链表,优选的,可以采用skiplist(跳跃表)这种链表,实现高效排队算法。
跳跃表是链表的一种,跳跃表主要有以下几个部分构成:
(1)表头head:负责维护跳跃表的节点指针;
(2)节点node:实际保存元素值,每个节点有一层或多层;
(3)层level:保存着指向该层下一个节点的指针;
(4)表尾tail:全部由null组成;
跳跃表是在链表的基础上增加了跳跃功能,可以轻松地实现Top N的应用。跳跃表是一种随机化数据结构,基于并联的链表,可以在对数期望时间内简单直观地完成查找、删除、插入等操作。采用跳跃表,遍历过程总是从高层开始,然后随着元素值范围的缩小,直至降低到低层。
在一个实施例中,对于本发明的直播间的频道访问方法,还可以包括如下步骤:
获取第二客户端的退出频道请求,断开所述第二客户端与对应频道的连接;
查询所述第二客户端是否在在线接入的客户端中;
若是,则将其从在线已接入的客户端中删除,若否,则从排队链表中删除所述第二客户端;
更新所述排队链表的排序。
在上述实施例中,对于退出频道的客户端,可以首先查找是否在在线接入的客户端中,如果在,将其进行删除,如果不在,则说明第二客户端在排队链表中,从排队链表中找到该客户端并将其删除,然后更新所述排队链表的排序;如果在在线接入的客户端中删除该第二客户端,则可以移入排队客户端作为在线接入的客户端,排队链表中的排序发生了变化,更新排队中数据元素的逻辑顺序;如果是在排队链表中删除该第二客户端,将其对应数据元素删除后,排队链表中的排序发生了变化,更新排队链表中数据元素的逻辑顺序。
在一个实施例中,本发明的直播间的频道访问方法,在将所述第一客户端加入到排队链表中进行缓存的步骤前,还可以包括如下步骤:
根据第一客户端的身份信息判断所述第一客户端是否为免排队客户端,若是,将对应频道的业务信息发送至所述第一客户端,否则将所述第一客户端加入到排队链表中进行缓存。
上述实施例的方案,实现对客户端进入频道后更加有效的管理,通过基于管理目的的技术手段来给客户端设置对应的服务等级,既可以实现服务的增值,同时也可以作为直播间业绩的考核指标。
参考图3,图3为一个实施例的客户端进入频道的处理流程图;主要包括如下步骤:
s301,读取进入频道的客户端;
s302,读取频道的在线客户端的上限值;
s303,判断所述第一客户端是否为免排队客户端,若是,执行s304,否则执行s305;
s304,将所述第一客户端放入在线接入的客户端集合中,并通知其观看直播;
s305,读取频道当前的在线已接入的客户端数量;
s306,判断在线已接入的客户端数量是否超过上限值,若是,执行s307,否则执行s308;
s307,将所述第一客户端放入在线接入的客户端集合中,并通知其观看直播;
s308,读取频道当前的排队链表中的客户端数量;
s309,将所述第一客户端放入排队链表中进行缓存;
s310,根据当前的排队链表中的客户端数量生成所述第一客户端排队的排位信息。
上述实施例的流程,通过给客户端设置对应的服务等级,设置了免排队客户端,免排队客户端可以直接进入观看直播,促使客户端选择更高的服务等级,这样可以实现服务的增值,而进入频道的客户端的服务等级也可以作为其直播间业绩的考核指标。
参考图4所示,图4为一个应用UI示意图,从图中可以看出,贵宾客户端(免排队客户端)用可以通过相应的通道快速进入的频道,而普通客户端则需要进行排队等候。
在一个实施例中,本发明的直播间的频道访问方法,还可以包括如下步骤:
以设定的周期获取频道的排队链表的第一客户端数量和各个第一客户端的排序信息;根据所述第一客户端数量和排序信息生成各个第一客户端相应的排位信息;将所述排位信息发送至对应的第一客户端。
上述实施例的方案,在第一客户端进入到频道后,如果是排队客户端,直播间后台可以实时地通知到排队客户端当前自己排队的信息,如排位信息,即排在该客户端前的客户端数量,从而可以提高客户端应用体验。
在一个实施例中,考虑到直播间的排队客户端数巨大,实时地通知每一个排队客户端,需要耗费较大的计算资源,为此,本发明提供一种改进的通知方案,定期对所有排队客户端通知其排队状态。
作为一种实施方式,对于将所述排位信息发送至对应的第一客户端的步骤,可以包括如下:
建立沿时间轴滑动的滑动窗口,并根据排队第一客户端的进入频道时间建立滑动时间轴;将所述滑动窗口沿所述滑动时间轴进行滑动,并将滑动窗口内的排队第一客户端的排位信息发送至对应的第一客户端。
参考图5所示,图5为利用滑动窗口通知客户端的示意图,滑动窗口沿着滑动时间轴移动,每次只会通知滑动窗口内的客户端,一般情况下,可以设置在10秒钟内通知一次所有的排队客户端。
上述实施例的方案,可以提高服务器资源的利用效率,减少排客户端数巨大时通知客户端处理对直播间运行的影响,减轻服务端负担。
前述实施例中,提供了进入频道后通知客户端当前自己排队的信息的方案,但在实际应用中,通知消息是需要在多个节点中进行转发,如果发生单点故障,则可能会重发了一些通知消息,例如客户端进入频道的通知消息;据此,为了避免由于重发消息而导致将已经进入频道的客户端作为新请求客户端来进行处理,可以进一步设置重复消息检查机制。
作为一种实施方式,所述重复消息检查机制具体可以包括如下步骤:
在建立第一客户端与直播间频道的连接后,在线已接入的客户端中或排队链表中是否存在该进入的第一客户端;若存在,则判定该进入的第一客户端为已存在客户端,并将上一次发送的排位信息发送至对应的第一客户端;若不存在,则判定该进入的客户端为新进入的客户端,将最新生成的排位信息发送至对应的客户端。
上述实施例的方案,通过进一步设置重复消息检查机制,可以有效减少错误消息影响,提高发送通知消息的效率。
如上述实施例所述,在实际应用中,由于整个直播间的消息往往需要在多个节点中进行转发,在这种情况下,往往是难以保证转发消息的完整性,据此,作为本发明的直播间的频道访问方法的实施例,还可以提供数据完整性的检查机制,通过这些检查机制来相互验证数据是否完整。
在一个实施例中,本发明的直播间的频道访问方法,还可以包括针对于丢失客户端退出频道消息的检查方案,该检查方案主要是针对于一些已经退出频道的客户端,由于退出频道消息在转发过程中丢失,从而导致退出频道的客户端仍然缓存在在线已接入的客户端中或排队链表中占用服务资源的情况,由此而提出的检查机制,包括如下步骤:
获取频道当前客户端数量并上传至直播间服务器,直播间服务器接收到所述当前客户端数量后,将所述当前客户端数量与已在线接入的客户端数量和排队链表中第一客户端数量的和值和值进行对比,若当前客户端数量与所述和值不一致,则查找并删除将当前已经不在频道的客户端,并更新所述排队链表。
一般情况下,接入客户端的服务节点都会维护一个客户端列表,通过这个客户端列表可以获取当前频道的数据准确性是较高的客户端数量,据此,当频道的主播开播时,主播定期(如每分钟)上传一个心跳消息到直播间服务器,记录当前频道的客户端数量,直播间服务器收到此客户端数量后所有建立连接的客户端数量(已在线接入的客户端数量和排队链表中第一客户端数量的和值和值)进行比对,如果不一致,直播间服务器触发全量核查一次,检查所连接的客户端中是否存在已经不在频道的客户端。
另外,对于上述检查机制,还可以在主播开播后,定时检查频道当前的客户端数量并触发该检查过程。
作为一种优选实施方式,对于上述实施例的检查机制,为了更好的流量控制,可以以定时方式进行触发该检查过程,具体如下:
在缓存中设置一个在设定时间内失效标志位;
在第一客户端进入频道时,判断所述缓存是否存在所述标志位;
若存在,则不执行获取频道当前客户端数量并上传至直播间服务器的步骤,
若存在,则执行获取频道当前客户端数量并上传至直播间服务器的步骤,然后在缓存中重新写入所述标志位。
上述定时的触发策略,可以通过在缓存中设置一个1分钟失效的标志位来实现的,当有客户端进入频道时,如果缓存中没有这个标志,则触发一次清理过程,然后写入这个标志位,当有其他客户端进入频道时,发现存在这个标志,就不触发清理流程。通过上述技术手段,用最小1分钟触发一次的周期,这样在没有客户端进出频道时,就不会触发清理过程,避免重复频繁触发清理流程,并且实现了更好的流量控制功能。
进一步地,在清理不存在的客户端后,对当前客户端队列情况进行修复,该修复流程如下:
根据删除客户端后当前在线已接入客户端的数量与接入阈值之间的差距,将排队链表中前部的客户端移动到在线已接入客户端集合中,并向对应的客户端发送进入频道的通知消息;在移动客户端操作后,以剩余客户端数量更新排队链表的排序并生成相应的排位信息,并将各个客户端的排位信息发送至对应的客户端。
上述实施例的处理方案,在进行一次删除操作后,及时对在线已接入客户端和排队链表进行更新,并能够及时通知客户端,保证了当前缓存数据的实时性。
上述各个实施例,阐述了本发明的直播间的频道访问方法的多种实施方式,这些实施例的方案可以在如图1中所示的服务端上实现,针对于服务端的应用以及当前直播间的系统架构,下面结合附图阐述若干具体应用实例。
参考图6所示,图6为一个应用实例的服务端的系统结构图;主要包括服务节点(Service)、会话进程(Session)、直播间服务器、缓存代理、客户端查询进程(Query);
服务节点维护频道的所有客户端的客户端列表以及与客户端的通信交互,每个频道对应一个会话进程,直播间服务器对整个直播间的所有频道的进出频道进行处理,缓存代理通过链表形式缓存客户端数据;
在客户端进入频道过程中:
当一个客户端(用户登录的客户端)进入频道后,发送一个会话通知至服务节点,服务节点建立与客户端的连接,服务节点产生一个消息通知至对应的会话进程,会话进程将该消息通知转发给直播间服务器,直播间服务器将该写入到代理缓存中。
针对于进入频道流程,下面结合附图阐述一个应用实例,参考图7所示,图7为一个实例的客户端进入频道时序图。
如图7中流程所示,新进入频道的客户端,其流程是由客户端发送进频道消息,然后客户端登陆得到服务节点,服务节点转发消息至会话进程,会话进程转发进频道消息至直播间服务器,直播间服务器插入对应的客户端(插入在线已接入客户端集合或排队链表中),并返回相应的通知消息(观看直播或排队等候)至会话进程,会话进程转发至服务节点,服务节点将通知消息发送至对应的客户端。
在客户端退出频道过程中:
当一个客户端退出频道时,服务节点产生一个消息通知至直播间服务器,直播间服务器收到该消息通知后,首先查看在线已接入客户端集合,如果在在线已接入客户端集合中,则直接删除该客户端的数据,如果客户端不在在线已接入的客户端集合中,则从排队链表中找到该客户端并将其删除,然后更新排队链表的排序修改排队客户端的排序,并将更新后的排序通知排在该退出客户端后面的客户端。
在丢失客户端退出频道消息的检查方案中:
在主播开播时,从服务节点维护的客户端列表中获取到当前频道所有连接的客户端数量并上传至直播间服务器,直播间服务器将该客户端数量与记录的所有客户端数量进行对比,对频道进行全量核查一次,判断当前连接客户端中是否还存在已经退出频道的客户端。
具体方案可以在缓存中设置一个1分钟失效的标志位,当有客户端进入频道时,如果发现缓存中没有这个标志,则触发检查流程,然后写入这个标志位,当有其他客户端进入频道时,发现存在这个标志,就不触发检查流程。
在异常数据的修复过程中:
触发检查流程时,直播间服务器发一个查询通知消息至客户端查询进程,客户端查询进程从服务节点维护的客户端列表查询相应的客户端数量,并发送至直播间服务器,直播间服务器与记录的客户端数量进行比较,找出异常客户端并清理,然后将更新后的最新的排位信息通知到客户端。
针对于频道客户端数据修复流程,下面结合附图阐述一个应用实例,参考图8所示,图8为一个实例的频道客户端数据修复时序图。
如图8中流程所示,主播开播后,其流程是由主播的客户端定期发送消息1,至服务节点,服务节点转发消息2至会话进程,会话进程转发消息3至直播间服务器,直播间服务器检测连接的客户端数量,发送查询客户端数量消息至客户端查询进程,客户端查询进程向服务节点发送查询客户端数量消息,服务节点接收查询客户端数量消息后,返回包含客户端数量的消息4至客户端查询进程,客户端查询进程转发客户端数至直播间服务器,直播间服务器将连接的客户端数与记录的客户端数量进行对比,如果存在不一致,则向客户端查询进程发送查询客户端列表消息,客户端查询进程转发查询列表消息至服务节点,服务节点将自己维护的客户端列表返回至客户端查询进程,客户端查询进程将包含客户端列表的消息5发送至直播间服务器,直播间服务器收到客户端列表后,根据客户端列表记录的当前频道的客户端,将在线的客户端中已经退出频道的客户端进行删除,然后更新排队链表中排位信息,然后将更新后的排位信息通过通知消息依次由会话进程、客户端查询进程、服务节点转发至客户端,通知客户端最新的排队顺序。
参考图9所示,图9为一个实施例的直播间的频道访问系统的结构示意图,包括:
连接模块,用于获取第一客户端的进入频道请求,建立所述第一客户端与对应频道的连接;
判断模块,用判断对应频道当前已在线接入的客户端数量是否达到预定的接入阈值;
直播模块,用于若未达到所述接入阈值,将对应频道的业务信息发送至所述第一客户端;
排队模块,用于若已达到所述接入阈值,将所述第一客户端加入到排队链表中进行缓存。
为了更加清晰本发明的直播间的频道访问系统,下面结合图10阐述若干实施例。
参考图10所示,图10为另一个实施例的直播间的频道访问系统的结构示意图。
在一个实施例中,本发明的直播间的频道访问系统还可以包括:
退出模块,用于获取第二客户端的退出频道请求,断开所述第二客户端与对应频道的连接;查询所述第二客户端是否在在线已接入的客户端中;若是,则将其从在线已接入的客户端中删除,若否,则从排队链表中删除所述第二客户端;更新所述排队链表的排序。
在一个实施例中,本发明的直播间的频道访问系统的所述判断模块前还可以包括:
免排队模块,用于根据第一客户端的身份信息判断所述第一客户端是否为免排队客户端,若是,将对应频道的业务信息发送至所述第一客户端,否则将所述第一客户端加入到排队链表中进行缓存。
在一个实施例中,本发明的直播间的频道访问系统还可以包括:
通知模块,用于以设定的周期获取频道的排队链表的第一客户端数量和各个第一客户端的排序信息;根据所述第一客户端数量和排序信息生成各个第一客户端相应的排位信息;将所述排位信息发送至对应的第一客户端。
在一个实施例中,本发明的直播间的频道访问系统,所述通知模块用于将所述排位信息发送至对应的第一客户端的方法包括:
建立沿时间轴滑动的滑动窗口,并根据排队第一客户端的进入频道时间建立滑动时间轴;将所述滑动窗口沿所述滑动时间轴进行滑动,并将滑动窗口内的排队第一客户端的排位信息发送至对应的第一客户端。
在一个实施例中,本发明的直播间的频道访问系统还可以包括:
检查模块,用于获取频道当前客户端数量并上传至直播间服务器,直播间服务器接收到所述当前客户端数量后,将所述当前客户端数量与已在线接入的客户端数量和排队链表中第一客户端数量的和值和值进行对比,若当前客户端数量与所述和值不一致,则查找并删除将当前已经不在频道的客户端,并更新所述排队链表。
在一个实施例中,本发明的直播间的频道访问系统,所述检查模块前还包括:
触发模块,用于在缓存中设置一个在设定时间内失效标志位;在第一客户端进入频道时,判断所述缓存是否存在所述标志位;若存在,则不执行获取频道当前客户端数量并上传至直播间服务器的步骤,若存在,则执行获取频道当前客户端数量并上传至直播间服务器的步骤,然后在缓存中重新写入所述标志位。
本发明的直播间的频道访问系统与本发明的直播间的频道访问方法一一对应,在上述直播间的频道访问方法的实施例阐述的技术特征及其有益效果均适用于直播间的频道访问系统的实施例中,特此声明。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。