1.本技术涉及到数据传输领域,具体而言,涉及一种远程过程调用中的数据处理方法和系统。
背景技术:2.远程过程调用(remote procedure call,简称为rpc)主要作用是,当多台机器组成的集群上部署应用时,多台机器之间需要进行通信,它使得客户端应用程序(也可以简称为客户端程序)可以像调用本地过程一样调用远程服务端应用程序(也可以简称为服务端程序)的过程。为了适应远程过程调用中的网络传输,rpc系统里面通常包含了序列化和反序列化操作。rpc系统里面的序列化主要是将数据结构转换成易于网络传输的字节流格式,反序列化是将序列化后的数据恢复成原来的数据结构。例如,rpc系统的客户端程序将用户请求的数据序列化后通过网络发送到服务端程序,服务端程序在收到网络消息后,对消息进行反序列化还原得到用户请求的数据,从而进行相应处理。服务端程序进行相应的处理后,也会将返回的消息序列化后发送给客户端程序,客户端程序再反序列化后得到所需的处理结果。
3.在进行序列化时,客户端程序和服务端程序一般会使用第三方序列化库来进行序列化和反序列化,该第三方序列化库也可以称为信息转换库。信息转换库在对数据进行序列化和反序列化的过程中需要分配内存并进行内存拷贝,例如,在对a数据进行序列化的过程中,需要将a数据进行序列化处理得到的序列化数据(也可以称为字节流),序列化库会先分配一块内存缓冲区,随后将序列化后的消息拷贝到这块缓冲区中,即将序列化后得到的字节流拷贝保存在缓存空间中,客户端程序或者服务端程序中的一方将缓存空间的字节流发送给另一方。缓存空间也是位于内存中,因此,整个序列化或反序列化过程中会涉及到内存分配和内存拷贝,这会影响处理效率。下面结合一个例子对此进行说明。
4.在该例子中,假设客户端程序向服务端程序传输的数据包括八个字段的数据,即该待传输的数据的数据结构中包含的数据有value1、value2、value3、value4、value5、value6、value7、value8,其中value4和value6的数据长度超过n字节,其他value的数据长度小于n字节。
5.图1是根据相关技术中的对数据进行序列化处理的流程示意图,在图1中示出了对待传输数据进行序列化处理过程中的内存分配和内存拷贝,下面结合图1对此进行说明。
6.(1)客户端程序接收用户提供的需要传输给服务端程序的数据结构,在图1中,客户端程序接收到用户输入的数据结构名称为requestproto,用户输入的数据结构中包含的字段有value1、value2、value3、value4、value5、value6、value7、value8,其中value4和value6的数据长度超过n字节,其他字段的数据长度小于n字节;
7.(2)客户端程序调用信息转换库,对应用程序的数据结构进行序列化,序列化后得到的字节流会被保存在1块内存中(即图1中示出的内存缓冲区buffer)。需要说明的是,在图1示出的流程中,在进行序列化时并没有因为单个字段的长度超过n字节而对该字段进行
特殊的处理。图1中进行序列化的过程中仅仅需要得知数据结构的总体长度,然后根据该总体长度进行内存分配即可。
8.即,首先统计一下数据结构中各个字段的数据长度,然后将各个字段的数据长度相加得到该数据结构的长度。
9.根据该数据结构的总长度申请1块内存缓冲区buffer(该内存缓冲区也可以称作内存块),该内存块的长度为value1、value2、value3、value4、value5、value6、value7和value8序列化后所需的总共的缓存空间大小。
10.对输入数据结构中的字段value1、value2、value3、value4、value5、value6、value7、value8进行序列化,保存到buffer上。在进行序列化的过程中需要将各个字段进行序列化后得到的字节流分别拷贝该块内存缓冲区中。
11.(3)客户端程序从该块内存缓冲区中读取字节流并发送给rpc的服务端程序,通过该步骤使用rpc系统完成了传输这块内存保存的字节流。
12.图2是根据相关技术中的对字节流进行反序列化处理的流程示意图,图2示出了对接收到的字节流进行反序列化处理过程的内存分配和拷贝,下面结合图2示出的服务端数据接收流程进行说明。
13.(1)rpc系统服务端收到字节流,该字节流是客户端程序从一块连续的buffer获取并发送出来的。服务端程序也将接收到的字节流保存在一块内存缓冲区中(即图2示出的buffer).
14.(2)调用信息转换库,对接收到的数据(即字节流)进行反序列化。
15.对接收到的字节流进行解析,得到接收到的字节流所包括的所有字段,统计每个字段的长度。在图2中,发现收到的数据中包含的字段有value1、value2、value3、value4、value5、value6、value7、value8,其中value4和value6的数据长度超过n字节,其他字段的数据长度小于n字节。
16.根据所有字段相加得到的总长度申请内存,该内存即为信息转换库为value1、value2、value3、value4、value5、value6、value7和value8申请的内存。
17.解析buffer中保存的所有字段,将每个字段逐个反序列化保存到value1、value2、value3、value4、value5、value6、value7、value8中。这其中,将每个字段进行反序列化的时候均需要进行内存的拷贝,即将该字段对应的字节流从buffer提取进行反序列化后拷贝到为该字段申请的内存中。
18.(3)服务端程序处理反序列化后的数据结构requestproto。
19.在上述图1和图2中示出了从客户端程序向服务端程序发送数据的过程,从服务端程序向客户端程序发送数据的过程也是类似的过程,在此不再赘述。
20.在图1和图2示出的序列化反序列化方法中,无论来自用户数据结构中各个字段数据长度有多大,信息转换库内都需要申请内存并进行内存拷贝。例如,图1和图2中的value4和value6,这2个字段的数据量比较大,信息转换库仍然会对这2个字段在信息转换库内进行额外的内存分配和拷贝,这会导致信息转换的开销比较大。
21.在这整个rpc的流程中,序列化处理(包括序列化和/或反序列化)占据了比较大的开销。在一些对延迟要求比较高,或者对于资源占用要求严格的场景,由序列化带来的开销导致现在的rpc系统通常无法很好的满足要求。
技术实现要素:22.本技术实施例提供了一种远程过程调用中的数据处理方法和系统,至少解决rpc流程中序列化处理开销较大导致rpc无法满足要求的问题。
23.根据本技术的一个方面,提供了一种远程过程调用中的数据处理方法,包括:远程过程调用的一方获取待传输数据,其中,所述待传输数据中包括至少一个字段;所述一方获取序列化数据以及预定字段中的数据,其中,所述序列化数据是对所述待传输数据的其他字段中的数据进行序列化后得到的,所述其他字段为所述待传输数据中除预定字段之外的字段,所述预定字段为满足预定条件的字段,所述预定字段中的数据未经过序列化处理;所述一方将所述序列化数据以及所述预定字段中的数据发送给远程过程调用的另一方,其中,在所述一方为客户端程序的情况下所述另一方为服务端程序;或者,在所述一方为服务端程序的情况下所述另一方为客户端程序。
24.根据本技术的另一个方面,还提供了一种远程过程调用中的数据处理方法,包括:获取来自远程过程调用中的一方的待传输数据;将所述待传输数据中的其他字段中的数据进行序列化处理得到序列化数据,其中,所述其他字段为所述待传输数据中除预定字段之外的字段,所述预定字段为满足预定条件的字段;获取第一地址值,其中,所述第一地址值为所述一方所在设备保存所述预定字段中数据的地址的值;将对所述其他字段中的数据进行序列化后得到的序列化数据以及所述第一地址值提供给所述一方;其中,所述第一地址值被所述一方用于获取所述预定字段中的数据,所述预定字段中的数据和所述序列化数据用于发送给远程过程调用的另一方;所述预定字段中的数据未经过序列化处理,在所述一方为客户端程序的情况下所述另一方为服务端程序;或者,在所述一方为服务端程序的情况下所述另一方为客户端程序。
25.根据本技术的另一个方面,还提供了一种远程过程调用中的数据处理方法,包括:远程过程调用的一方获取序列化后的数据,其中,所述序列化后的数据是将待传输数据中的部分数据进行序列化处理后得到的;所述一方将所述序列化后的数据和所述待传输数据中的另一部分数据发送给远程过程调用的另一方,其中,所述另一部分数据是所述待传输数据中除所述部分数据以外的其他数据,所述另一部分数据未经过序列化处理;所述另一方接收所述序列化后的数据和所述另一部分数据,并获取将所述序列化后的数据进行反序列化得到所述部分数据;所述另一方根据所述部分数据和所述另一部分数据得到的所述待传输数据。
26.根据本技术的另一个方面,还提供了一种远程过程调用中的数据处理系统,包括:远程过程调用的一方和另一方,其中,所述一方包括:第一获取模块和发送模块,其中所述第一获取模块用于获取序列化后的数据,其中,所述序列化后的数据是将待传输数据中的部分数据进行序列化处理后得到的;所述发送模块用于将所述序列化后的数据和所述待传输数据中的另一部分数据发送给远程过程调用的另一方,其中,所述另一部分数据是所述待传输数据中除所述部分数据以外的其他数据,所述另一部分数据未经过序列化处理;所述另一方包括接收模块和第二获取模块,其中所述接收模块用于接收所述序列化后的数据和所述另一部分数据;所述第二获取模块用于获取将所述序列化后的数据进行反序列化得到所述部分数据,并根据所述部分数据和所述另一部分数据得到的所述待传输数据。
27.根据本技术的另一个方面,还提供了一种可读存储介质,其上存储有计算机指令,
其中,该计算机指令被处理器执行时实现上述的方法步骤。
28.在本技术实施例中,采用了远程过程调用的一方获取待传输数据,其中,所述待传输数据中包括至少一个字段;所述一方获取序列化数据以及预定字段中的数据,其中,所述序列化数据是对所述待传输数据的其他字段中的数据进行序列化后得到的,所述其他字段为所述待传输数据中除预定字段之外的字段,所述预定字段为满足预定条件的字段,所述预定字段中的数据未经过序列化处理;所述一方将所述序列化数据以及所述预定字段中的数据发送给远程过程调用的另一方。通过本技术解决了rpc流程中序列化处理开销较大导致rpc无法满足要求的问题,进而节约了序列化处理中的内存拷贝的开销,提高了rpc的处理效率。
附图说明
29.构成本技术的一部分的附图用来提供对本技术的进一步理解,本技术的示意性实施例及其说明用于解释本技术,并不构成对本技术的不当限定。在附图中:
30.图1是根据相关技术中的对数据进行序列化处理的流程示意图;
31.图2是根据相关技术中的对字节流进行反序列化处理的流程示意图;
32.图3是根据本技术实施例的远程过程调用中的数据处理方法的流程图;
33.图4是根据本技术实施例的对数据进行序列化处理并发送的流程图;
34.图5是根据本技术实施例的信息转换库进行序列化处理的流程图;
35.图6是根据本技术实施例的信息转换库进行反序列化处理的流程图;
36.图7是根据本技术实施例的对数据进行序列化处理的示意图;以及,
37.图8是根据本技术实施例的对字节流进行反序列化处理的示意图。
具体实施方式
38.需要说明的是,在不冲突的情况下,本技术中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本技术。
39.需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
40.以下实施例及实施方式应用到远程过程调用中,在远程过程调用中存在两方,一方为客户端程序,另一方为服务端程序;或者一方为服务端程序,另一方为客户端程序。对于远程过程调用的数据传输过程来说,可以由客户端程序将数据序列化后发送给服务端程序,由服务端程序进行反序列化;或者也可以由服务端程序将数据序列化后发送给客户端程序,客户端程序进行反序列化。因此,在以下实施例中,使用了一方来代表对数据进行序列化的客户端程序或服务器程序,使用另一方来代表对接收到的序列化数据进行反序列化处理的客户程序或服务器程序。
41.在本实施例中提供了一种远程过程调用中的数据处理方法,图3是根据本技术实施例的远程过程调用中的数据处理方法的示意图,下面对图3中示出流程所包括的步骤进行说明。
42.步骤s302,远程过程调用的一方获取序列化后的数据,其中,所述序列化后的数据
是将待传输数据中的部分数据进行序列化处理后得到的。
43.步骤s304,所述一方将所述序列化后的数据和所述待传输数据中的另一部分数据发送给远程过程调用的另一方,其中,所述另一部分数据是所述待传输数据中除所述部分数据以外的其他数据,所述另一部分数据未经过序列化处理。
44.在该步骤中,在所述一方为客户端程序的情况下所述另一方为服务端程序;或者,在所述一方为服务端程序的情况下所述另一方为客户端程序。
45.步骤s306,所述另一方接收所述序列化后的数据和所述另一部分数据,并获取将所述序列化后的数据进行反序列化得到所述部分数据。
46.步骤s308,所述另一方根据所述部分数据和所述另一部分数据得到的所述待传输数据。
47.通过上述步骤,对待传输数据中的部分数据进行了序列化处理而将另一部分数据未序列化处理直接发送给另一方。在这种处理方式中,发送了不经过序列化处理的数据,这相比于将待传输数据全部均进行数据化处理后发送的方式会增加网络传输开销,但是,另一部分数据没有经过序列化处理过程,其节约了序列化处理过程中的内存拷贝的开销。在远程过程调用中,内存拷贝开销对rpc影响要远远大于网络传输开销,因此,在降低了内存拷贝开销的情况下,能够有效降低远程过程调用的处理延时。即通过上述步骤解决了rpc流程中序列化处理开销较大导致rpc无法满足要求的问题,进而节约了序列化处理中的内存拷贝的开销,提高了rpc的处理效率。
48.在上述步骤中,将待传输数据分为了两部分数据,其中部分数据进行了序列化处理。将待传输数据分为两部分的方式有很多种,可以根据实际的待传输数据的数据结构来进行划分。在图1和图2示出的待传输数据中包括了多个字段,远程过程调用中传输的数据与图1和图2示出的数据结构类似,基本上均包括了多个字段。因此,在一个可选方式中,可以考虑根据待传输数据中的字段来选择进行序列化处理的部分数据和不进行序列化处理的另一部分数据。
49.即在该可选方式中,所述待传输数据包括多个字段,所述另一部分数据为所述多个字段中的预定字段中的数据,所述部分数据为所述多个字段中的其他字段中的数据,所述预定字段为满足预定条件的字段,所述其他字段为所述待传输数据中除所述预定字段之外的字段。
50.在图3示出的步骤中包括序列化和反序列化,下面以包括多个字段的待传输数据为例分别对序列化处理和数据发送以及接收到序列化数据后的反序列化处理进行说明。
51.图4是根据本技术实施例的对数据进行序列化处理并发送的流程图,下面对图4中远程过程调用的一方基于字段进行序列化处理的步骤进行说明,如图4所示,该流程包括如下步骤。
52.步骤s402,远程过程调用的一方获取待传输数据,其中,所述待传输数据中包括至少一个字段。
53.在该步骤中,待传输的数据具有一定的数据结构,数据结构是通过将数据分为不同的字段来体现的,因此,在以下描述中也会称数据结构包括至少一个字段。该步骤中待传输的数据是通过远程过程调用发送给另一方的数据。
54.步骤s404,所述一方获取序列化数据以及预定字段中的数据,其中,所述序列化数
据是对所述待传输数据的其他字段中的数据进行序列化后得到的,所述其他字段为所述待传输数据中除预定字段之外的字段,所述预定字段为满足预定条件的字段,所述预定字段中的数据未经过序列化处理。
55.在该步骤中,将待传输数据中的字段进行了区分,即分为预定字段和其他字段,预定字段和其他字段的划分是根据预定条件来进行的,该预定条件可以根据实施时的情况来灵活进行配置或者选择。无论预定条件的内容如何,只要对字段进行了区分,并对区分后字段进行了如下步骤中的处理,就可以降低序列化处理中的内存拷贝的开销。
56.步骤s406,所述一方将所述序列化数据以及所述预定字段中的数据发送给远程过程调用的另一方。
57.通过上述步骤,将待传输数据中的多个字段分为了预定字段和其他字段,对于预定字段中的数据不经过序列化处理直接发送给另一方,对其他字段中的数据经过序列化处理后发送给另一方。在这种处理方式中,发送了不经过序列化处理的数据,这相比于将所有字段均进行数据化处理后发送的方式会增加网络传输开销,但是,预定字段中的数据没有经过序列化处理过程,其节约了序列化处理过程中的内存拷贝的开销。在远程过程调用中,内存拷贝开销对rpc影响要远远大于网络传输开销,因此,在降低了内存拷贝开销的情况下,能够降低远程过程调用的处理延时。
58.在上述步骤中将待传输数据被分为序列化数据和未被序列化的数据发送给另一方。其中对于待传输数据包括的多个字段,预定字段中的数据是没有经过序列化的,因此在通过网络层传输数据时,只要直接从保存预定字段中的数据的内存中取得该数据即可。而其他字段中的数据是序列化后的处理,在序列化处理的过程中,需要申请新的内存来保存序列化数据,这会增加一次内存拷贝。因此,对于预定字段中的数据的处理可以称为零拷贝。对于进行数据发送的一方来说,其可以根据一方所在设备中保存该预定字段中的数据的地址直接获取预定字段中的数据,然后再进行发送。
59.即在这种可选实施方式中,所述一方获取序列化数据以及预定字段中的数据可以包括:所述一方获取第一地址值,其中,所述第一地址值为所述一方所在设备保存所述预定字段中数据的地址的值;所述一方从所述第一地址值指向的地址获取所述预定字段的数据,并将所述序列化数据以及所述预定字段中的数据发送给所述另一方。
60.上述进行的序列化相关处理可以由远程过程调用的一方来进行,或者也可以由信息转换库来执行。在一个可选实施方式中使用了信息转换库,在该可选方式中,所述一方调用信息转换库对所述待传输处理进行序列化处理;所述一方获取所述信息转换库提供的所述序列化数据和第一地址值,其中,所述信息转换库用于进行序列化处理或反序列化处理;其中,所述第一地址值为所述一方所在设备保存所述预定字段中数据的地址的值;所述一方从所述第一地址值指向的地址获取所述预定字段的数据。下面对信息转换库所进行的序列化操作进行说明,图5是根据本技术实施例的信息转换库进行序列化处理的流程图,如图5所示,该信息转换库执行的操作包括如下步骤。
61.步骤s502,获取来自远程过程调用中的一方的待传输数据。
62.步骤s504,将所述待传输数据中的其他字段中的数据进行序列化处理得到序列化数据,其中,所述其他字段为所述待传输数据中除预定字段之外的字段,所述预定字段为满足预定条件的字段。
63.步骤s506,获取第一地址值,其中,所述第一地址值为所述一方所在设备保存所述预定字段中数据的地址的值。
64.步骤s508,将对所述其他字段中的数据进行序列化后得到的序列化数据以及所述第一地址值提供给所述一方;其中,所述第一地址值被所述一方用于获取所述预定字段中的数据,所述预定字段中的数据和所述序列化数据用于发送给远程过程调用的另一方;所述预定字段中的数据未经过序列化处理。
65.通过上述步骤,信息转换库在执行序列化的过程中直接将预定字段中数据对应的第一地址值提供远程过程调用的一方,即对于预定字段中的数据不再需要进行序列化处理,从而减少了在序列化处理中的内存拷贝,降低了序列化处理的开销。需要说明的是,由于对于预定字段的数据是直接提供了地址值,对于这部分数据不再需要进行内存拷贝,因此,该处理在以下实施例中也被称作“零拷贝”,用于执行上述操作的信息转换库在以下实施例中也被称作是“零拷贝信息转换库”。
66.对于接收数据的远程过程调用的另一方来说,其会首先将接收到的序列化数据以及预定字段的数据进行保存(预定字段中的数据在所述另一方所在设备中的保存的地址为第二地址值),然后再进行反序列化处理。远程调用的另一方最终需要得到的是待传输数据,因此另一方只需要将所述其他字段中进行反序列化处理即可,然后根据保存预定字段中的数据的第二地址值就可以直接得到预定字段中的数据,即对预定字段中的数据也不需要进行反序列化处理,避免了进行反序列化处理过程中内存拷贝所带来的开销。
67.远程过程调用的另一方会将其他字段中的数据和预定字段中的数据恢复成原始的待传输数据。如在上文描述的那样,该过程可以包括如下步骤:所述另一方获取所述其他字段中的数据和所述预定字段中的数据,其中,所述其他字段中的数据是对所述序列化数据进行反序列化得到的。在得到其他字段中的数据和预定字段中的数据之后,就可以将这两部分数据进行组合得到原始的待传输数据了。
68.上述进行的反序列化相关处理可以由远程过程调用的另一方来进行,或者也可以由信息转换库来执行。在一个可选实施方式中使用了信息转换库,在该实施方式中,所述另一方调用信息转换库对所述接收到数据进行反序列化处理;所述另一方获取所述信息转换库提供的所述其他字段中的数据和第二地址值,其中,所述第二地址值是所述另一方所在设备保存所述预定字段中的数据的地址的值;所述另一方根据所述第二地址值获取所述预定字段中的数据。下面对信息转换库所进行的反序列化操作进行说明,图6是根据本技术实施例的信息转换库进行反序列化处理的流程图,如图6所示,该信息转换库执行的操作包括如下步骤。
69.步骤s602,根据所述另一方接收到所述序列化数据和所述预定字段中的数据进行反序列化处理,其中,进行反序列化处理包括:对所述序列化数据进行反序列化处理得到所述其他字段中的数据,并获取第二地址值;所述第二地址值上保存的数据为通过网络传输后所述另一方保存下来的所述预定字段中的数据;
70.步骤s604,将所述其他字段中的数据和所述第二地址值提供给所述另一方。
71.通过上述步骤,信息转换库仅仅对序列化数据进行了反序列化处理,而对于预定字段中的数据则直接将第二地址值提供了另一方,即对于信息转化库来说是不需要对预定字段中的数据进行反序列化处理的,因此也不需要进行内存拷贝,减少了内存拷贝的开销。
72.信息转换库可以采用多种方式来进行反序列化处理,在一种可选方式中,信息转换库通过内存分割的方式来区分序列化数据和预定字段中的数据。即在该可选方式中,根据所述另一方接收到所述序列化数据和所述预定字段中的数据进行反序列化处理包括:对所述另一方所在的设备用于保存所述序列化数据和所述预定字段中的数据的内存进行分割,得到保存所述序列化数据的内存和保存所述预定字段中的数据的内存;根据所述序列化数据的长度新申请内存,并将对所述序列化数据进行反序列化处理后得到的所述其他字段中的数据保存新申请的内存中;获取保存所述预定字段中的数据的内存的地址,其中,所述保存所述预定字段中的数据的内存的地址为所述第二地址值。
73.在上述实施例方式,涉及到预定字段和其他字段的区分,由于序列化和反序列化处理中对于数据量较大的字段进行内存拷贝时消耗是比较大的,因此,在一个可选的实施方式中,可以根据字段的长度是否超过阈值来确定该字段是否为预定字段。即所述预定字段为字段中数据的长度超过阈值的字段。
74.该阈值可以是经验值,或者也可以通过测试来得到该阈值。例如,在一个远程过程调用系统中传输的数据包括8个字段,该8个字段的长度分别为len1到len8,当设置阈值为a1的时候,其中有三个字段的长度超过a1,则这三个字段为预定字段,在这种情况下测试该远程过程调用系统在客户端程序和服务端程序之间传输该数据的时延。然后,设置阈值为a2,其中有两个字段的长度超过a2,则这两个字段为预定字段,在这种情况下测试该远程过程嗲用系统在客户端程序和服务端程序之间传输该数据的时延。多次改变阈值的值,记录每次的传输时延,从中选择最优时延对应的阈值作为该远程过程调用系统的阈值。
75.下面结合一个例子来对上述实施例及实施方式进行说明。
76.在本例子中提供了一种应用于远程过程调用系统的零拷贝序列化反序列化方法,通过实现了一个零拷贝的信息转换库,并应用于远程过程调用,使得远程过程调用延迟降低。该例子基于零拷贝的信息转换库进行远程过程调用主要涉及到步骤如下:客户端程序调用零拷贝的信息转换库,对应用程序的数据结构进行序列化。其中,序列化的过程为:信息转换库内部申请内存,将数据结构中数据量小的转换成字节流保存到(会有内存拷贝)信息转换库内部申请的内存中,数据量大的直接使用应用程序数据结构该数据对应的地址值,所以本例子中信息转换库提供的内容由两部分组成,一部分保存的是应用程序数据结构中数据量小的那些信息,另一部分是应用程序数据结构中数据量大的数据地址。然后,客户端程序使用rpc系统传输待传输数据,将数据交由服务端程序处理。服务端程序收到数据并进行保存后,调用零拷贝的信息转换库,对收到的字节流数据进行反序列化。其中反序列化的过程为:信息转换库内部解析收到的字节流数据,将其中数据量小的转换成对应的数据结构(会有内存拷贝),将数据量大的字节所在的内存地址直接给到服务端程序。然后,服务端程序处理收到的数据,并将运行结果按照上述步骤反向发回给客户端程序。
77.为了与图1和图2进行比较,在该例子中,让然假设客户端程序向服务端程序传输的数据包括八个字段的数据,即该待传输的数据的数据结构中包含的数据有value1、value2、value3、value4、value5、value6、value7、value8,其中,value4和value6的数据长度超过n字节,其他value的数据长度小于n字节。需要说明的是n字节即为阈值,即value4和value6为上述实施例中描述的预定字节,value1、value2、value3、value5、value7和value8为上述实施例中描述的其他字节。
78.图7是根据本技术实施例的对数据进行序列化处理的示意图,下面结合图7对客户端程序的数据发送详细流程进行说明。
79.(1)客户端程序接收用户输入的数据,该数据是需要传输给服务端程序的数据,该数据具有多个字段的数据结构,因此在下文中也将该数据称为数据结构。在本例子中,假设客户端用户输入的数据结构名称为requestproto,该数据结构中包含的字段有value1、value2、value3、value4、value5、value6、value7、value8,其中value4和value6的数据长度超过n字节,其他字段的数据长度小于n字节。需要说明的是,n是用于区分字节数据量大小的一个阈值。
80.(2)调用零拷贝的信息转换库,对来自客户端程序的数据结构进行序列化,序列化后有5块内存,分别为buffer1、value4的数据地址、buffer2、value6的数据地址、buffer3。下面对(2)中涉及的操作进行详细说明。
81.首先,统计一下该数据结构中各个字段的数据长度,统计结果是value4和value6的数据长度超过n字节,其他字段的数据长度小于n字节。
82.申请3块内存(假设3块内存分别为buffer1、buffer2、buffer3),三块内存的长度分别是len1、len2和len3,其中,len1是value1、value2、value3序列化后所需的总共的缓存空间大小;len2是value5序列化后所需的缓存空间大小;len3是value7、value8序列化后所需的总共的缓存空间大小。
83.对requestproto数据结构中的字段value1、value2、value3进行序列化,并将序列化后得到的字节流保存到buffer1上。
84.value4中的数据不进行序列化而是直接保留该字段的地址的值。
85.对字段value5进行序列化,保存到buffer2上。
86.value6中的数据不进行序列化而是直接保留该字段的地址的值。
87.对字段value7、value8进行序列化,保存到buffer3上。
88.(3)使用rpc系统传输这5块内存中的内容。在该步骤中,rpc系统中的客户端程序使用序列化后的消息传输这5块内存中的内容,由于value4和value6字段中的数据没有经过序列化处理,因此,客户端程序将value4和value6字段中的数据直接发送给服务端程序。
89.图8是根据本技术实施例的对字节流进行反序列化处理的示意图,下面结合图8对服务端数据接收详细流程进行说明。
90.(1)rpc系统服务端程序接收到数据,可以将接收到的数据保存在一块连续的buffer中。
91.(2)调用零拷贝的信息转换库,对收到的数据进行反序列化。下面对零拷贝信息转换库的进行的反序列化操作进行说明。
92.首先解析收到的数据中包含的所有字段并统计每个字段的长度,发现收到的数据中包含的字段有value1、value2、value3、value4、value5、value6、value7和value8,其中value4和value6的数据长度超过n字节,其他字段的数据长度小于n字节。
93.服务端一般会将接收到的数据保存在一个块连续的内存中(buffer),在该步骤中,可以把收到的连续的buffer分割成5块内存,其中5块内存的长度分别为n1、n2、n3、n4、n5字节。其中,将value1、value2和value3对应的序列化后的数据分割在第一块内存中,将value4字节中的数据分割在第二块内存中,将value5对应的序列化后的数据分割在第三块
内存中,将value6字节中的数据分割在第四块内存中,将value7和value8对应的序列化后的数据分割在第五块内存中。
94.为value1、value2和value3再次申请内存(该再次申请的内存用于保存反序列化后得到的数据),将buffer切割后的第一块内存反序列化到value1、value2、value3对应的内存中。
95.将buffer切割后的第二块内存的起始地址值保留下来,给value4。
96.为value5申请内存,将buffer切割后的第三块内存反序列化到value5中。
97.将buffer切割后的第四块内存的起始地址值保留下来,给value6。
98.为value7和value8再次申请内存(该再次申请的内存用于保存反序列化后得到的数据),将buffer切割后的第五块内存反序列化到value7和value8对应的内存中。
99.(3)服务端程序从零拷贝信息转换库得到反序列化后的数据,并且服务端程序还每一可以通过value4和value6所在的内存块的地址处理这两个内存块中的数据,因此,在该步骤中服务端程序完成了反序列化后的数据结构requestproto和2个内存块中数据的处理。
100.在本例子中,针对用户的数据结构进行序列化反序列化过程中,会根据设置的阈值n来对数据结构中的字段进行不同的处理,对于字段数据长度超过n字节的会进行零拷贝序列化反序列化节省额外的内存分配和拷贝,对于字段数据长度小于n字节的会跟目前的信息转换库一样,对这些字段进行内存分配和拷贝。这么处理的原因是,如果每个字段都直接采用零拷贝方法,那给到网络传输模块的内存块数量会很多,一次客户端请求,网络传输模块需要传输很多次数据,那网络传输的开销会大大增加,所以只需要对数据量比较大的字段采用零拷贝方法。在上述例子中涉及到设置阈值n来区别数据量大小,该阈值n可以根据不同的硬件性能进行调整,这里所说的硬件为客户端程序所在设备中使用的硬件以及服务端程序所在设备中使用的硬件。
101.通过上述实施例,对于用户数据结构中数据量比较大的字段不进行内存拷贝,而是直接把该字段对应的数据地址保留下来,在进行网络传输时直接使用该字段对应的数据地址来获取数据,从而节省内存拷贝的开销。将上述实施例中的信息转换库应用于远程过程调用系统中,使得整体的远程过程调用延迟有比较明显的降低,同时也节省了系统的内存和cpu开销。
102.在本实施例中,提供一种电子装置,包括存储器和处理器,存储器中存储有计算机程序,处理器被设置为运行计算机程序以执行以上实施例中的方法。
103.上述程序可以运行在处理器中,或者也可以存储在存储器中(或称为计算机可读介质),计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。
104.这些计算机程序也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤,对应与不同的步骤可以通过不同的模块来实现。
105.在本实施例中还提供了一种远程过程调用中的数据处理系统,包括:远程过程调用的一方和另一方,其中,所述一方包括:第一获取模块和发送模块,其中所述第一获取模块用于获取序列化后的数据,其中,所述序列化后的数据是将待传输数据中的部分数据进行序列化处理后得到的;所述发送模块用于将所述序列化后的数据和所述待传输数据中的另一部分数据发送给远程过程调用的另一方,其中,所述另一部分数据是所述待传输数据中除所述部分数据以外的其他数据,所述另一部分数据未经过序列化处理;所述另一方包括接收模块和第二获取模块,其中所述接收模块用于接收所述序列化后的数据和所述另一部分数据;所述第二获取模块用于获取将所述序列化后的数据进行反序列化得到所述部分数据,并根据所述部分数据和所述另一部分数据得到的所述待传输数据。
106.该系统置用于实现上述的实施例中的方法的功能,该系统中的每个模块与方法中的步骤相对应,已经在方法中进行过说明的,在此不再赘述。
107.可选地,在该系统中还可以使用信息转换库,即该信息转换库用于对来自所述一方的数据进行序列化处理,以及用于对来自所述另一方的序列化后的数据进行反序列化处理。该信息转化库所执行的步骤在上述实施例中已经进行了说明,在此不再赘述。
108.通过上述实施例,提出了应用于远程过程调用的零拷贝信息转换库,通过设定一个阈值n来控制多大数据量的字段来需要进行零拷贝序列化和/或反序列化,从而提高了远程过程调用中的序列化反序列化性能,进而提高整个远程过程调用的性能。
109.以上仅为本技术的实施例而已,并不用于限制本技术。对于本领域技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本技术的权利要求范围之内。
技术特征:1.一种远程过程调用中的数据处理方法,包括:远程过程调用的一方获取待传输数据,其中,所述待传输数据中包括至少一个字段;所述一方获取序列化数据以及预定字段中的数据,其中,所述序列化数据是对所述待传输数据的其他字段中的数据进行序列化后得到的,所述其他字段为所述待传输数据中除预定字段之外的字段,所述预定字段为满足预定条件的字段,所述预定字段中的数据未经过序列化处理;所述一方将所述序列化数据以及所述预定字段中的数据发送给远程过程调用的另一方,其中,在所述一方为客户端程序的情况下所述另一方为服务端程序;或者,在所述一方为服务端程序的情况下所述另一方为客户端程序。2.根据权利要求1所述的方法,其中,所述一方获取序列化数据以及预定字段中的数据包括:所述一方调用信息转换库对所述待传输处理进行序列化处理;所述一方获取所述信息转换库提供的所述序列化数据和第一地址值,其中,所述信息转换库用于进行序列化处理或反序列化处理;其中,所述第一地址值为所述一方所在设备保存所述预定字段中数据的地址的值;所述一方从所述第一地址值指向的地址获取所述预定字段的数据。3.根据权利要求1所述的方法,其中,在所述一方将所述序列化数据以及所述预定字段中的数据发送给所述远程过程调用的另一方之后,所述方法还包括:所述另一方获取所述其他字段中的数据和所述预定字段中的数据,其中,所述其他字段中的数据是对所述序列化数据进行反序列化得到的。4.根据权利要求3所述的方法,其中,所述另一方获取所述其他字段中的数据和所述预定字段中的数据包括:所述另一方调用信息转换库对所述接收到数据进行反序列化处理;所述另一方获取所述信息转换库提供的所述其他字段中的数据和第二地址值,其中,所述第二地址值上保存的数据为通过网络传输后所述另一方保存下来的所述预定字段中的数据;所述另一方根据所述第二地址值获取所述预定字段中的数据。5.根据权利要求1至4中任一项所述的方法,其中,所述预定字段为字段中数据的长度超过阈值的字段。6.一种远程过程调用中的数据处理方法,包括:获取来自远程过程调用中的一方的待传输数据;将所述待传输数据中的其他字段中的数据进行序列化处理得到序列化数据,其中,所述其他字段为所述待传输数据中除预定字段之外的字段,所述预定字段为满足预定条件的字段;获取第一地址值,其中,所述第一地址值为所述一方所在设备保存所述预定字段中数据的地址的值;将对所述其他字段中的数据进行序列化后得到的序列化数据以及所述第一地址值提供给所述一方;其中,所述第一地址值被所述一方用于获取所述预定字段中的数据,所述预定字段中的数据和所述序列化数据用于发送给远程过程调用的另一方;所述预定字段中的
数据未经过序列化处理,在所述一方为客户端程序的情况下所述另一方为服务端程序;或者,在所述一方为服务端程序的情况下所述另一方为客户端程序。7.根据权利要求6所述的方法,其中,还包括:根据所述另一方接收到所述序列化数据和所述预定字段中的数据进行反序列化处理,其中,进行反序列化处理包括:对所述序列化数据进行反序列化处理得到所述其他字段中的数据,并获取第二地址值;其中,所述第二地址值上保存的数据为通过网络传输后所述另一方保存下来的所述预定字段中的数据;将所述其他字段中的数据和所述第二地址值提供给所述另一方,其中,所述第二地址值被所述另一方用于获取所述预定字段中的数据。8.根据权利要求7所述的方法,其中,根据所述另一方接收到所述序列化数据和所述预定字段中的数据进行反序列化处理包括:对所述另一方所在的设备用于保存所述序列化数据和所述预定字段中的数据的内存进行分割,得到保存所述序列化数据的内存和保存所述预定字段中的数据的内存;根据所述序列化数据的长度新申请内存,并将对所述序列化数据进行反序列化处理后得到的所述其他字段中的数据保存新申请的内存中;获取保存所述预定字段中的数据的内存的地址,其中,所述保存所述预定字段中的数据的内存的地址为所述第二地址值。9.根据权利要求6至8中任一项所述的方法,其中,所述预定字段为字段中数据的长度超过阈值的字段。10.一种远程过程调用中的数据处理方法,包括:远程过程调用的一方获取序列化后的数据,其中,所述序列化后的数据是将待传输数据中的部分数据进行序列化处理后得到的;所述一方将所述序列化后的数据和所述待传输数据中的另一部分数据发送给远程过程调用的另一方,其中,所述另一部分数据是所述待传输数据中除所述部分数据以外的其他数据,所述另一部分数据未经过序列化处理;所述另一方接收所述序列化后的数据和所述另一部分数据,并获取将所述序列化后的数据进行反序列化得到所述部分数据;所述另一方根据所述部分数据和所述另一部分数据得到的所述待传输数据。11.一种远程过程调用中的数据处理系统,包括:远程过程调用的一方和另一方,在所述一方为客户端程序的情况下所述另一方为服务端程序;或者,在所述一方为服务端程序的情况下所述另一方为客户端程序,其中,所述一方包括:第一获取模块和发送模块,其中所述第一获取模块用于获取序列化后的数据,其中,所述序列化后的数据是将待传输数据中的部分数据进行序列化处理后得到的;所述发送模块用于将所述序列化后的数据和所述待传输数据中的另一部分数据发送给远程过程调用的另一方,其中,所述另一部分数据是所述待传输数据中除所述部分数据以外的其他数据,所述另一部分数据未经过序列化处理;所述另一方包括接收模块和第二获取模块,其中所述接收模块用于接收所述序列化后的数据和所述另一部分数据;所述第二获取模块用于获取将所述序列化后的数据进行反序列化得到所述部分数据,并根据所述部分数据和所述另一部分数据得到的所述待传输数
据。12.根据权利要求11所述的系统,其中,所述待传输数据包括多个字段,所述另一部分数据为所述多个字段中的预定字段中的数据,所述部分数据为所述多个字段中的其他字段中的数据,所述预定字段为满足预定条件的字段,所述其他字段为所述待传输数据中除所述预定字段之外的字段;所述预定字段为字段中数据的长度超过阈值的字段。13.根据权利要求11所述的系统,其中,还包括:信息转换库,用于进行序列化处理和/或反序列化处理;其中,所述信息转换库用于执行权利要求6至9中任一项所述的方法以进行所述序列化处理和/或所述反序列化处理。14.一种可读存储介质,其上存储有计算机指令,其中,该计算机指令被处理器执行时实现权利要求1至5任一项所述的方法步骤,或者实现权利要求6至9中任一项所述的方法步骤。
技术总结本申请公开了一种远程过程调用中的数据处理方法和系统,该方法包括:远程过程调用的一方获取待传输数据,其中,所述待传输数据中包括至少一个字段;所述一方获取序列化数据以及预定字段中的数据,其中,所述序列化数据是对所述待传输数据的其他字段中的数据进行序列化后得到的,所述其他字段为所述待传输数据中除预定字段之外的字段,所述预定字段为满足预定条件的字段,所述预定字段中的数据未经过序列化处理;所述一方将所述序列化数据以及所述预定字段中的数据发送给远程过程调用的另一方。通过本申请解决了RPC流程中序列化处理开销较大导致RPC无法满足要求的问题,进而节约了序列化处理中的内存拷贝的开销,提高了RPC的处理效率。RPC的处理效率。RPC的处理效率。
技术研发人员:丁宇
受保护的技术使用者:阿里巴巴(中国)有限公司
技术研发日:2022.07.20
技术公布日:2022/11/1