CN109309848B - 基于重试机制的弹幕分发方法、装置、设备及存储介质 - Google Patents
基于重试机制的弹幕分发方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN109309848B CN109309848B CN201811151400.7A CN201811151400A CN109309848B CN 109309848 B CN109309848 B CN 109309848B CN 201811151400 A CN201811151400 A CN 201811151400A CN 109309848 B CN109309848 B CN 109309848B
- Authority
- CN
- China
- Prior art keywords
- bullet screen
- distribution
- target
- message
- retry
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N21/00—Selective content distribution, e.g. interactive television or video on demand [VOD]
- H04N21/20—Servers specifically adapted for the distribution of content, e.g. VOD servers; Operations thereof
- H04N21/23—Processing of content or additional data; Elementary server operations; Server middleware
- H04N21/238—Interfacing the downstream path of the transmission network, e.g. adapting the transmission rate of a video stream to network bandwidth; Processing of multiplex streams
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N21/00—Selective content distribution, e.g. interactive television or video on demand [VOD]
- H04N21/40—Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
- H04N21/47—End-user applications
- H04N21/478—Supplemental services, e.g. displaying phone caller identification, shopping application
- H04N21/4788—Supplemental services, e.g. displaying phone caller identification, shopping application communicating with other users, e.g. chatting
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N21/00—Selective content distribution, e.g. interactive television or video on demand [VOD]
- H04N21/40—Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
- H04N21/47—End-user applications
- H04N21/488—Data services, e.g. news ticker
- H04N21/4884—Data services, e.g. news ticker for displaying subtitles
Abstract
本发明实施例公开了一种基于重试机制的弹幕分发方法、装置、设备及存储介质。该方法包括:在满足多线程弹幕分发条件时,依据当前系统状态参数值确定弹幕消息的当前并发数量,并确定当前并发数量的待分发弹幕消息及分发线程;利用各个分发线程将各个待分发弹幕消息并行分发;若通过反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息,则在目标弹幕接收对象对应的目标分发重试次数小于预设重试次数时,确定每个目标弹幕接收对象对应的目标弹幕消息及重试线程;利用重试线程,基于弹幕消息分发机制,重新将目标弹幕消息分发至目标弹幕接收对象。通过上述技术方案,实现了多线程并行的消息重试机制,减少了弹幕消息的丢失率。
Description
技术领域
本发明实施例涉及信息通信技术,尤其涉及一种基于重试机制的弹幕分发方法、装置、设备及存储介质。
背景技术
在音视频播放/直播应用软件中会大量使用弹幕消息。通常,弹幕消息是由传输及处理弹幕消息的服务器(即弹幕服务器)发送至应用软件,再由应用软件中具有分发弹幕消息功能的弹幕分发模块将接收的弹幕消息分发至各个需要接收弹幕消息的弹幕接收模块。
当弹幕服务器发送的弹幕消息的数量较多,而弹幕分发模块无法及时进行弹幕消息的分发时,通常会在弹幕分发模块中建立一个消息集合,以存储未分发的弹幕消息。
但是,现有的弹幕消息分发模式是弹幕分发模块按照弹幕服务器下发弹幕消息的顺序,逐条从消息缓存集合中获取缓存的弹幕消息并进行分发,这就会导致弹幕分发模块的分发效率低,降低弹幕消息的分发时效性,且当弹幕接收模块中弹幕消息处理失败时会造成弹幕消息的丢失。
发明内容
本发明实施例提供一种基于重试机制的弹幕分发方法、装置、设备及存储介质,以实现至少一个弹幕消息处理失败时的多线程并行的消息重试机制,有效减少了弹幕消息的丢失率,并提高了弹幕消息重试分发的分发效率和有效性。
第一方面,本发明实施例提供了一种基于重试机制的弹幕分发方法,包括:
在满足多线程弹幕分发条件时,弹幕分发对象依据当前系统状态参数值确定弹幕消息的当前并发数量,并从消息集合中获取所述当前并发数量的待分发弹幕消息,以及确定所述当前并发数量的分发线程;
所述弹幕分发对象利用各个所述分发线程,基于弹幕消息分发机制,将各个所述待分发弹幕消息并行分发至与各个所述待分发弹幕消息一一对应的各个第一弹幕接收对象;
若所述弹幕分发对象通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息,则针对每个目标弹幕接收对象,在所述目标弹幕接收对象对应的目标分发重试次数小于预设重试次数时,所述弹幕分发对象确定所述目标弹幕接收对象对应的目标弹幕消息及重试线程;
所述弹幕分发对象利用所述重试线程,基于所述弹幕消息分发机制,重新将所述目标弹幕消息分发至所述目标弹幕接收对象。
可选地,所述满足多线程弹幕分发条件包括:消息并发定时器的当前定时周期到达,其中,所述当前定时周期依据所述当前并发数量的上一个历史并发数量确定。
可选地,所述依据当前系统状态参数值确定弹幕消息的当前并发数量包括:
当所述系统状态参数为所述当前CPU占用率时,所述弹幕分发对象依据所述当前CPU占用率和预先设定的并发数量求解公式确定所述当前并发数量。
可选地,所述弹幕消息分发机制包括:
所述弹幕分发对象依据弹幕消息的消息标识,从对象集合中获取与所述消息标识对应的第二弹幕接收对象,其中,所述对象集合存储继承了预先定义的弹幕分发协议的弹幕接收对象,所述弹幕分发协议为具有公有权限标识符的接口类型的协议;
所述弹幕分发对象依据所述弹幕分发协议,将所述第二弹幕接收对象转换为弹幕分发协议类型的对象,作为目标接收对象;
所述弹幕分发对象以所述弹幕消息为函数输入参数,通过所述目标接收对象调用弹幕分发函数,将所述弹幕消息分发至所述目标接收对象,其中,所述弹幕分发函数为所述弹幕分发协议的内部函数。
可选地,所述弹幕分发对象通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息包括:
每个所述目标弹幕接收对象以整型类型的目标哈希码值、转换为祖先类Object类型的反馈弹幕消息和字符串类型的目标消息标识为函数输入参数,通过预先持有的所述弹幕分发对象调用反馈函数,将所述失败反馈消息发送至所述弹幕分发对象,其中,所述反馈函数为所述弹幕分发对象基于预先定义的反馈协议而获得,所述反馈协议为具有公有权限标识符的接口类型的协议;
所述弹幕分发对象通过回调所述反馈函数,获得所述失败反馈消息。
进一步地,所述弹幕分发对象确定所述目标弹幕接收对象对应的目标弹幕消息及重试线程包括:
所述弹幕分发对象依据所述目标消息标识确定所述反馈弹幕消息的原生数据类型,并将所述反馈弹幕消息转换为所述原生数据类型,获得目标弹幕消息;
所述弹幕分发对象从已开辟线程中确定一个线程,或者重新开辟一个新线程,作为所述重试线程。
可选地,在确定所述目标弹幕接收对象对应的目标分发重试次数小于预设重试次数之前,还包括:
所述弹幕分发对象以所述目标弹幕接收对象的目标哈希码值为函数输入参数,调用map集合的值获取函数获得函数返回值,并判断所述函数返回值是否为异常标识,其中,所述map集合存储各个弹幕接收对象的哈希码值和分发重试次数;
若是,则所述弹幕分发对象确定所述目标分发重试次数为0,且调用所述map集合的元素插入函数,将所述目标哈希码值和数值1存入所述map集合;
若否,则所述弹幕分发对象将所述函数返回值作为所述目标弹幕接收对象的目标分发重试次数,并以所述目标哈希码值为函数输入参数,调用所述map集合的值设置函数,将所述目标分发重试次数累加1,以更新所述目标弹幕接收对象的分发重试次数。
可选地,在所述目标弹幕接收对象对应的目标分发重试次数等于或大于所述预设重试次数时,所述弹幕分发对象丢弃所述目标弹幕消息,并释放所述目标弹幕接收对象的目标分发重试次数、目标反馈通道和目标分发通道。
可选地,若所述目标弹幕消息处理失败,且检测到反馈通道未构建,则各个目标弹幕接收对象将所述目标弹幕消息按序缓存至消息处理集合,并在接收到下一条待分发弹幕消息时,将该下一条待分发弹幕消息按序缓存至所述消息处理集合,且从所述消息处理集合中按序获取缓存弹幕消息进行处理。
第二方面,本发明实施例还提供了一种基于重试机制的弹幕分发装置,该装置包括弹幕分发模块,该弹幕分发模块包括并发弹幕及线程确定单元、弹幕并行分发单元、重试弹幕及线程确定单元和弹幕重试分发单元;
并发弹幕及线程确定单元,用于在满足多线程弹幕分发条件时,依据当前系统状态参数值确定弹幕消息的当前并发数量,并从消息集合中获取当前并发数量的待分发弹幕消息,以及确定当前并发数量的分发线程;
弹幕并行分发单元,用于利用各个分发线程,基于弹幕消息分发机制,将各个待分发弹幕消息并行分发至与各个待分发弹幕消息一一对应的各个第一弹幕接收对象;
重试弹幕及线程确定单元,用于若通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息,则针对每个目标弹幕接收对象,在目标弹幕接收对象对应的目标分发重试次数小于预设重试次数时,弹幕分发对象确定目标弹幕接收对象对应的目标弹幕消息及重试线程;
弹幕重试分发单元,用于弹幕分发对象利用重试线程,基于弹幕消息分发机制,重新将目标弹幕消息分发至目标弹幕接收对象。
可选地,满足多线程弹幕分发条件包括:消息并发定时器的当前定时周期到达,其中,当前定时周期依据当前并发数量的上一个历史并发数量确定。
可选地,并发弹幕及线程确定单元具体用于:
当系统状态参数为当前CPU占用率时,弹幕分发对象依据当前CPU占用率和预先设定的并发数量求解公式确定当前并发数量。
可选地,弹幕消息分发机制包括:
弹幕分发对象依据弹幕消息的消息标识,从对象集合中获取与消息标识对应的第二弹幕接收对象,其中,对象集合存储继承了预先定义的弹幕分发协议的弹幕接收对象,弹幕分发协议为具有公有权限标识符的接口类型的协议;
弹幕分发对象依据弹幕分发协议,将第二弹幕接收对象转换为弹幕分发协议类型的对象,作为目标接收对象;
弹幕分发对象以弹幕消息为函数输入参数,通过目标接收对象调用弹幕分发函数,将弹幕消息分发至目标接收对象,其中,弹幕分发函数为弹幕分发协议的内部函数。
可选地,重试弹幕及线程确定单元包括反馈消息获取子单元;在上述装置的基础上,该装置还包括弹幕接收模块,该弹幕接收模块包括消息反馈单元;
消息反馈单元,用于每个目标弹幕接收对象以整型类型的目标哈希码值、转换为祖先类Object类型的反馈弹幕消息和字符串类型的目标消息标识为函数输入参数,通过预先持有的弹幕分发对象调用反馈函数,将失败反馈消息发送至弹幕分发对象,其中,反馈函数为弹幕分发对象基于预先定义的反馈协议而获得,反馈协议为具有公有权限标识符的接口类型的协议;
反馈消息获取子单元,用于通过回调反馈函数,获得失败反馈消息。
可选地,弹幕分发模块还包括分发重试次数维护单元,用于:
在确定目标弹幕接收对象对应的目标分发重试次数小于预设重试次数之前,以目标弹幕接收对象的目标哈希码值为函数输入参数,调用map集合的值获取函数获得函数返回值,并判断函数返回值是否为异常标识,其中,map集合存储各个弹幕接收对象的哈希码值和分发重试次数;
若是,则确定目标分发重试次数为0,且调用map集合的元素插入函数,将目标哈希码值和数值1存入map集合;
若否,则将函数返回值作为目标弹幕接收对象的目标分发重试次数,并以目标哈希码值为函数输入参数,调用map集合的值设置函数,将目标分发重试次数累加1,以更新目标弹幕接收对象的分发重试次数。
可选地,重试弹幕及线程确定单元具体用于:
依据目标消息标识确定反馈弹幕消息的原生数据类型,并将反馈弹幕消息转换为原生数据类型,获得目标弹幕消息;
从已开辟线程中确定一个线程,或者重新开辟一个新线程,作为重试线程。
可选地,弹幕分发模块还包括释放单元,用于:
在目标弹幕接收对象对应的目标分发重试次数等于或大于预设重试次数时,丢弃目标弹幕消息,并释放目标弹幕接收对象的目标分发重试次数、目标反馈通道和目标分发通道。
可选地,弹幕接收模块包括消息重试处理单元,用于:
若目标弹幕消息处理失败,且检测到反馈通道未构建,则各个目标弹幕接收对象将目标弹幕消息按序缓存至消息处理集合,并在接收到下一条待分发弹幕消息时,将该下一条待分发弹幕消息按序缓存至消息处理集合,且从消息处理集合中按序获取缓存弹幕消息进行处理。
第三方面,本发明实施例还提供了一种设备,该设备包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明任意实施例所提供的基于重试机制的弹幕分发方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现本发明任意实施例所提供的基于重试机制的弹幕分发方法。
本发明实施例通过在满足多线程弹幕分发条件时,依据当前系统状态参数值确定弹幕消息的当前并发数量,并从消息集合中获取当前并发数量的待分发弹幕消息,以及确定当前并发数量的分发线程;利用各个分发线程,基于弹幕消息分发机制,将各个待分发弹幕消息并行分发至与各个待分发弹幕消息一一对应的各个第一弹幕接收对象。在利用弹幕消息并行分发技术提高弹幕消息分发效率的基础上,实现了根据系统状态动态地确定弹幕消息并行分发的数量,有效降低因系统繁忙而导致弹幕消息并行分发进程的阻塞程度,进一步提高了弹幕消息的分发效率和分发时效性。通过若通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息,则针对每个目标弹幕接收对象,在目标弹幕接收对象对应的目标分发重试次数小于预设重试次数时,确定目标弹幕接收对象对应的目标弹幕消息及重试线程;利用重试线程,基于弹幕消息分发机制,重新将目标弹幕消息分发至目标弹幕接收对象。实现了至少一个待分发弹幕消息处理失败时的多线程并行的消息重试机制,有效减少了弹幕消息的丢失率,并提高了弹幕消息重试分发的分发效率和有效性。
附图说明
图1是本发明实施例一中的一种基于重试机制的弹幕分发方法的流程图;
图2是本发明实施例二中的一种基于重试机制的弹幕分发方法中的消息交互方法的流程图;
图3是本发明实施例三中的一种基于重试机制的弹幕分发方法的流程图;
图4是本发明实施例四中的一种基于重试机制的弹幕分发装置的结构示意图;
图5是本发明实施例五中的一种设备的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
本实施例提供的基于重试机制的弹幕分发方法可适用于Android客户端中的音视频播放/直播应用软件中的弹幕消息分发,尤其适用于在弹幕消息数量较多,且一条弹幕消息仅发送至一个弹幕接收对象的情况。该方法可以由基于重试机制的弹幕分发装置来执行,该装置可以由软件和/或硬件的方式实现,该装置可以集成在搭载Android系统的具有弹幕消息分发功能的设备中,例如典型的是用户终端设备,例如手机、平板电脑或智能电视等。参见图1,本实施例的方法具体包括如下步骤:
S110、在满足多线程弹幕分发条件时,弹幕分发对象依据当前系统状态参数值确定弹幕消息的当前并发数量,并从消息集合中获取当前并发数量的待分发弹幕消息,以及确定当前并发数量的分发线程。
其中,多线程弹幕分发条件是指预先设定的,用于触发弹幕消息多线程并行分发的条件,例如可以是新的弹幕消息的接收,也可以是弹幕消息分发进度,还可以是设置定时器等。弹幕分发对象是指弹幕分发模块中定义的实现弹幕分发功能的弹幕分发类的实例化对象。系统状态参数是指能够表征系统运行状态的参数。当前系统状态参数值是指当前时刻的系统状态参数的值。示例性地,当前系统状态参数包括当前CPU占用率、当前内存占用率和当前系统温度中的至少一种。具体实施时,可以利用当前CPU占用率、当前内存占用率和当前系统温度中的至少一种来表征搭载Android系统的设备的运行状态。这样设置的好处在于可以从至少一个角度反映当前系统的繁忙程度。
当前并发数量是指当前时刻的并行分发的弹幕消息的数量。消息集合是指弹幕分发对象中存储弹幕消息的集合,其数据结构可以是数组、列表或队列等。为了更好地保证弹幕消息的存储顺序及获取顺序,消息集合优选为具有先进先出特性的队列结构。本发明实施例中,为了实现弹幕消息的并行分发,弹幕分发对象在接收到弹幕服务器下发的弹幕消息时,并不是立即将其分发,而是将其存储至消息集合中。待分发弹幕消息是指本操作中要进行分发的弹幕消息。分发线程是指本操作中需要用来进行弹幕消息分发的线程。
具体地,弹幕分发对象首先判断是否满足多线程弹幕分发条件,例如,判断其是否接收到弹幕服务器发送的新的弹幕消息,或者判断其是否将上一批弹幕消息分发完毕,或者判断设置的定时器的定时周期是否到达等。如果判断结果为是,那说明已经满足了多线程弹幕分发条件,弹幕分发对象便会获取当前系统状态参数值。如果当前系统状态参数值较高,则表明系统当前功耗较大,无法承担过多的并行弹幕消息分发任务,此时便可将当前并发数量设置为一个较小的数值;反之,表明系统的当前可用资源丰富,便可将当前并发数量设置为一个较大的数值。
本实施例中可以将系统状态参数值与弹幕消息的并发数量的对应关系设置为具有离散数值的查找表,以存储系统状态参数值的各个取值范围及每个取值范围对应的并发数量。那么,上述依据当前系统状态参数值确定弹幕消息的当前并发数量的过程便为:根据当前系统状态参数值确定出其对应的取值范围,之后将查找表中该取值范围对应的并发数量确定为当前并发数量。这样设置的好处在于当前并发数量的确定速度快,可进一步提高弹幕消息的分发效率。
本实施例中也可以将系统状态参数值与弹幕消息的并发数量的对应关系设置为数值计算公式,将系统状态参数值设置为因变量,而将并发数量设置为应变量。后续便可以直接根据当前系统状态参数值计算获得相应的当前并发数量。这样设置的好处在于,可以更加精确的确定当前并发数量,从而后续确定更加合适数量的并发线程,可进一步减少线程阻塞的情况,进而进一步提高弹幕消息的分发效率。
上述操作之后,弹幕分发对象便从消息集合中按序获取当前并发数量的弹幕消息,作为待分发弹幕消息。另外,弹幕分发对象从对系统中的所有线程进行动态管理的线程池获取当前并发数量的线程,作为分发线程。后续便可利用各个分发线程来分发各个待分发弹幕消息。需要说明的是,本步骤中确定待分发弹幕消息的操作和确定分发线程的操作无执行顺序的限定,两者可以先后执行,也可以同步执行。
S120、弹幕分发对象利用各个分发线程,基于弹幕消息分发机制,将各个待分发弹幕消息并行分发至与各个待分发弹幕消息一一对应的各个第一弹幕接收对象。
其中,弹幕消息分发机制是指弹幕分发对象向弹幕接收对象分发弹幕消息的实现机制。例如,当弹幕分发对象和弹幕接收对象处于同一个功能模块时,弹幕消息分发机制可以是通过两者之间的直接对象引用来进行弹幕消息分发。而当弹幕分发对象和弹幕接收对象处于不同功能模块时,弹幕消息分发机制可以是通过不同功能模块提供的模块间交互接口来建立两者之间的耦合式通信通道,弹幕分发对象通过该耦合式通信通道将弹幕消息直接分发至相应的弹幕接收对象;也可以是通过自定义接口类型的通信协议建立两者之间的桥接式通信通道,弹幕分发对象通过该桥接式通信通道将弹幕消息直接分发至相应的弹幕接收对象;还可以是通过Android系统中的系统通信通道,如系统广播通道或第三方开源事件总线EventBus,进行弹幕消息的传输。
弹幕接收对象是指弹幕接收模块中需要接收弹幕消息的组件对象,例如可以是用于弹幕消息显示的视图对象,也可以是用于对弹幕消息进行数据处理的业务控制器对象,还可以是对弹幕消息进行存储或传输的数据管理器对象。第一弹幕接收对象是指接收待分发弹幕消息的弹幕接收对象。
具体地,弹幕分发对象利用一个分发线程独立地将一条待分发弹幕消息分发至该待分发弹幕消息对应的第一弹幕接收对象中,各个分发线程同时执行分发操作,以并行地将各个待分发弹幕消息分发至其对应的各个第一弹幕接收对象。该过程中每个分发线程中的弹幕消息分发均是基于弹幕消息分发机制来实现的。需要说明的是,在上述过程中需要保证一个分发线程对应有一个待分发弹幕消息,且各个分发线程对应的待分发弹幕消息不重复。
S130、若弹幕分发对象通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息,则针对每个目标弹幕接收对象,在目标弹幕接收对象对应的目标分发重试次数小于预设重试次数时,弹幕分发对象确定目标弹幕接收对象对应的目标弹幕消息及重试线程。
其中,反馈通道是指弹幕接收对象向弹幕分发对象发送其是否接收到弹幕消息和/或其对弹幕消息是否处理成功等信息的通信通道。反馈通道的构建方式可以是直接对象引用方式,基于交互接口的耦合式通信通道,基于自定义接口类型协议的桥接式通信通道,或者诸如系统广播的系统通信通道。目标弹幕接收对象是指反馈了失败反馈消息的第一弹幕接收对象。失败反馈消息是指目标弹幕接收对象向弹幕分发对象发送的反馈消息,其至少包含接收失败或处理失败的弹幕消息和该弹幕消息的消息标识,还可以包含目标弹幕接收对象对应的对象标识和/或失败详情描述。这里的对象标识是指能够标识一个对象的字符,其可以是数字、字母和符号中的至少一种,其具有全局唯一性。消息标识是指能够标识弹幕消息的字符,其可以是数字、字母和符号中的至少一种,其具有全局唯一性。目标分发重试次数是指目标弹幕接收对象的弹幕消息分发的重试次数。重试线程是指重新进行弹幕消息分发时所使用的线程。
具体地,弹幕分发对象分发各个待分发弹幕消息之后,各个第一弹幕接收对象会接收相应的弹幕消息,并对其进行显示或逻辑运算等处理。如果各个第一弹幕接收对象中存在至少一个未接收到待分发弹幕消息或者对其处理失败的第一弹幕接收对象(即目标弹幕接收对象),那么各个目标弹幕接收对象就会将相应的失败反馈消息通过各个目标弹幕接收对象对应的反馈通道发送给弹幕分发对象。
弹幕分发对象接收到各个失败反馈消息之后,会对每一个目标弹幕接收对象进行相同的重新分发操作。该重新分发操作过程为:弹幕分发对象进一步判断目标弹幕接收对象的目标分发重试次数是否达到预设重试次数。如果未达到,那么就会重新确定一个分发线程(即重试线程),以将目标弹幕接收对象对应的目标弹幕消息重新分发给该目标弹幕接收对象。上述目标弹幕消息可以是弹幕分发对象中存储所有的弹幕消息,并通过目标弹幕接收对象的对象标识来确定;也可以是弹幕分发对象中不存储分发过的弹幕消息,而是目标弹幕接收对象将目标弹幕消息作为失败反馈消息中的一个信息反馈至弹幕分发对象,从而使得弹幕分发对象获得目标弹幕消息。
S140、弹幕分发对象利用重试线程,基于弹幕消息分发机制,重新将目标弹幕消息分发至目标弹幕接收对象。
具体地,S130中的重新分发操作过程中,弹幕分发对象基于弹幕消息分发机制,在重试线程中将目标弹幕消息重新分发至目标弹幕接收对象。应当理解,各个目标弹幕接收对象均对应有一个重试线程,多个重试线程中的弹幕消息重新分发互不影响。
本实施例的技术方案,通过在满足多线程弹幕分发条件时,依据当前系统状态参数值确定弹幕消息的当前并发数量,并从消息集合中获取当前并发数量的待分发弹幕消息,以及确定当前并发数量的分发线程;利用各个分发线程,基于弹幕消息分发机制,将各个待分发弹幕消息并行分发至与各个待分发弹幕消息一一对应的各个第一弹幕接收对象。在利用弹幕消息并行分发技术提高弹幕消息分发效率的基础上,实现了根据系统状态动态地确定弹幕消息并行分发的数量,有效降低因系统繁忙而导致弹幕消息并行分发进程的阻塞程度,进一步提高了弹幕消息的分发效率和分发时效性。通过若通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息,则针对每个目标弹幕接收对象,在目标弹幕接收对象对应的目标分发重试次数小于预设重试次数时,确定目标弹幕接收对象对应的目标弹幕消息及重试线程;利用重试线程,基于弹幕消息分发机制,重新将目标弹幕消息分发至目标弹幕接收对象。实现了至少一个待分发弹幕消息处理失败时的多线程并行的消息重试机制,有效减少了弹幕消息的丢失率,并提高了弹幕消息重试分发的分发效率和有效性。
实施例二
本实施例在上述实施例一的基础上,对“弹幕消息分发机制”进行了进一步优化。在此基础上,还可以进一步对“弹幕分发对象通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息”进行优化。其中与上述各实施例相同或相应的术语的解释在此不再赘述。由于每个线程中的消息分发过程一致,故本实施例中以单线程的消息交互为例进行说明。参见图2,本实施例提供的基于重试机制的弹幕分发方法中的消息交互方法包括:
S210、弹幕分发对象依据弹幕消息的消息标识,从对象集合中获取与消息标识对应的第二弹幕接收对象。
其中,对象集合是指存储各个弹幕接收对象引用关系的集合,其设置于弹幕分发对象中。为了从对象集合中获取所需要的弹幕接收对象,对象集合中还可以存储用于查找集合元素的索引项,例如弹幕消息的消息标识,和/或弹幕接收对象的哈希值。
具体地,弹幕分发对象中的对象集合中预先存储了各个弹幕接收对象,当弹幕分发对象需要进行弹幕消息分发时,其会先根据要分发的弹幕消息的消息标识从对象集合中确定出要接收该弹幕消息的弹幕接收对象,即第二弹幕接收对象,以便后续进行针对性地弹幕消息分发。
示例性地,对象集合存储继承了预先定义的弹幕分发协议的弹幕接收对象。这里弹幕分发协议是指Android客户端的音视频播放/直播应用软件中预先定义的,弹幕分发对象进行弹幕分发时所遵循的组件间通信协议,其内包含用于实现弹幕消息分发的弹幕分发函数。该弹幕分发协议是具有公有权限标识符public的接口interface类型的协议。例如,弹幕分发协议IMessage可以定义为:public interface IMessage{public voidonMessage(String type,Message msg);}。该协议定义中,弹幕分发函数onMessage具有两个函数输入参数,分别是字符串String类型的消息标识和承载弹幕消息的消息Message类型的消息体。该函数的函数输入参数可以根据实际应用需求进行适应性调整。
本实施例中弹幕分发对象和弹幕接收对象处于不同功能模块,故将弹幕消息分发机制设置为建立弹幕分发对象和弹幕接收对象之间的桥接式通信通道,弹幕分发对象通过该桥接式通信通道将弹幕消息直接分发至相应的弹幕接收对象,这样设置的好处在于建立了弹幕分发对象和弹幕接收对象之间专门用于弹幕消息分发的通信通道,进一步提高弹幕消息的分发效率。具体实施时,预先定义一个全局作用域的对象集合以及包含弹幕分发函数的弹幕分发协议。弹幕接收类通过Java语言中的接口协议继承关键字implement继承该弹幕分发协议,并实现其内的弹幕分发函数。然后,在各个弹幕接收对象创建时,通过调用弹幕接收类的构造函数实例化生成各个弹幕接收对象,该弹幕接收对象同时也是协议接收对象,其内包含作为回调函数的弹幕分发函数OnMessage。在各个弹幕接收对象创建之后,将其存储至上述对象集合中,这样弹幕分发对象便可通过对象集合持有各个弹幕接收对象的引用关系,至此便构建了上述桥接式通信通道。
S220、弹幕分发对象依据弹幕分发协议,将第二弹幕接收对象转换为弹幕分发协议类型的对象,作为目标接收对象。
具体地,根据上述说明可知,由对象集合中获得的第二弹幕接收对象既有接收弹幕消息的功能,又有弹幕分发协议的通信功能。为了后续调用时仅利用该通信功能,而不会调用弹幕接收对象内部的相应消息处理功能,根据弹幕分发协议对应的弹幕分发协议类型,将第二弹幕接收对象强制转换为弹幕分发协议类型,获得仅具有弹幕分发协议的通信功能的接收协议对象,将其作为目标接收对象。
S230、弹幕分发对象以弹幕消息为函数输入参数,通过目标接收对象调用弹幕分发函数,将弹幕消息分发至目标接收对象。
具体地,弹幕分发对象利用桥接式通信通道进行弹幕消息分发时,是以弹幕消息为函数输入参数,通过目标接收对象调用其内的弹幕分发函数,以触发目标接收对象回调相应的弹幕分发函数,从而接收弹幕分发对象作为函数输入参数发送的弹幕消息。
S240、每个目标弹幕接收对象以整型类型的目标哈希码值、转换为祖先类Object类型的反馈弹幕消息和字符串类型的目标消息标识为函数输入参数,通过预先持有的弹幕分发对象调用反馈函数,将失败反馈消息发送至弹幕分发对象。
其中,目标哈希码值是目标弹幕接收对象的哈希码值,该哈希码值是根据目标弹幕接收对象的地址、字符串和存储数据中的至少一个确定的整型类型的数值。反馈弹幕消息是指目标弹幕接收对象将要发送至弹幕分发对象的弹幕消息。反馈函数是弹幕接收对象向弹幕分发对象发送消息的函数。示例性地,反馈函数为弹幕分发对象基于预先定义的反馈协议而获得,反馈协议为具有公有权限标识符的接口类型的协议。例如,反馈协议IResponse可以定义为:public interface IResponse{public void onError(intviewHashCode,Object Danmu,String type,String errorMsg);}。该协议定义中,反馈函数onError具有四个函数输入参数,分别是整型类型的目标哈希码值viewHashCode、祖先类Object类型的反馈弹幕消息Danmu、字符串类型的目标消息标识type和字符串类型的错误消息描述errorMsg。该错误消息描述可以为目标弹幕接收对象中该反馈弹幕消息处理失败的描述性信息。这里将反馈弹幕消息的类型设置为Object类型是为了提高反馈函数的兼容性,从而提高整个弹幕分发过程的容错性。
具体地,每个目标弹幕接收对象向弹幕分发对象发送失败反馈消息的过程是相同的。在执行失败反馈消息的发送操作之前,需要先构建每个弹幕接收对象与弹幕分发对象之间的各个反馈通道。该反馈通道的构建过程为:弹幕分发类基于预先定义的反馈协议获得弹幕分发对象;弹幕分发对象从对象集合中获取各个弹幕接收对象,并以弹幕分发对象为函数输入参数,分别调用各个弹幕接收对象中的对象设置函数,将弹幕分发对象注册至各个弹幕接收对象,以使各个弹幕接收对象持有弹幕分发对象。具体实施时,预先定义上述反馈协议,并且在弹幕接收类中定义一个具有回调函数性质的,用于进行对象传输的对象设置函数setResponse,如public void setResponse(IResponse response){this.mResponse=response;},该函数的功能是将作为函数输入参数传入的对象赋值给回调该函数的对象中的对象变量,这样,各个弹幕接收对象便也包含了该对象设置函数。弹幕分发类通过接口协议继承关键字implement继承反馈协议,并实现其中的反馈函数,则该弹幕分发类的实例化对象——弹幕分发对象便也具有了反馈协议的功能和反馈函数。然后,弹幕分发对象以对象本身为函数输入参数,通过其持有的对象集合中的各个弹幕接收对象,分别调用其内的对象设置函数,触发各个弹幕接收对象回调其内的对象设置函数,从而将做为函数输入参数的弹幕分发对象赋值给弹幕接收对象内部的对象变量,这样各个弹幕接收对象便持有了弹幕分发对象,也就构建了各个反馈通道。
反馈通道构建成功的基础上,上述发送失败反馈消息的过程为:目标弹幕接收对象将反馈弹幕消息转换为祖先类Object类型,然后以目标哈希码值viewHashCode、反馈弹幕消息Danmu、目标消息标识type和错误消息描述errorMsg为函数输入参数,通过其持有的弹幕分发对象调用反馈函数,以将由上述4个参数构成的失败反馈消息发送至弹幕分发对象。
S250、弹幕分发对象通过回调反馈函数,获得失败反馈消息。
具体地,弹幕分发对象被触发回调其内的反馈函数,从而获得各个目标弹幕接收对象发送的失败反馈消息。
本实施例的技术方案,通过弹幕分发对象依据弹幕消息的消息标识,从对象集合中获取与消息标识对应的第二弹幕接收对象;依据弹幕分发协议,将第二弹幕接收对象转换为弹幕分发协议类型的对象,作为目标接收对象;以弹幕消息为函数输入参数,通过目标接收对象调用弹幕分发函数,将弹幕消息分发至目标接收对象。实现了通过桥接式通信通道直达式地向各个弹幕接收对象分发弹幕消息,进一步提高了多线程弹幕消息分发的分发效率和时效性。通过目标弹幕接收对象以整型类型的目标哈希码值、转换为祖先类Object类型的反馈弹幕消息和字符串类型的目标消息标识为函数输入参数,通过预先持有的弹幕分发对象调用反馈函数,将失败反馈消息发送至弹幕分发对象;弹幕分发对象通过回调反馈函数,获得失败反馈消息。实现了目标弹幕分发对象向弹幕分发对象直达式地发送失败反馈消息,提高了失败反馈消息的反馈效率,同时减少了弹幕分发对象中为存储各个反馈弹幕消息而开辟的内存空间,也简化了弹幕分发对象内部的业务逻辑,从而提高了弹幕分发对象的处理效率,进一步提高了弹幕消息重试机制的实现效率。
实施例三
本实施例在上述实施例一的基础上,对“满足多线程弹幕分发条件”进行了进一步优化。在此基础上,可以进一步对“依据当前系统状态参数值确定弹幕消息的当前并发数量”进行优化。在上述基础上,也可以进一步对“弹幕分发对象确定目标弹幕接收对象对应的目标弹幕消息及重试线程”进行优化。在上述基础上,还可以进一步增加“分发重试次数”的维护步骤,以及“标分发重试次数等于或大于预设重试次数时”的通道释放步骤。其中与上述各实施例相同或相应的术语的解释在此不再赘述。参见图3,本实施例提供的基于重试机制的弹幕分发方法包括:
S301、在消息并发定时器的当前定时周期到达时,弹幕分发对象依据当前CPU占用率和预先设定的并发数量求解公式确定当前并发数量。
其中,消息并发定时器是用于触发弹幕消息多线程并行分发的定时器。当前定时周期是指当前时刻消息并发定时器的定时时长,其可以是预先设置的固定数值的时长(即预设时长),也可以是依据设定调整规则动态调整的动态时长。示例性地,当前定时周期依据当前并发数量的上一个历史并发数量确定。历史并发数量是指当前时刻之前的历史时刻的并发数量,其与当前并发数量相对应。上一个历史并发数量是指与当前时刻最接近的历史时刻的并发数量。具体实施时,在上一个历史并发数量确定之后,便可据其确定当前定时周期。本实施例中将当前定时周期与上一个历史并发数量的关系设定为负相关关系,如果上一个历史并发数量较大,则说明当前可用系统资源丰富,可以认为弹幕消息的分发速度较快,那么可以设置一个时长较短的当前定时周期,以便更加及时地分发各个弹幕消息;反之,设置一个时长较长的当前定时周期,以确保上一批并行分发的弹幕消息能够分发完毕,避免因多批弹幕消息并行分发而导致的系统功耗过大。当前定时周期是一次分发过程调整一次,且是S110执行之前便确定。这样设置的好处在于能够根据当前系统运行状态动态地确定消息并发定时器的当前定时周期,从而更加精确地触发弹幕消息的并行分发,进一步提高弹幕消息的分发效率和时效性。
具体地,弹幕分发对象首先判断消息并发定时器的当前定时周期是否达到。在判断达到时,弹幕分发对象获取Android系统的当前CPU占用率。之后,弹幕分发对象根据当前CPU占用率与当前并发数量之间的并发数量求解公式计算当前并发数量。该并发数量求解公式具体为:
ParaNum=10-(int)(CpuOcRate*100/10)
该公式中ParaNum为当前并发数量,int为取整关键字,CpuOcRate为当前CPU占用率。该公式的构建依据是:为了避免一次开辟的线程数量过多,本实施例中将一次开辟的线程数量最大值设置为10,也就是系统可用资源允许的情况下,最多一次可并行分发10条弹幕消息。然后,将百分比形式的当前并发数量CpuOcRate变为实数,即CpuOcRate*100;之后,为了确保最终确定的并发数量为小于或等于10的数值,而取上述获得的实数的十位及以上的数值,即CpuOcRate*100/10;同时为了确保计算结果为整数,利用int取整关键字对上述结果再向下取整。最后,为了使CPU占用率与并发数量呈负相关,从而符合S110中的相关说明,用并发数量最大值10与取整后结果做差。
S302、弹幕分发对象从消息集合中获取当前并发数量的待分发弹幕消息,以及确定当前并发数量的分发线程。
S303、弹幕分发对象利用各个分发线程,基于弹幕消息分发机制,将各个待分发弹幕消息并行分发至与各个待分发弹幕消息一一对应的各个第一弹幕接收对象。
S304、若目标弹幕消息处理失败,且检测到反馈通道未构建,则各个目标弹幕接收对象将目标弹幕消息按序缓存至消息处理集合,并在接收到下一条待分发弹幕消息时,将该下一条待分发弹幕消息按序缓存至消息处理集合,且从消息处理集合中按序获取缓存弹幕消息进行处理。
其中,消息处理集合是指弹幕接收对象中设置的,用于缓存弹幕分发对象分发的,且等待处理的弹幕消息。缓存弹幕消息是指消息处理集合中缓存的弹幕消息。
具体地,如果目标弹幕接收对象检测到其对目标弹幕消息的处理失败,并且检测到其与弹幕分发对象之间的反馈通道并未成功构建,则该目标弹幕接收对象将该目标弹幕消息缓存至消息处理集合。并且,目标弹幕接收对象在处理该目标弹幕消息时,便将后续接收的各条待分发弹幕消息全部按照分发顺序存储至消息处理集合,而不执行消息处理操作。在执行目标弹幕消息缓存至消息处理集合操作之后,如果目标弹幕接收对象检测到其满足消息处理条件,如定时器周期到达,或者接收到弹幕分发对象分发的下一条待分发弹幕消息,则该目标弹幕接收对象从消息处理集合中按照消息存储顺序获取一条缓存弹幕消息进行处理。
S305、若弹幕分发对象通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息,则针对每个目标弹幕接收对象,弹幕分发对象以目标弹幕接收对象的目标哈希码值为函数输入参数,调用map集合的值获取函数获得函数返回值,并判断函数返回值是否为异常标识。
其中,map集合存储各个弹幕接收对象的哈希码值和分发重试次数。该map集合设置在弹幕分发对象中,其内将弹幕接收对象的哈希码值为键,以该弹幕接收对象的分发重试次数为值,一一对应地进行存储。
具体地,如果目标弹幕接收对象检测到反馈通道成功构建,则会通过该反馈通道进行失败反馈消息的反馈操作,之后弹幕分发对象会进行目标弹幕消息的重试分发操作。具体实施时,弹幕分发对象在重新向目标弹幕接收对象分发目标弹幕消息之前,需要获取该目标弹幕接收对象的目标分发重试次数。获取过程为:弹幕分发对象以目标弹幕接收对象的目标哈希码值为函数输入参数,调用map集合的值获取函数,即map.getValue(viewHashCode),获得函数返回值。并进一步将该函数返回值与设定的诸如null的异常标识进行比较,以判断该函数返回值是否是异常标识。若是,则执行S306;若否,则执行S307。
S306、弹幕分发对象确定目标分发重试次数为0,且调用map集合的元素插入函数,将目标哈希码值和数值1存入map集合。
具体地,如果上述函数返回值为异常标识,说明该目标弹幕接收对象还未进行过重试分发,则将目标分发重试次数确定为0。这时,该目标弹幕接收对象可以执行后续的弹幕消息重试分发,则需要将其分发重试次数存储至map集合,存储过程为:以该目标弹幕接收对象的目标哈希码值和数值1为函数输入参数,调用map集合的元素插入函数,即map.put(viewHashCode,1),将该目标弹幕接收对象的分发重试次数存储至map集合。
S307、弹幕分发对象将函数返回值作为目标弹幕接收对象的目标分发重试次数,并以目标哈希码值为函数输入参数,调用map集合的值设置函数,将目标分发重试次数累加1,以更新目标弹幕接收对象的分发重试次数。
具体地,如果上述函数返回值不为异常标识,说明该目标弹幕接收对象已经进行过弹幕消息重新分发,则将函数返回值确定为目标分发重试次数。之后,将map集合中的该目标弹幕接收对象的分发重试次数需要累加1。
S308、弹幕分发对象判断目标弹幕接收对象对应的目标分发重试次数是否小于预设重试次数。若是,则执行309;若否,则执行S312。
S309、弹幕分发对象依据目标消息标识确定反馈弹幕消息的原生数据类型,并将反馈弹幕消息转换为原生数据类型,获得目标弹幕消息。
具体地,弹幕分发对象重试分发弹幕消息之前,需要将接收到的失败反馈消息中的反馈弹幕消息的数据类型由Object类型转换为其原本的数据类型(即原生数据类型)。具体实施时,弹幕分发对象中预先存储各个消息标识及原生数据类型之间的数据类型映射关系,当接收到失败反馈消息后,弹幕分发对象先根据目标消息标识从数据类型映射关系中查找到反馈弹幕消息的原生数据类型,再将反馈弹幕消息由Object类型强制类型转换为原生数据类型,便可获得目标弹幕消息。
S310、弹幕分发对象从已开辟线程中确定一个线程,或者重新开辟一个新线程,作为重试线程。
具体是,弹幕分发对象确定重试线程时是选择空闲线程,而该空闲线程既可以是已经开辟的已有线程,也可以是新开辟的新线程。
S311、弹幕分发对象利用重试线程,基于弹幕消息分发机制,重新将目标弹幕消息分发至目标弹幕接收对象。
S312、弹幕分发对象丢弃目标弹幕消息,并释放目标弹幕接收对象的目标分发重试次数、目标反馈通道和目标分发通道。
具体地,当目标弹幕接收对象的目标分发重试次数等于或大于预设重试次数时,便不再对该目标弹幕消息进行重新分发,此时弹幕分发对象会丢弃该目标弹幕消息,同时将该目标弹幕接收对象释放,后续不再向其分发弹幕消息。释放目标弹幕接收对象的过程为:将该目标弹幕接收对象的目标哈希码值viewHashCode从上述map集合中删除,以释放目标弹幕接收对象的目标分发重试次数;以空对象null为函数输入参数,通过目标弹幕接收对象调用其内的对象设置函数setResponse(null),将一个空对象传递到目标弹幕接收对象中,以释放该目标弹幕接收对象的目标反馈通道;以该目标弹幕接收对象的目标哈希码值viewHashCode为函数输入参数,调用对象集合的元素删除函数remove(),将该目标弹幕接收对象从对象集合中删除,以释放该目标弹幕接收对象的目标分发通道。该过程中,目标反馈通道的释放在目标分发通道的释放之前执行,而目标分发重试次数的释放则可以在目标反馈通道的释放之前执行,也可以在其之后执行。
本实施例的技术方案,通过将多线程弹幕分发条件设置为消息并发定时器的当前定时周期到达,使得弹幕消息并行分发的触发条件更加常态化,避免了因触发条件无法满足而使得弹幕消息无法及时分发的问题,进一步提高弹幕消息分发的时效性。通过将当前系统状态参数值确定为当前CPU占用率,并利用当前CPU占用率与当前并发数量之间的并发数量求解公式确定当前并发数量,提高了当前并发数量确定的准确性,从而进一步提高弹幕消息分发效率。在反馈通道未构建时,通过目标弹幕接收对象内部维护消息处理集合来实现弹幕消息的重试处理,扩展了弹幕消息重试机制的实现方式,提高了弹幕消息重试处理的概率。在反馈通道成功构建时,通过存储弹幕接收对象的哈希码值和分发重试次数的map集合来维护各个弹幕接收对象的分发重试次数,提高了分发重试次数的管理效率,进一步提高了弹幕消息重试分发的效率。通过弹幕分发对象依据目标消息标识确定反馈弹幕消息的原生数据类型,并将反馈弹幕消息转换为原生数据类型,获得目标弹幕消息,进一步提高了弹幕消息重试分发的实现效率。通过弹幕分发对象从已开辟线程中确定一个线程或者重新开辟一个新线程作为重试线程,充分利用了已开辟线程,减少了线程开辟与释放的次数,从而减少了系统功耗,进一步提高了弹幕消息重试分发的分发效率。
实施例四
本实施例提供一种基于重试机制的弹幕分发装置,参见图4,该装置具体包括弹幕分发模块410,该弹幕分发模块410包括并发弹幕及线程确定单元411、弹幕并行分发单元412、重试弹幕及线程确定单元413和弹幕重试分发单元414;
并发弹幕及线程确定单元411,用于在满足多线程弹幕分发条件时,依据当前系统状态参数值确定弹幕消息的当前并发数量,并从消息集合中获取当前并发数量的待分发弹幕消息,以及确定当前并发数量的分发线程;
弹幕并行分发单元412,用于利用各个分发线程,基于弹幕消息分发机制,将各个待分发弹幕消息并行分发至与各个待分发弹幕消息一一对应的各个第一弹幕接收对象;
重试弹幕及线程确定单元413,用于若通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息,则针对每个目标弹幕接收对象,在目标弹幕接收对象对应的目标分发重试次数小于预设重试次数时,弹幕分发对象确定目标弹幕接收对象对应的目标弹幕消息及重试线程;
弹幕重试分发单元414,用于弹幕分发对象利用重试线程,基于弹幕消息分发机制,重新将目标弹幕消息分发至目标弹幕接收对象。
可选地,满足多线程弹幕分发条件包括:消息并发定时器的当前定时周期到达,其中,当前定时周期依据当前并发数量的上一个历史并发数量确定。
可选地,并发弹幕及线程确定单元411具体用于:
当系统状态参数为当前CPU占用率时,弹幕分发对象依据当前CPU占用率和预先设定的并发数量求解公式确定当前并发数量。
可选地,弹幕消息分发机制包括:
弹幕分发对象依据弹幕消息的消息标识,从对象集合中获取与消息标识对应的第二弹幕接收对象,其中,对象集合存储继承了预先定义的弹幕分发协议的弹幕接收对象,弹幕分发协议为具有公有权限标识符的接口类型的协议;
弹幕分发对象依据弹幕分发协议,将第二弹幕接收对象转换为弹幕分发协议类型的对象,作为目标接收对象;
弹幕分发对象以弹幕消息为函数输入参数,通过目标接收对象调用弹幕分发函数,将弹幕消息分发至目标接收对象,其中,弹幕分发函数为弹幕分发协议的内部函数。
可选地,重试弹幕及线程确定单元413包括反馈消息获取子单元;在上述装置的基础上,该装置还包括弹幕接收模块420,该弹幕接收模块420包括消息反馈单元;
消息反馈单元,用于每个目标弹幕接收对象以整型类型的目标哈希码值、转换为祖先类Object类型的反馈弹幕消息和字符串类型的目标消息标识为函数输入参数,通过预先持有的弹幕分发对象调用反馈函数,将失败反馈消息发送至弹幕分发对象,其中,反馈函数为弹幕分发对象基于预先定义的反馈协议而获得,反馈协议为具有公有权限标识符的接口类型的协议;
反馈消息获取子单元,用于通过回调反馈函数,获得失败反馈消息。
可选地,弹幕分发模块410还包括分发重试次数维护单元,用于:
在确定目标弹幕接收对象对应的目标分发重试次数小于预设重试次数之前,以目标弹幕接收对象的目标哈希码值为函数输入参数,调用map集合的值获取函数获得函数返回值,并判断函数返回值是否为异常标识,其中,map集合存储各个弹幕接收对象的哈希码值和分发重试次数;
若是,则确定目标分发重试次数为0,且调用map集合的元素插入函数,将目标哈希码值和数值1存入map集合;
若否,则将函数返回值作为目标弹幕接收对象的目标分发重试次数,并以目标哈希码值为函数输入参数,调用map集合的值设置函数,将目标分发重试次数累加1,以更新目标弹幕接收对象的分发重试次数。
可选地,重试弹幕及线程确定单元413具体用于:
依据目标消息标识确定反馈弹幕消息的原生数据类型,并将反馈弹幕消息转换为原生数据类型,获得目标弹幕消息;
从已开辟线程中确定一个线程,或者重新开辟一个新线程,作为重试线程。
可选地,弹幕分发模块410还包括释放单元,用于:
在目标弹幕接收对象对应的目标分发重试次数等于或大于预设重试次数时,丢弃目标弹幕消息,并释放目标弹幕接收对象的目标分发重试次数、目标反馈通道和目标分发通道。
可选地,弹幕接收模块420包括消息重试处理单元,用于:
若目标弹幕消息处理失败,且检测到反馈通道未构建,则各个目标弹幕接收对象将目标弹幕消息按序缓存至消息处理集合,并在接收到下一条待分发弹幕消息时,将该下一条待分发弹幕消息按序缓存至消息处理集合,且从消息处理集合中按序获取缓存弹幕消息进行处理。
通过本发明实施例四的一种基于重试机制的弹幕分发装置,实现了至少一个弹幕消息处理失败时的多线程并行的消息重试机制,有效减少了弹幕消息的丢失率,并提高了弹幕消息重试分发的分发效率和有效性。
本发明实施例所提供的基于重试机制的弹幕分发装置可执行本发明任意实施例所提供的基于重试机制的弹幕分发方法,具备执行方法相应的功能模块和有益效果。
实施例五
参见图5,本实施例提供了一种设备500,其包括:一个或多个处理器520;存储装置510,用于存储一个或多个程序,当一个或多个程序被一个或多个处理器520执行,使得一个或多个处理器520实现本发明实施例所提供的基于重试机制的弹幕分发方法。
图5显示的设备500仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。如图5所示,该设备500包括处理器520、存储装置510、输入装置530和输出装置540;设备中处理器520的数量可以是一个或多个,图5中以一个处理器520为例;设备中的处理器520、存储装置510、输入装置530和输出装置540可以通过总线或其他方式连接,图5中以通过总线550连接为例。
存储装置510作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的基于重试机制的弹幕分发方法对应的程序指令/模块。存储装置510可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储装置510可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储装置510可进一步包括相对于处理器520远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
输入装置530可用于接收输入的数字或字符信息,以及产生与设备的用户设置以及功能控制有关的键信号输入。输出装置540可包括显示屏等显示设备。
实施例六
本实施例提供一种包含计算机可执行指令的存储介质,计算机可执行指令在由计算机处理器执行时用于执行本发明任意实施例所提供的一种基于重试机制的弹幕分发方法。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所提供的基于重试机制的弹幕分发方法。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (10)
1.一种基于重试机制的弹幕分发方法,其特征在于,包括:
在满足多线程弹幕分发条件时,弹幕分发对象依据当前系统状态参数值确定弹幕消息的当前并发数量,并从消息集合中获取所述当前并发数量的待分发弹幕消息,以及确定所述当前并发数量的分发线程;
所述弹幕分发对象利用各个所述分发线程,基于弹幕消息分发机制,将各个所述待分发弹幕消息并行分发至与各个所述待分发弹幕消息一一对应的各个第一弹幕接收对象;
若所述弹幕分发对象通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息,则针对每个目标弹幕接收对象,在所述目标弹幕接收对象对应的目标分发重试次数小于预设重试次数时,所述弹幕分发对象确定所述目标弹幕接收对象对应的目标弹幕消息及重试线程;其中,所述目标弹幕接收对象为反馈了失败反馈信息的第一弹幕接收对象;所述目标弹幕消息为发送失败的待分发弹幕消息;
所述弹幕分发对象利用所述重试线程,基于所述弹幕消息分发机制,重新将所述目标弹幕消息分发至所述目标弹幕接收对象;
其中,所述反馈通道的构建过程为:弹幕分发类基于预先定义的反馈协议获得弹幕分发对象;弹幕分发对象从对象集合中获取各个弹幕接收对象,并以弹幕分发对象为函数输入参数,分别调用各个弹幕接收对象中的对象设置函数,将弹幕分发对象注册至各个弹幕接收对象,以使各个弹幕接收对象持有弹幕分发对象。
2.根据权利要求1所述的方法,其特征在于,所述满足多线程弹幕分发条件包括:消息并发定时器的当前定时周期到达,其中,所述当前定时周期依据所述当前并发数量的上一个历史并发数量确定。
3.根据权利要求1所述的方法,其特征在于,所述依据当前系统状态参数值确定弹幕消息的当前并发数量包括:
当系统状态参数为当前CPU占用率时,所述弹幕分发对象依据所述当前CPU占用率和预先设定的并发数量求解公式确定所述当前并发数量。
4.根据权利要求1所述的方法,其特征在于,所述弹幕消息分发机制包括:
所述弹幕分发对象依据弹幕消息的消息标识,从对象集合中获取与所述消息标识对应的第二弹幕接收对象,其中,所述对象集合存储继承了预先定义的弹幕分发协议的弹幕接收对象,所述弹幕分发协议为具有公有权限标识符的接口类型的协议;
所述弹幕分发对象依据所述弹幕分发协议,将所述第二弹幕接收对象转换为弹幕分发协议类型的对象,作为目标接收对象;
所述弹幕分发对象以所述弹幕消息为函数输入参数,通过所述目标接收对象调用弹幕分发函数,将所述弹幕消息分发至所述目标接收对象,其中,所述弹幕分发函数为所述弹幕分发协议的内部函数。
5.根据权利要求1所述的方法,其特征在于,所述弹幕分发对象通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息包括:
每个所述目标弹幕接收对象以整型类型的目标哈希码值、转换为祖先类Object类型的反馈弹幕消息和字符串类型的目标消息标识为函数输入参数,通过预先持有的所述弹幕分发对象调用反馈函数,将所述失败反馈消息发送至所述弹幕分发对象,其中,所述反馈函数为所述弹幕分发对象基于预先定义的反馈协议而获得,所述反馈协议为具有公有权限标识符的接口类型的协议;
所述弹幕分发对象通过回调所述反馈函数,获得所述失败反馈消息。
6.根据权利要求1所述的方法,其特征在于,在确定所述目标弹幕接收对象对应的目标分发重试次数小于预设重试次数之前,还包括:
所述弹幕分发对象以所述目标弹幕接收对象的目标哈希码值为函数输入参数,调用map集合的值,获取函数获得函数返回值,并判断所述函数返回值是否为异常标识,其中,所述map集合存储各个弹幕接收对象的哈希码值和分发重试次数;
若是,则所述弹幕分发对象确定所述目标分发重试次数为0,且调用所述map集合的元素插入函数,将所述目标哈希码值和数值1存入所述map集合;
若否,则所述弹幕分发对象将所述函数返回值作为所述目标弹幕接收对象的目标分发重试次数,并以所述目标哈希码值为函数输入参数,调用所述map集合的值设置函数,将所述目标分发重试次数累加1,以更新所述目标弹幕接收对象的分发重试次数。
7.根据权利要求5所述的方法,其特征在于,若所述目标弹幕消息处理失败,且检测到反馈通道未构建,则各个目标弹幕接收对象将所述目标弹幕消息按序缓存至消息处理集合,并在接收到下一条待分发弹幕消息时,将该下一条待分发弹幕消息按序缓存至所述消息处理集合,且从所述消息处理集合中按序获取缓存弹幕消息进行处理。
8.一种基于重试机制的弹幕分发装置,其特征在于,包括弹幕分发模块,所述弹幕分发模块包括并发弹幕及线程确定单元、弹幕并行分发单元、重试弹幕及线程确定单元和弹幕重试分发单元;
所述并发弹幕及线程确定单元,用于在满足多线程弹幕分发条件时,依据当前系统状态参数值确定弹幕消息的当前并发数量,并从消息集合中获取当前并发数量的待分发弹幕消息,以及确定当前并发数量的分发线程;
所述弹幕并行分发单元,用于利用各个分发线程,基于弹幕消息分发机制,将各个待分发弹幕消息并行分发至与各个待分发弹幕消息一一对应的各个第一弹幕接收对象;
所述重试弹幕及线程确定单元,用于若通过预先构建的反馈通道接收到各个目标弹幕接收对象发送的失败反馈消息,则针对每个目标弹幕接收对象,在目标弹幕接收对象对应的目标分发重试次数小于预设重试次数时,弹幕分发对象确定目标弹幕接收对象对应的目标弹幕消息及重试线程;其中,所述目标弹幕接收对象为反馈了失败反馈信息的第一弹幕接收对象;所述目标弹幕消息为发送失败的待分发弹幕消息;
所述弹幕重试分发单元,用于弹幕分发对象利用重试线程,基于弹幕消息分发机制,重新将目标弹幕消息分发至目标弹幕接收对象;
其中,所述反馈通道的构建过程为:弹幕分发类基于预先定义的反馈协议获得弹幕分发对象;弹幕分发对象从对象集合中获取各个弹幕接收对象,并以弹幕分发对象为函数输入参数,分别调用各个弹幕接收对象中的对象设置函数,将弹幕分发对象注册至各个弹幕接收对象,以使各个弹幕接收对象持有弹幕分发对象。
9.一种设备,其特征在于,所述设备包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-7中任一所述的基于重试机制的弹幕分发方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-7中任一所述的基于重试机制的弹幕分发方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811151400.7A CN109309848B (zh) | 2018-09-29 | 2018-09-29 | 基于重试机制的弹幕分发方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811151400.7A CN109309848B (zh) | 2018-09-29 | 2018-09-29 | 基于重试机制的弹幕分发方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109309848A CN109309848A (zh) | 2019-02-05 |
CN109309848B true CN109309848B (zh) | 2021-02-02 |
Family
ID=65225021
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811151400.7A Active CN109309848B (zh) | 2018-09-29 | 2018-09-29 | 基于重试机制的弹幕分发方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109309848B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112565824B (zh) * | 2020-12-03 | 2021-09-14 | 腾讯科技(深圳)有限公司 | 一种生成弹幕的方法、装置、终端及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5430850A (en) * | 1991-07-22 | 1995-07-04 | Massachusetts Institute Of Technology | Data processing system with synchronization coprocessor for multiple threads |
CN1411182A (zh) * | 2001-09-27 | 2003-04-16 | 华为技术有限公司 | 基于混合自动重传机制的功率控制方法 |
CN101188570A (zh) * | 2006-11-17 | 2008-05-28 | 鸿富锦精密工业(深圳)有限公司 | 即时消息处理系统及方法 |
CN107908494A (zh) * | 2017-11-10 | 2018-04-13 | 泰康保险集团股份有限公司 | 异常事件的处理方法、装置、电子设备及存储介质 |
CN108023808A (zh) * | 2017-12-07 | 2018-05-11 | 深圳乐信软件技术有限公司 | 应用程序中的消息分发方法及装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100334856C (zh) * | 2004-08-02 | 2007-08-29 | 华为技术有限公司 | 级联通信网的通信保证方法 |
CN101616365B (zh) * | 2008-06-24 | 2012-12-05 | 中兴通讯股份有限公司 | 一种基于并行队列的短消息重试系统及方法 |
CN106162216A (zh) * | 2016-07-15 | 2016-11-23 | 天脉聚源(北京)传媒科技有限公司 | 协助播放器下载多媒体资源的方法和本地代理服务装置 |
-
2018
- 2018-09-29 CN CN201811151400.7A patent/CN109309848B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5430850A (en) * | 1991-07-22 | 1995-07-04 | Massachusetts Institute Of Technology | Data processing system with synchronization coprocessor for multiple threads |
CN1411182A (zh) * | 2001-09-27 | 2003-04-16 | 华为技术有限公司 | 基于混合自动重传机制的功率控制方法 |
CN101188570A (zh) * | 2006-11-17 | 2008-05-28 | 鸿富锦精密工业(深圳)有限公司 | 即时消息处理系统及方法 |
CN107908494A (zh) * | 2017-11-10 | 2018-04-13 | 泰康保险集团股份有限公司 | 异常事件的处理方法、装置、电子设备及存储介质 |
CN108023808A (zh) * | 2017-12-07 | 2018-05-11 | 深圳乐信软件技术有限公司 | 应用程序中的消息分发方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN109309848A (zh) | 2019-02-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109413502B (zh) | 多线程弹幕消息分发方法、装置、设备及存储介质 | |
CN109246229B (zh) | 一种分发资源获取请求的方法和装置 | |
WO2021098138A1 (zh) | 运行控制方法、装置、家电设备以及存储介质 | |
CN109274730B (zh) | 物联网系统、mqtt消息传输的优化方法及装置 | |
CN106161511B (zh) | 业务请求处理方法、相关装置及系统 | |
CN110633442A (zh) | 一种推送方法、装置及电子设备 | |
US20200192729A1 (en) | Broadcast Control Method And Apparatus, And Terminal | |
CN111565154B (zh) | 图像识别请求处理方法、装置、计算机设备和存储介质 | |
CN109062650B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN109309848B (zh) | 基于重试机制的弹幕分发方法、装置、设备及存储介质 | |
CN110365786B (zh) | 作业处理系统、异步作业调度方法和计算机设备 | |
CN109005465B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN108810645B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN109274988B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN109413489B (zh) | 串行式的多线程弹幕分发方法、装置、设备和存储介质 | |
CN109379605B (zh) | 基于弹幕顺序的弹幕分发方法、装置、设备和存储介质 | |
CN109089163B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN109246470B (zh) | 多线程同步的弹幕分发方法、装置、设备及存储介质 | |
CN109101340B (zh) | 弹幕消息的动态分发方法、装置、设备和存储介质 | |
CN111475315A (zh) | 服务器及订阅通知推送控制、执行方法 | |
CN109086107B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN108881991B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN106790632B (zh) | 一种流数据的并发传输方法和装置 | |
CN109144639B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN111309467B (zh) | 任务分发方法及装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |