数据处理方法、装置、计算机可读介质及电子设备与流程

文档序号:26847270发布日期:2021-10-09 00:48阅读:88来源:国知局
数据处理方法、装置、计算机可读介质及电子设备与流程

1.本技术属于计算机技术领域,具体涉及一种数据处理方法、数据处理装置、计算机可读介质以及电子设备。


背景技术:

2.为了满足大量用户的应用需求,一般需要通过负载均衡系统将用户的请求分配到不同的服务器上进行处理,以防止因用户请求集中冲击某个服务器而导致服务器瘫痪。然而,由于各个服务器的工作状态和性能各不相同,服务器对于用户请求的处理能力也存在差异,如果无法及时有效地进行请求调度,则仍然会出现请求堵塞的问题。


技术实现要素:

3.本技术的目的在于提供一种数据处理方法、数据处理装置、计算机可读介质以及电子设备,至少在一定程度上克服相关技术中存在的用户请求处理效率低的技术问题。
4.本技术的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本技术的实践而习得。
5.根据本技术实施例的一个方面,提供一种数据处理方法,该方法包括:获取服务器集群的双权值列表,所述双权值列表包括用于写入流量分配权值的第一权值列表和用于读取流量分配权值的第二权值列表,所述流量分配权值用于确定向所述服务器集群中的各个服务器分配流量的分配比例;分别统计所述服务器集群中的各个服务器的性能参数,所述性能参数用于表示所述服务器的流量吞吐性能;根据所述性能参数确定所述服务器的流量分配权值,并将所述服务器的流量分配权值实时写入所述第一权值列表;当满足列表更新条件时,根据所述第一权值列表更新所述第二权值列表;从更新后的第二权值列表中读取流量分配权值,以根据读取到的流量分配权值向所述服务器集群中的各个服务器分配流量。
6.根据本技术实施例的一个方面,提供一种数据处理装置,该装置包括:获取模块,被配置为获取服务器集群的双权值列表,所述双权值列表包括用于写入流量分配权值的第一权值列表和用于读取流量分配权值的第二权值列表,所述流量分配权值用于确定向所述服务器集群中的各个服务器分配流量的分配比例;统计模块,被配置为分别统计所述服务器集群中的各个服务器的性能参数,所述性能参数用于表示所述服务器的流量吞吐性能;写入模块,被配置为根据所述性能参数确定所述服务器的流量分配权值,并将所述服务器的流量分配权值实时写入所述第一权值列表;更新模块,被配置为当满足列表更新条件时,根据所述第一权值列表更新所述第二权值列表;读取模块,被配置为从更新后的第二权值列表中读取流量分配权值,以根据读取到的流量分配权值向所述服务器集群中的各个服务器分配流量。
7.在本技术的一些实施例中,基于以上技术方案,所述更新模块包括:进程获取模块,被配置为获取用于更新所述双权值列表的数据写入进程以及用于从所述双权值列表读
取流量分配权值的数据读取进程;共享锁释放模块,被配置为若所述数据读取进程持有所述第二权值列表的共享锁,则通过所述数据写入进程释放所述共享锁;列表更新模块,被配置为根据所述第一权值列表更新释放所述共享锁后的第二权值列表。
8.在本技术的一些实施例中,基于以上技术方案,所述列表更新模块被配置为:获取所述第一权值列表指向的第一内存地址以及释放所述共享锁后的第二权值列表指向的第二内存地址;将释放所述共享锁后的第二权值列表更新为指向所述第一内存地址,并将所述第一权值列表更新为指向所述第二内存地址。
9.在本技术的一些实施例中,基于以上技术方案,所述列表更新模块被配置为:获取所述第一权值列表指向的第一内存地址以及释放所述共享锁后的第二权值列表指向的第二内存地址;复制所述第一内存地址中记录的流量分配权值,并使用所复制的流量分配权值覆盖所述第二内存地址中记录的流量分配权值。
10.在本技术的一些实施例中,基于以上技术方案,所述读取模块被配置为:通过所述数据读取进程申请获取更新后的所述第二权值列表的共享锁;通过持有所述共享锁的数据读取进程从更新后的所述第二权值列表中读取流量分配权值。
11.在本技术的一些实施例中,基于以上技术方案,所述性能参数包括吞吐量和延迟时间,所述吞吐量用于表示服务器在单位时间内处理的业务请求的平均数量,所述延迟时间用于表示服务器处理业务请求的平均时长;所述流量分配权值与所述吞吐量呈正相关关系,并且与所述延迟时间呈负相关关系。
12.在本技术的一些实施例中,基于以上技术方案,分别统计服务器集群中的各个服务器的性能参数,包括:实时监测并记录服务器集群中的各个服务器处理业务请求的数量和时间;在与当前时间节点相对应的历史时间窗口内统计所述业务请求的处理数量和处理时长;根据所述历史时间窗口内统计的所述业务请求的处理数量和所述历史时间窗口的窗口容量确定所述服务器在当前时间节点的吞吐量;根据所述历史时间窗口内统计的所述业务请求的处理时长确定所述服务器在当前时间节点的延迟时间。
13.在本技术的一些实施例中,基于以上技术方案,所述列表更新条件包括定时条件和阈值条件中的至少一种;所述定时条件包括当前时间节点与上一次更新的时间节点之间的时间差达到预设的间隔时长,所述阈值条件包括所述第一权值列表与所述第二权值列表之间的数值差异达到预设的差异阈值。
14.在本技术的一些实施例中,基于以上技术方案,确定是否满足所述列表更新条件的方法包括:若所述当前时间节点满足所述定时条件和所述阈值条件中的任意一个,则确定所述当前时间节点满足所述列表更新条件。
15.在本技术的一些实施例中,基于以上技术方案,确定是否满足所述列表更新条件的方法包括:统计预设时间周期内的业务请求的变化量;若所述变化量小于设定的数量阈值,则将所述定时条件作为列表更新条件,以确定当前时间节点是否满足所述定时条件;若所述变化量大于或等于所述数量阈值,则将所述阈值条件作为列表更新条件,以确定当前时间节点是否满足所述阈值条件。
16.在本技术的一些实施例中,基于以上技术方案,确定是否满足所述列表更新条件的方法包括:若当前时间节点处于设定的第一时间范围,则将所述定时条件作为列表更新条件,以确定当前时间节点是否满足所述定时条件;若当前时间节点处于与所述第一时间
范围不同的第二时间范围,则将所述阈值条件作为列表更新条件,以确定当前时间节点是否满足所述阈值条件。
17.在本技术的一些实施例中,基于以上技术方案,确定是否满足阈值条件的方法包括:实时获取同一服务器在所述第一权值列表与所述第二权值列表中记录的流量分配权值的差值;将各个所述服务器的所述差值的平方和作为所述第一权值列表与所述第二权值列表的数值差异;若所述数值差异大于与业务请求类型相关的差异阈值,则确定满足阈值条件;若所述数值差异小于或等于所述差异阈值,则确定不满足所述阈值条件。
18.根据本技术实施例的一个方面,提供一种计算机可读介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如以上技术方案中的数据处理方法。
19.根据本技术实施例的一个方面,提供一种电子设备,该电子设备包括:处理器;以及存储器,用于存储所述处理器的可执行指令;其中,所述处理器被配置为经由执行所述可执行指令来执行如以上技术方案中的数据处理方法。
20.根据本技术实施例的一个方面,提供一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行如以上技术方案中的数据处理方法。
21.在本技术实施例提供的技术方案中,通过统计各个服务器的性能参数,可以为各个服务器确定相应的流量分配权值,按照流量分配权值为各个服务器分配流量,能够适应动态变化的服务器性能。由于每个服务器的流量吞吐性能都在持续变化,本技术实施例利用异步更新的前台权值列表和后台权值列表将服务器的性能参数统计和流量分配过程实现并行化,从而能够及时高效地对流量分配权值进行更新,进而在复杂的服务器部署环境中合理分配流量,提高用户请求的处理效率。
22.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本技术。
附图说明
23.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本技术的实施例,并与说明书一起用于解释本技术的原理。显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
24.图1示意性地示出了应用本技术技术方案的示例性系统架构框图。
25.图2示意性地示出了本技术一个实施例中的数据处理方法的步骤流程图。
26.图3示意性地示出了本技术一个实施例中统计服务器性能参数的方法步骤流程图。
27.图4示意性地示出了延迟时间latency与吞吐量qps之间的变化关系图。
28.图5示意性地示出了本技术一个实施例中异步更新双权值列表的方法步骤流程图。
29.图6示意性地示出了本技术一个实施例中基于随机算法结合流量分配权值进行流量分配的原理图。
client),同时在服务器上可以安装游戏服务器(game server)。游戏客户端是为用户提供本地服务的软件程序,一般安装在普通的用户电脑上,需要与游戏服务器互相配合运行。游戏服务器上可以安装为游戏客户端提供数据计算、校验、存储和转发功能的服务软件程序,需要由游戏开发商保证其稳定运作和正常的服务功能。
43.由于游戏玩家数量众多,尤其是大型多人在线角色扮演类游戏(massive muti

player online role playing game,mmorpg),在游戏福利活动开启时,大量用户请求冲击服务器,服务器需要通过负载均衡系统将大量流量均匀分配到不同的服务器机器上进行处理,防止流量集中冲击某个服务器,导致服务器瘫痪。
44.在本技术的相关技术中,实现负载均衡的前提是服务器的机器配置和网络带宽都是相似的,但在目前的复杂的线上环境下,特别是多个部门合作的产品线中,相似服务器条件已经很难成立,因为每台服务器运行着不同的程序组合,并伴随着一些混合任务,服务器的可用资源在持续动态地变化着。因此,在多种因素的动态影响下,如果不能及时有效地进行请求调配,将导致各个服务器之间出现负载不均的问题。
45.针对本技术的相关技术中存在的服务器负载不均衡的问题,本技术实施例提供了一种基于双权值列表的低延时负载均衡系统,可以将用户请求及时、自动地发送到处理延时最低的服务器中,尤其适合用于复杂的服务器部署环境中。本技术实施例解决了在服务器机器配置不同、访问延时不同的情况下,用户流量分流不佳的问题。在复杂的服务器部署环境中,各服务器性能难以预测,本技术实施例可以自启发地将用户请求发送至延时最低的服务器,充分利用服务器资源。
46.下面结合具体实施方式对本技术提供的数据处理方法、数据处理装置、计算机可读介质以及电子设备等技术方案做出详细说明。
47.图2示意性地示出了本技术一个实施例中的数据处理方法的步骤流程图,该数据处理方法由图1所示的服务器执行。如图2所示,该数据处理方法主要可以包括如下的步骤s210至步骤s250。
48.步骤s210:获取服务器集群的双权值列表,双权值列表包括用于写入流量分配权值的第一权值列表和用于读取流量分配权值的第二权值列表,流量分配权值用于确定向服务器集群中的各个服务器分配流量的分配比例;
49.步骤s220:分别统计服务器集群中的各个服务器的性能参数,性能参数用于表示服务器的流量吞吐性能;
50.步骤s230:根据性能参数确定服务器的流量分配权值,并将服务器的流量分配权值实时写入第一权值列表;
51.步骤s240:当满足列表更新条件时,根据第一权值列表更新第二权值列表;
52.步骤s250:从更新后的第二权值列表中读取流量分配权值,以根据读取到的流量分配权值向服务器集群中的各个服务器分配流量。在本技术实施例提供的数据处理方法中,通过统计各个服务器的性能参数,可以为各个服务器确定相应的流量分配权值,按照流量分配权值为各个服务器分配流量,能够适应动态变化的服务器性能。由于每个服务器的流量吞吐性能都在持续变化,本技术实施例利用双权值列表将服务器的性能参数统计和流量分配过程实现并行化,从而能够及时高效地对流量分配权值进行更新,进而在复杂的服务器部署环境中合理分配流量,提高用户请求的处理效率。
53.以下结合多个实施例对该数据处理方法中各个方法步骤的实现方案做详细说明。
54.在步骤s210中,获取服务器集群的双权值列表,双权值列表包括用于写入流量分配权值的第一权值列表和用于读取流量分配权值的第二权值列表,流量分配权值用于确定向服务器集群中的各个服务器分配流量的分配比例。
55.以网络游戏的应用场景为例,对于规模较大的mmorpg来说,服务器通常会部署在多个数据中心里。每个数据中心会集中部署大量服务器,这些服务器通常被作为一个整体来集中管理。游戏服务器可以为游戏客户端提供数据计算、校验、存储和转发功能的服务软件程序,需游戏开发商保证其稳定运作和正常的服务功能。
56.在本技术的一个实施例中,按照不同的服务功能组织多种不同类型的服务器集群。例如,登录服务器集群,用于提供登录验证服务,在游戏用户数量较大时也会提供登录排队服务。前端服务器集群,相当于客户端和服务器端间的防火墙,提供包的验证、过滤、汇聚和分发功能。数据服务器集群,提供游戏全局数据存取,如帐号信息等,通常底层由成熟的数据库支持。消息服务器集群,主要提供聊天、系统广播等即时消息服务,也可以提供类似信箱等非即时消息服务。游戏场景服务器集群,用于提供包括集市、pvp副本、pve副本等游戏世界内的场景服务。按照不同类型的游戏场景,也可以进行场景服务器集群的分区,主要用于支持同一场景中容纳巨量玩家,可以根据区域进行几何划分,也可以根据玩家关联程度等其他特性划分。
57.在本技术的一个实施例中,针对每个服务器集群可以维护一个与之对应的双权值列表,用以进行用户流量的负载均衡。双权值列表包括用于写入流量分配权值的第一权值列表和用于读取流量分配权值的第二权值列表,流量分配权值用于确定向服务器集群中的各个服务器分配流量的分配比例。随着时间推移,服务器集群中的每个服务器的负载情况和服务性能都会出现不同程度的差异,因此需要对双权值列表进行及时更新,以保持服务器集群的整体服务能力。在本技术实施例中,通过配置双权值列表,可以将流量分配权值的写入操作与读取操作进行分离,实现流量分配权值的异步更新。
58.在步骤s220:分别统计服务器集群中的各个服务器的性能参数,性能参数是用于表示服务器的流量吞吐性能的参数。
59.在本技术的一个实施例中,服务器的性能参数可以包括吞吐量和延迟时间,吞吐量用于表示服务器在单位时间内处理的业务请求的平均数量,延迟时间用于表示服务器处理业务请求的平均时长。
60.图3示意性地示出了本技术一个实施例中统计服务器性能参数的方法步骤流程图。如图3所示,在以上实施例的基础上,步骤s210中分别统计服务器集群中的各个服务器的性能参数,可以包括如下的步骤s310至步骤s340。
61.步骤s310:实时监测并记录服务器集群中的各个服务器处理业务请求的数量和时间。
62.用户在使用客户端处理实际业务时,可以根据业务需求向服务器发起业务请求,该业务请求被分配至服务器集群中的某一个或者某几个服务器,使得服务器对业务请求进行处理,并在处理完成后向请求方返回业务请求的处理结果。
63.在本技术的一个实施例中,服务器集群中的每个服务器可以实时监测自身业务请求的处理状态,每当完成一个业务请求时,便可增加一个业务请求的数量记录。与此同时,
服务器会记录接收到业务请求的时间以及向请求方返回业务请求处理结果的时间,两个时间之间的差值即可记录为服务器处理业务请求的时间。
64.在本技术的一个实施例中,服务器集群中也可以配置一个或者多个监测服务器,监测服务器可以实时监测服务器集群中每个服务器的业务请求处理状态,从而在监测服务器上记录各个服务器处理业务请求的数量和时间。
65.步骤s320:在与当前时间节点相对应的历史时间窗口内统计业务请求的处理数量和处理时长。
66.历史时间窗口是与当前时间节点相对应的滑动窗口,在当前时间节点不断向前推移时,历史时间窗口也跟随当前时间节点向前推移。根据实时监测和记录的服务器处理业务请求的数量和时间可以在历史时间窗口内统计每个服务器对应的业务请求的处理数量和处理时长,其中业务请求的处理数量表示服务器在历史时间窗口内处理完成的业务请求总数,业务请求的处理时长表示在历史时间窗口内处理每个业务请求所消耗的时间。
67.在本技术的一个实施例中,历史时间窗口是具有固定窗口容量的滑动窗口,例如历史时间窗口对应一个时间长度为128秒的历史时间段。本技术实施例使用一个较小的统计窗口,能够及时纠正过度反应。在真实生产环境中,服务器跳变延时的情况很少,大都是缓缓变慢,因此使用一个具有一定时间长度的历史时间窗口进行数据统计,能够在一定程度上提高统计可信度。
68.在本技术的一个实施例中,历史时间窗口的窗口容量与服务器集群中的服务器数量呈正相关关系。举例而言,当服务器集群中的服务器数量大于预设的数量阈值时,将历史时间窗口的窗口容量配置为第一数值;当服务器集群中的服务器数量小于或等于预设的数量阈值时,将历史时间窗口的窗口容量配置为第二数值;其中,第二数值小于第一数值。
69.当服务器集群中仅有很少量的服务器时,可以设置一个相对较小的历史时间窗口,从而在较短的时间内统计各个服务器的相关数据,提高数据统计的实时有效性。当服务器集群中具有大量的服务器时,可以设置一个相对较大的历史时间窗口,从而服务器在一段较长时间内的统计结果,提高统计准确性。
70.步骤s330:根据历史时间窗口内统计的业务请求的处理数量和历史时间窗口的窗口容量确定服务器在当前时间节点的吞吐量。
71.在历史时间窗口内,将统计的业务请求的数量与历史时间窗口的窗口容量计算比值,可以得出服务器在单位时间内能够处理的业务请求数量,根据该业务请求数量可以预测服务器在当前时间节点的吞吐量。
72.步骤s340:根据历史时间窗口内统计的业务请求的处理数量和处理时长确定服务器在当前时间节点的延迟时间。
73.在历史时间窗口内,将各个业务请求的处理时长进行累加,可以得到服务器处理所有业务请求的等效总时长,将等效总时长与统计的业务请求的处理数量计算比值,可以得出每个业务请求的平均处理时长,根据该平均处理时长可以预测服务器在当前时间节点的延迟时间。
74.在本技术实施例中,通过在历史时间窗口内统计服务器对业务请求的处理状态,可以预测服务器在当前时间节点的性能参数,保证性能参数的统计时效性的同时,提高了性能参数的统计准确性和可信度。
75.在步骤s230中,根据性能参数确定服务器的流量分配权值,并将服务器的流量分配权值实时写入第一权值列表。
76.在本技术的一个实施例中,流量分配权值与吞吐量呈正相关关系,并且与延迟时间呈负相关关系。如果一个服务器具有较大的吞吐量,则表示该服务器能够在较短的时间内处理较多数量的业务请求,因此可以增大其流量分配权值,以便为其分配更多的流量。如果一个服务器具有较大的延迟时间,则表示该服务器处理一个业务请求需要消耗较多的时间,因此可以减小其流量分配权值,以便减少为其分配的流量,避免每个业务请求的等待时间过长。
77.在本技术的一个实施例中,可以按照如下公式计算服务器的流量分配权值。
78.w=qps/l
79.其中,w表示流量分配权值;qps表示吞吐量,即服务器每秒可以处理多少数量的业务请求;l表示延迟时间,即从业务请求方发出请求至收到服务器回复所用的时间。
80.以包括两个服务器的服务器集群作为示例,两个服务器之间的流量分配比例可以表示为:
81.w1/w2=qps1/qps2*(l2/l1)
82.在流量分配达到稳定状态时,延迟时间l1和l2是相似的,此时分流权值w与吞吐量qps成正比例关系,即w1/w2≈qps1/qps2。在流量分配未达到稳定状态时,假设l1小于l2,则w1大于w2,所以第一服务器将会获得更大的流量分配,从而在未来获得更多的流量,随着流量增大,该服务器处理各个业务请求的平均时长将会逐渐延长,直到其延迟时间l1趋近于所有服务器的流量平均值。
83.图4示意性地示出了延迟时间latency与吞吐量qps之间的变化关系图。如图4所示,曲线1表示第一服务器的延迟时间latency与吞吐量qps的关系图,曲线2表示第二服务器的延迟时间latency与吞吐量qps的关系图。由曲线的变化趋势可知,随着吞吐量增大,各个服务器的延迟时间都会逐渐升高,当吞吐量接近极限时,延迟时间也出现飙升。
84.当吞吐量qps等于400时,第一服务器的延迟时间还未高于第二服务器的基础延时(qps=0时的延时),此时所有流量都会分配给第一服务器。当qps继续上升达到1600时,分流比例会在两个服务器的延迟时间相等时达到平衡,即按照图中所示的9:7的比例为第一服务器和第二服务器分配流量。服务器之间的流量比例是高度非线性的,取决于不同曲线的组合,和单一参数指标的比例关系则没有直接关联。在真实系统中,延迟时间和吞吐量的曲线关系是在动态变化的,服务器的数量和性能也会发生变化,因此各个服务器的分流比例也将呈现更大的动态性。
85.在步骤s240中,当满足列表更新条件时,根据第一权值列表更新第二权值列表。
86.图5示意性地示出了本技术一个实施例中异步更新双权值列表的方法步骤流程图。如图5所示,在以上实施例的基础上,根据第一权值列表更新第二权值列表的方法可以包括如下的步骤s510至步骤s540。
87.步骤s510:获取与当前时间节点相对应的列表更新条件。
88.在本技术的一个实施例中,列表更新条件包括定时条件和阈值条件中的至少一种;定时条件包括当前时间节点与上一次更新的时间节点之间的时间差达到设定时长,阈值条件包括前台权值列表与后台权值列表之间的数值差异达到设定阈值。
89.在本技术的一个实施例中,若当前时间节点处于设定的第一时间范围,则将定时条件作为列表更新条件,以确定当前时间节点是否满足定时条件。若当前时间节点处于与第一时间范围不同的第二时间范围,则将阈值条件作为列表更新条件,以确定当前时间节点是否满足阈值条件。
90.在不同的时间范围内可以选择不同的条件作为列表更新条件。以morpg游戏为例,在早晨时段,游戏内热门活动较少,玩家流量均匀分布在不同的游戏玩法中,在这一时间段内,可以选择定时条件作为与当前时间节点对应的列表更新条件;而在除此以外的其他时间段内,可以选择阈值条件作为与当前时间节点相对应的列表更新条件。
91.步骤s520:获取用于更新双权值列表的数据写入进程以及用于从双权值列表读取流量分配权值的数据读取进程。
92.进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
93.在本技术的一个实施例中,针对一个双权值列表,为实现其数据写入和数据读取的并行化,本技术实施例可以为其配置相应的数据写入进程和数据读取进程,数据写入进程可以通过写入流量分配权值或者其他更新方式对双权值列表进行更新,数据读取进程可以从双权值列表中读取流量分配权值,以便根据读取到的流量分配权值向服务器集群中的各个服务器分配用户流量。
94.在本技术的一个实施例中,一个双权值列表仅包括一个与之对应的数据写入进程,通过一个单独的数据写入进程可以方便地控制双权值列表的更新权限,避免因多进程同时写入数据而产生数据冲突。
95.在本技术的一个实施例中,一个双权值列表可以包括多个与之对应的并行化的数据读取进程,通过多个并行化的数据读取进程可以同时从双权值列表中读取流量分配权值,从而能够同时向服务器集群中的多个服务器共同进行流量分配,成倍地提高流量分配的效率。
96.步骤s530:当满足列表更新条件时,若数据读取进程持有第二权值列表的共享锁,则通过数据写入进程释放共享锁。
97.为了保证流量分配权值在读取过程中不会被修改,数据读取进程可以第二权值列表添加共享锁。共享锁,又称为读锁,简称s锁,适用于不更改或者不更新数据的只读操作进程。当有至少一个数据读取进程对第二权值列表添加共享锁后,其他进程也只能对第二权值列表添加共享锁,而不能做任何修改操作,也就是不能添加排他锁(即写锁)。只有当第二权值列表上的共享锁被释放后,其他进程才能对其添加排他锁。共享锁主要是为了支持并发的读取数据而出现的,读取数据时,不允许其他事务对当前数据进行修改操作,从而避免出现“不可重读”的问题。
98.如果确定当前时间节点满足对应的列表更新条件,则可以释放数据读取进程持有的第二权值列表的共享锁,使得数据写入进程能够对第二权值列表上的流量分配权值进行更新。
99.在本技术的一个实施例中,确定当前时间节点是否满足列表更新条件的方法可以包括:分别判断当前时间节点是否满足定时条件和阈值条件,若当前时间节点满足定时条
件和阈值条件中的任意一个,则确定当前时间节点满足列表更新条件。
100.在本技术的一个实施例中,确定当前时间节点是否满足列表更新条件的方法可以包括:统计预设时间周期内的业务请求的变化量;若变化量小于设定的数量阈值,则将定时条件作为列表更新条件,以确定当前时间节点是否满足定时条件;若变化量大于或等于数量阈值,则将阈值条件作为列表更新条件,以确定当前时间节点是否满足阈值条件。
101.在本技术的一个实施例中,确定当前时间节点是否满足阈值条件的方法可以包括:实时获取同一服务器在第二权值列表与第一权值列表中记录的流量分配权值的差值;将各个服务器的差值的平方和作为第二权值列表与第一权值列表的数值差异;若数值差异大于与业务请求类型相关的差异阈值,则确定满足阈值条件;若数值差异小于或等于差异阈值,则确定不满足阈值条件。
102.举例而言,第二权值列表与第一权值列表的数值差异p按照如下公式计算。
103.p=(w2_1

w1_1)^2+(w2_2

w1_2)^2+(w2_3

w1_3)^2+

104.其中,w2_1和w1_1分别为第一服务器在第二权值列表与第一权值列表中记录的流量分配权值,w2_2和w1_2分别为第二服务器在第二权值列表与第一权值列表中记录的流量分配权值,w2_3和w1_3分别为第三服务器在第二权值列表与第一权值列表中记录的流量分配权值。
105.当数值差异p大于预设的差异阈值t时,即判定当前时间节点满足阈值条件。
106.在本技术的其他一些实施例中,第二权值列表与第一权值列表的数值差异也可以采用标准差、方差或者其他参数,本技术对此不作特殊限定。
107.步骤s540:根据第一权值列表更新释放共享锁后的第二权值列表。
108.在本技术的一个实施例中,数据写入进程释放第二权值列表上添加的所有共享锁,使得数据写入进程能够对第二权值列表进行数据更新。数据写入进程对第二权值列表进行更新的方法可以包括:获取第一权值列表指向的第一内存地址以及释放共享锁后的第二权值列表指向的第二内存地址;将释放共享锁后的第二权值列表更新为指向第一内存地址,并将第一权值列表更新为指向第二内存地址。
109.在本技术实施例中,第一权值列表存储用于指向第一内存地址的地址指针,而第二权值列表存储用于指向第二内存地址的地址指针。当数据写入进程完成释放第二权值列表上添加的共享锁后,可以通过更新地址指针的方式实现对第二权值列表的更新。数据写入进程可以直接将释放共享锁后的第二权值列表与第一权值列表进行指针交换,使得第二权值列表改为指向第一内存地址,而第一权值列表改为指向第二内存地址。
110.在本技术实施例中,通过交换第一权值列表和第二权值列表的地址指针,可以实现由数据写入进程交替地向第一内存地址和第二内存地址写入流量分配权值。在此基础上,可以由数据读取进程交替地从第一内存地址和第二内存地址读取流量分配权值。
111.举例而言,当第一权值列表指向第一内存地址并且第二权值列表指向第二内存地址时,数据写入进程将把实时统计得到的各个服务器的流量分配权值持续写入到第一内存地址中;与此同时,数据读取进程将从第二内存地址中读取流量分配权值,以进行流量分配。
112.当满足列表更新条件时,数据写入进程将释放由数据读取进程持有的第二权值列表的共享锁,在完成共享锁的释放后,通过数据写入进程交换第一权值列表和第二权值列
表存储的地址指针,使得第一权值列表改为指向第二内存地址,且使得第二权值列表指向第一内存地址。在完成列表切换后,数据写入进程将继续把实时统计得到的各个服务器的流量分配权值持续写入到第二内存地址中,数据读取进程在重新向第二权值列表添加共享锁后,能够从第一内存地址中读取流量分配权值以进行流量分配。
113.当再次满足列表更新条件时,将再次交换第一权值列表和第二权值列表存储的地址指针,重新将第一权值列表指向第一内存地址,并且将第二权值列表指向第二内存地址。
114.基于以上列表更新方案能够循环交替地对第一权值列表和第二权值列表进行地址更新,实现数据写入进程交替地向第一内存地址和第二内存地址写入流量分配权值。相应地,数据读取进程也将交替地从第一内存地址和第二内存地址读取流量分配权值。
115.在本技术实施例中,基于第一内存地址和第二内存地址的切换操作,无需在第一权值列表和第二权值列表之间进行频繁地数据拷贝,不仅可以节省内存消耗,而且可以提高流量分配权值的更新效率。
116.在本技术的一个实施例中,数据写入进程释放第二权值列表上添加的所有共享锁,使得数据写入进程能够对第二权值列表进行数据更新。数据写入进程对第二权值列表进行更新的方法可以包括:获取第一权值列表指向的第一内存地址以及释放共享锁后的第二权值列表指向的第二内存地址;复制第一内存地址中记录的流量分配权值,并使用所复制的流量分配权值覆盖第二内存地址中记录的流量分配权值。
117.在本技术实施例中,数据写入进程把实时统计得到的各个服务器的流量分配权值持续写入到第一权值列表指向的第一内存地址;与此同时,数据读取进程将从第二权值列表指向的第二内存地址中读取流量分配权值,以进行流量分配。当满足列表更新条件时,数据写入进程将释放由数据读取进程持有的第二权值列表的共享锁,在完成共享锁的释放后,数据写入进程将复制第一权值列表中记录的流量分配权值,并使用所复制的流量分配权值覆盖第二内存地址中记录的流量分配权值。完成列表更新后,数据写入进程将继续把实时统计得到的各个服务器的流量分配权值持续写入到第一权值列表指向的第一内存地址,数据读取进程在向第二权值列表添加读锁后,能够继续从第二权值列表指向的第二内存地址中读取更新后的流量分配权值以进行流量分配。
118.在步骤s250中,从更新后的第二权值列表中读取流量分配权值,以根据读取到的流量分配权值向服务器集群中的各个服务器分配流量。
119.在本技术的一个实施例中,通过数据读取进程申请获取更新后的第二权值列表的共享锁;通过持有共享锁的数据读取进程从更新后的第二权值列表中读取流量分配权值。
120.在本技术的一个实施例中,基于读取到的更新后的流量分配权值,可以向服务器集群中的各个服务器分配流量。流量指的是用户通过客户端向服务器发起的用户请求,这些用户请求将按照流量分配权值对应的分配比例被分配到各个服务器上,以达到负载均衡的目的。流量分配权值用于控制各个服务器之间的整体的流量分配比例。对于服务器集群中的各个服务器而言,每个用户请求可以按照随机算法、轮询调度算法或者一致性哈希算法中的任意一种进行调度分配。
121.随机算法是按照流量分配权重从服务器列表中随机选择一台服务器,进而将来自客户端的用户请求分配给随机选中的服务器。图6示意性地示出了本技术一个实施例中基于随机算法结合流量分配权值进行流量分配的原理图。如图6所示,当客户端client上产生
用户请求时,可以根据请求类型确定与之对应的服务器集群,该服务器集群例如包括四个服务器server1、server2、server3和server4,从服务器集群的双权值列表中读取得到各个服务器对应的流量分配权值依次为w1、w2、w3和w4,由此可以计算第i个服务器的流量分配比例为pi=wi/∑wi。
122.对于每一个用户请求而言,各个服务器对应的流量分配比例可以作为将该用户请求向各个服务器进行分配的分配概率。例如,根据流量分配权值确定四个服务器的流量分配比例依次为40%、21%、9%和30%。则将该用户请求分配至服务器server1的概率为40%,将其分配至服务器server2的概率为21%,将其分配至服务器server3的概率为9%,将其分配至服务器server4的概率为30%。
123.轮询调度算法是按照流量分配权重对来自客户端的用户请求轮流判断是否能够分配给服务器集群中的各个服务器,从1开始,直到n(内部服务器个数),然后重新开始循环。图7示意性地示出了本技术一个实施例中基于轮询调度算法结合流量分配权值进行流量分配的原理图。如图7所示,与一个用户请求对应的服务器集群中包括有六个服务器server1、server2、server3、server4、server5和server6。其中,从双权值列表中读取得到第i个服务器的流量分配权值为wi,对应可以计算得到其流量分配比例为pi。在此基础上,对于一个用户请求,可以根据流量分配比例pi依次判断是否能够将该用户请求分配至第i个服务器。例如,第一个用户请求,可以首先判断其是否能够分配至第1个服务器,若分配失败,则继续判断该用户请求是否能够分配第2个服务器,依次类推,在轮流进行判断直至分配成功后,可以继续对第二个用户请求采用相同的轮流判断的方式进行分配。
124.一致性哈希算法是对用户请求中携带的用于标识该请求的id进行哈希运算得到相应的哈希值,所有的哈希值共同组成一个哈希值圆环,其中每个服务器负责哈希值圆环上的某个哈希值区间的请求。若哈希值落在某个服务器对应的哈希值区间中,可以按照顺时针方向依次判断是否能够将该用户请求分配至各个服务器。图8示意性地示出了本技术一个实施例中基于一致性哈希算法结合流量分配权值进行流量分配的原理图。如图8所示,在哈希值范围为0~2
32

1的圆环上,分布有三个服务器server1、server2和server3,三个服务器将圆环分割形成三个哈希值区间。当客户端发起一个用户请求时,首先可以获取该用户请求中携带的id,计算该id的哈希值后,可以确定该哈希值所在的哈希值区间,例如一个用户请求落在server1与server2之间的哈希值区间,则按照顺时针方向判断该用户请求能否分配给服务器server2,其能否分配成功的概率与服务器server2的流量分配权值为正比例关系。若分配失败,则继续按照顺时针方向判断该用户请求能否分配给服务器server3。依次类推,在轮流进行判断直至分配成功后,可以继续对第二个用户请求采用相同的一致性哈希运算和轮流判断的方式进行分配。
125.图9示意性地示出了本技术实施例在一个应用场景中基于双权值列表进行流量分配的系统框架。如图9所示,系统中维护了两份权值列表,分别是前台权值列表901(frontlist)和后台权值列表902(backlist),权值列表中保存了各个服务器的流量分配权值w。前台权值列表901是用户流量分配的依据,用户流量会根据权值的比例转发至不同的服务器进行处理,实现负载均衡。
126.在本技术实施例中,部署了多个专门负责流量读取的读服务器903(readsvr),读服务器903只会访问前台权值列表901,而不会访问后台权值列表902,前台权值列表901在
读服务器903读取数据的过程中不会被修改,因此多个读服务器903可以同时访问前台权值列表901,两两之间不会相互干扰,保证流量处理的高性能。
127.在本技术实施例中,部署了1个负责流量更新的写服务器904(writesvr),写服务器904会访问后台权值列表902并且会对其进行修改,并且在特定的时间会将后台权值列表902覆盖前台权值列表901,从而实现前后台列表的切换。这样在前台权值列表901生效期间,后台权值列表902也一直在统计各服务器的负载情况,并更新后台权值列表902中存储的w值,及时切换前后台列表,从而保证低时延的流量调整。
128.前后台列表的覆盖时机有不同的策略可供选择。第一种是定时覆盖,比如后台权值列表902每隔100ms覆盖一次,这是最简单的覆盖规则,在用户流量变化不大时可以选用,比如mmorpg游戏的早晨时段,游戏内热门活动较少,玩家流量均匀分配在不同的玩法中,定时的覆盖策略足够应对。第二种是阈值覆盖,可以维护前后台列表的数值差异p:
129.p=(w2_1

w1_1)^2+(w2_2

w1_2)^2+(w2_3

w1_3)^2+

130.当数值差异p大于预设阈值t时(阈值可以根据游戏不同玩法进行调节,对于极度热门的玩法,可以设置较低阈值),执行前后台列表的覆盖操作。
131.当读服务器903从前台权值列表901读取数据时,读服务器903会持有读锁,这把读锁会挡住写服务器904对前台权值列表901的数据更新操作,保证前台权值列表901中保存的前台数据在读取半途中不会被修改,并且读锁不会挡住其他读服务器903的读操作。
132.当写服务器904在修改后台权值列表902的时候,不需要对后台权值列表902加锁,因为只有1个写服务器,不存在数据同时修改的问题。
133.当写服务器904准备根据后台权值列表902更新前台权值列表901的时候,需要逐个获取所有读锁,然后再执行覆盖操作,从而保证数据覆盖更新时没有任何读服务器903正在读取数据,保证数据的原子性。
134.当大量用户请求到来时,读服务器903会读取前台权值列表901,根据前台权值列表901中记录的每个服务器的流量分配权值w,将这些用户请求按比例分发到对应的服务器中进行处理,达到负载均衡的目的。通过双权值列表切换,本技术实施例可以及时地更新各服务器的负载情况,保证负载均衡系统的低时延。
135.本技术实施例可以应用于游戏内各玩法的负载均衡,保证流量按比例分配,防止个别服务器负载过高而瘫痪,可以根据不同服务器机器的性能自适应的调整流量,做到机器性能的合理调度,避免流量分配不合理,防止低性能机器分得高流量导致处理缓慢,而高性能机器空闲浪费资源的情况出现。
136.应当注意,尽管在附图中以特定顺序描述了本技术中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。
137.以下介绍本技术的装置实施例,可以用于执行本技术上述实施例中的数据处理方法。图10示意性地示出了本技术实施例提供的数据处理装置的结构框图。如图10所示,数据处理装置1000包括:获取模块1010,被配置为获取服务器集群的双权值列表,所述双权值列表包括用于写入流量分配权值的第一权值列表和用于读取流量分配权值的第二权值列表,所述流量分配权值用于确定向所述服务器集群中的各个服务器分配流量的分配比例;统计
模块1020,被配置为分别统计所述服务器集群中的各个服务器的性能参数,所述性能参数用于表示所述服务器的流量吞吐性能;写入模块1030,被配置为根据所述性能参数确定所述服务器的流量分配权值,并将所述服务器的流量分配权值实时写入所述第一权值列表;更新模块1040,被配置为当满足列表更新条件时,根据所述第一权值列表更新所述第二权值列表;读取模块1050,被配置为从更新后的第二权值列表中读取流量分配权值,以根据读取到的流量分配权值向所述服务器集群中的各个服务器分配流量。
138.在本技术的一些实施例中,基于以上各实施例,所述更新模块1040包括:进程获取模块,被配置为获取用于更新所述双权值列表的数据写入进程以及用于从所述双权值列表读取流量分配权值的数据读取进程;共享锁释放模块,被配置为若所述数据读取进程持有所述第二权值列表的共享锁,则通过所述数据写入进程释放所述共享锁;列表更新模块,被配置为根据所述第一权值列表更新释放所述共享锁后的第二权值列表。
139.在本技术的一些实施例中,基于以上各实施例,所述列表更新模块被配置为:获取所述第一权值列表指向的第一内存地址以及释放所述共享锁后的第二权值列表指向的第二内存地址;将释放所述共享锁后的第二权值列表更新为指向所述第一内存地址,并将所述第一权值列表更新为指向所述第二内存地址。
140.在本技术的一些实施例中,基于以上各实施例,所述列表更新模块被配置为:获取所述第一权值列表指向的第一内存地址以及释放所述共享锁后的第二权值列表指向的第二内存地址;复制所述第一内存地址中记录的流量分配权值,并使用所复制的流量分配权值覆盖所述第二内存地址中记录的流量分配权值。
141.在本技术的一些实施例中,基于以上各实施例,所述读取模块1050被配置为:通过所述数据读取进程申请获取更新后的所述第二权值列表的共享锁;通过持有所述共享锁的数据读取进程从更新后的所述第二权值列表中读取流量分配权值。
142.在本技术的一些实施例中,基于以上各实施例,所述性能参数包括吞吐量和延迟时间,所述吞吐量用于表示服务器在单位时间内处理的业务请求的平均数量,所述延迟时间用于表示服务器处理业务请求的平均时长;所述流量分配权值与所述吞吐量呈正相关关系,并且与所述延迟时间呈负相关关系。
143.在本技术的一些实施例中,基于以上各实施例,分别统计服务器集群中的各个服务器的性能参数,包括:实时监测并记录服务器集群中的各个服务器处理业务请求的数量和时间;在与当前时间节点相对应的历史时间窗口内统计所述业务请求的处理数量和处理时长;根据所述历史时间窗口内统计的所述业务请求的处理数量和所述历史时间窗口的窗口容量确定所述服务器在当前时间节点的吞吐量;根据所述历史时间窗口内统计的所述业务请求的处理时长确定所述服务器在当前时间节点的延迟时间。
144.在本技术的一些实施例中,基于以上各实施例,所述列表更新条件包括定时条件和阈值条件中的至少一种;所述定时条件包括当前时间节点与上一次更新的时间节点之间的时间差达到预设的间隔时长,所述阈值条件包括所述第一权值列表与所述第二权值列表之间的数值差异达到预设的差异阈值。
145.在本技术的一些实施例中,基于以上各实施例,确定是否满足所述列表更新条件的方法包括:若所述当前时间节点满足所述定时条件和所述阈值条件中的任意一个,则确定所述当前时间节点满足所述列表更新条件。
146.在本技术的一些实施例中,基于以上各实施例,确定是否满足所述列表更新条件的方法包括:统计预设时间周期内的业务请求的变化量;若所述变化量小于设定的数量阈值,则将所述定时条件作为列表更新条件,以确定当前时间节点是否满足所述定时条件;若所述变化量大于或等于所述数量阈值,则将所述阈值条件作为列表更新条件,以确定当前时间节点是否满足所述阈值条件。
147.在本技术的一些实施例中,基于以上各实施例,确定是否满足所述列表更新条件的方法包括:若当前时间节点处于设定的第一时间范围,则将所述定时条件作为列表更新条件,以确定当前时间节点是否满足所述定时条件;若当前时间节点处于与所述第一时间范围不同的第二时间范围,则将所述阈值条件作为列表更新条件,以确定当前时间节点是否满足所述阈值条件。
148.在本技术的一些实施例中,基于以上各实施例,确定是否满足阈值条件的方法包括:实时获取同一服务器在所述第一权值列表与所述第二权值列表中记录的流量分配权值的差值;将各个所述服务器的所述差值的平方和作为所述第一权值列表与所述第二权值列表的数值差异;若所述数值差异大于与业务请求类型相关的差异阈值,则确定满足阈值条件;若所述数值差异小于或等于所述差异阈值,则确定不满足所述阈值条件。
149.本技术各实施例中提供的数据处理装置的具体细节已经在对应的方法实施例中进行了详细的描述,此处不再赘述。
150.图11示意性地示出了用于实现本技术实施例的电子设备的计算机系统结构框图。
151.需要说明的是,图11示出的电子设备的计算机系统1100仅是一个示例,不应对本技术实施例的功能和使用范围带来任何限制。
152.如图11所示,计算机系统1100包括中央处理器1101(central processing unit,cpu),其可以根据存储在只读存储器1102(read

only memory,rom)中的程序或者从存储部分1108加载到随机访问存储器1103(random access memory,ram)中的程序而执行各种适当的动作和处理。在随机访问存储器1103中,还存储有系统操作所需的各种程序和数据。中央处理器1101、在只读存储器1102以及随机访问存储器1103通过总线1104彼此相连。输入/输出接口1105(input/output接口,即i/o接口)也连接至总线1104。
153.以下部件连接至输入/输出接口1105:包括键盘、鼠标等的输入部分1106;包括诸如阴极射线管(cathode ray tube,crt)、液晶显示器(liquid crystal display,lcd)等以及扬声器等的输出部分1107;包括硬盘等的存储部分1108;以及包括诸如局域网卡、调制解调器等的网络接口卡的通信部分1109。通信部分1109经由诸如因特网的网络执行通信处理。驱动器1110也根据需要连接至输入/输出接口1105。可拆卸介质1111,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1110上,以便于从其上读出的计算机程序根据需要被安装入存储部分1108。
154.特别地,根据本技术的实施例,各个方法流程图中所描述的过程可以被实现为计算机软件程序。例如,本技术的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1109从网络上被下载和安装,和/或从可拆卸介质1111被安装。在该计算机程序被中央处理器1101执行时,执行本技术的系统中限定的各种功能。
155.需要说明的是,本技术实施例所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(erasable programmable read only memory,eprom)、闪存、光纤、便携式紧凑磁盘只读存储器(compact disc read

only memory,cd

rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本技术中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本技术中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、有线等等,或者上述的任意合适的组合。
156.附图中的流程图和框图,图示了按照本技术各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
157.应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本技术的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
158.通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本技术实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是cd

rom,u盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、触控终端、或者网络设备等)执行根据本技术实施方式的方法。
159.本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本技术的其它实施方案。本技术旨在涵盖本技术的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本技术的一般性原理并包括本技术未公开的本技术领域中的公知常识或惯用技术手段。
160.应当理解的是,本技术并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本技术的范围仅由所附的权利要求来限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1