掌桥专利:专业的专利平台
掌桥专利
首页

一种基于专用通道的远程函数调用方法

文献发布时间:2023-06-19 16:08:01



技术领域

本发明属于数据存储技术领域,具体涉及一种基于专用通道的远程函数调用方法。

背景技术

远程函数调用在多机应用程序开发中应用广泛,特别是在许多大型的集群系统中,远程函数调用通常是通过其底层标准的通信模块实现。现有许多开源的远程函数调用框架,但其通信接口大多使用TCP/IP协议,或者是应用层的HTTP协议,不支持专用通道上的定制化协议。在专用通道上,为了贴合通道特性、获取最优性能,用户通常会实现特定的通信协议,这类协议不支持TCP/IP协议上的通用SOCKET编程函数,所以无法使用主流的开源远程函数调用框架。远程函数调用不仅能够提高系统通信性能,而且能够简化开发流程,缩短开发周期,是集群系统编程中常用的中间件。因此基于专用通道设计研发一套远程函数调用方法对于专用系统开发意义重大。

发明内容

(一)要解决的技术问题

本发明要解决的技术问题是:如何为无法使用通用TCP/IP协议以及SOCKET编程的专用通道提供底层的远程函数调用方法。

(二)技术方案

为了解决上述技术问题,本发明提供了一种基于专用通道的远程函数调用方法,包括以下步骤:

第一步,设计一个可同时在服务端和客户端使用的远程函数调用动态库,提供客户端的函数调用接口与回调函数接口,同时提供服务端的注册服务接口,以及提供支持不同网络协议的通信接口;所述远程函数调用动态库内部分为应用层、处理层和通信层,其中,应用层负责与外部接口交互,以及转发数据到处理层和接收处理层的数据;处理层负责数据编码、解码与分发,解耦通信层的工作;通信层则根据提供的接口协议收发数据;

第二步,提出线程池设计方法

首先是初始化流程,客户端通过特定的协议与服务端建立连接,客户端按照系统硬件性能创建相应数量的线程,形成线程池,等待函数任务唤醒执行,每个线程持有一份与服务端的连接,每份连接包括多种协议的句柄;

在完成线程池的初始化后,应用程序即可发起远程函数的调用,其中,允许应用程序采用异步的方式进行调用,应用程序只需要传入函数名、参数以及回调函数信息就可以返回,客户端会将这些数据打包并放入待执行函数队列中,而线程池中的所有线程都在轮询待执行函数队列,空闲的线程会将数据取出并发送至服务端;

最后,发送数据的线程会阻塞等待服务端返回,并解析收到的数据,调用相应的回调函数,完成本次远程函数调用;

第三步,提出哈希索引服务设计方法

用户首先注册供远端应用程序调用的函数服务,即编写相应的函数处理代码,并将函数名保存在远程服务集合中;

服务端在接收到用户的服务注册请求后,将函数名与参数信息进行哈希处理,并将哈希值与相应的函数调用地址建立映射关系,保存到哈希表中,之后如果服务端接收到来自客户端的远程调用,则解析数据,获取到函数名和参数信息,就可通过查找该哈希表找到对应需要执行的函数,如果查表获取到函数调用地址,则执行相应函数、获取返回值并返回客户端;如果未查找到相应函数,则返回远程调用不存在的错误信息;

第四步,提出多通信协议设计方法

首先用户将通信协议中完成listen、accept、connect、read、write功能的函数与远程函数调用动态库的通信层提供的桩函数完成绑定,后续只需要在调用的时候提供指定的协议库结构体,桩函数就会使用相应的协议建立连接并传输数据;在初始化线程池时,也可提供多种协议的连接信息,使得每个线程持有多种连接,保证在函数调用时指定的协议方法能够正常执行;

第五步,基于第一步、第三步、第四步执行服务端预备流程;

第六步,基于第二步执行客户端预备流程;

第七步,基于第一步执行远程函数调用流程:当客户端与服务端完成了预备流程后,应用程序即在此基础上进行任意次数的远程函数调用,执行用户任务。

优选地,第五步具体为:首先,按照多通信协议设计方法新建协议库结构体,完成所有桩函数的映射,相关数据保存在远程函数调用动态库的通信层,这一步的代码由用户提供,协议库结构体记录了各个桩函数实际需要调用的函数地址,随后桩函数被调用时即可根据传入的协议库结构体调用真正的通信函数进行数据传输;然后,启动服务端的监听线程,该线程调用listen桩函数,按照指定的协议对通信端口进行监听;在监听到客户端的请求后,调用accept桩函数建立连接,并建立新线程处理该连接上的读写;最后,用户在远程函数调用动态库的应用层注册所有对外提供的函数服务,按照哈希索引服务设计方法将用户提供的函数名与参数进行哈希,与最终提供服务的函数地址进行绑定存入哈希表,至此,服务端的工作就完成了,后续可通过创建新的协议库结构体添加新的协议,也可通过继续注册新的函数服务完善远程服务集合。

优选地,第六步具体为:当一个网络节点提供远程函数调用服务后,同一网络中的其他节点都可以启动客户端程序访问该远程节点上的服务;客户端首先同样新建协议库结构体,以便后续按照指定协议收发数据,然后客户端按照线程池设计方法初始化线程池,此时传入多种协议的结构信息,进而通过多种协议与服务端建立连接。

优选地,第七步中单次远程函数调用的流程如下:

客户端与远程函数调用动态库的应用层交互,使用rpc_call函数将函数名、参数以及协议库结构体传入远程函数调用动态库的通信层,阻塞等待函数返回;或通过sync_rpc_call函数异步调用远程函数,异步调用时额外传入回调函数,以便远程函数调用动态库在完成远程调用后执行;应用程序的信息传入远程函数调用动态库的应用层后将任务转给处理层,即,将数据存入待执行函数队列,等待线程池中的空闲线程取出并通过此线程专有的连接通道传递到服务端;服务端在接收到数据后,根据参数长度解析后续不定长的函数参数数据;在服务端接收并解析完所有数据后,通过哈希表查找到需要远端节点执行的函数,传递相应的参数,获取函数执行结果;最后通过客户端建立的所述连接通道将函数执行结果返回,客户端如果是异步模式则调用回调函数,如果是同步模式则返回服务端执行的结果。

优选地,第四步提出的多通信协议设计方法实现了对专用通道及其专用协议的支持,并且兼容常用的TCP/IP协议,而且可以添加新的协议,多协议同时工作。

优选地,其特征在于,在客户端可通过使用线程池来优化系统性能。

优选地,其特征在于,在服务端可通过使用哈希表加速数据分发流程。

优选地,第七步中,传递到服务端的数据以特定的结构封装。

优选地,所述特定的结构为包括:RPC版本、域名、函数名、参数长度、函数参数数据这些信息。

本发明还提供了一种所述方法在数据存储技术领域中的应用。

(三)有益效果

本发明的方法中形成独立的远程函数调用动态库,并通过线程池高性能调度应用程序发起的远程调用,通过哈希表快速索引远程服务集合、分发数据并收集返回函数执行结果,通过桩函数使用不同的通信协议收发数据,并且可以添加新的通信协议,进而对外提供了完整的函数调用、服务注册、协议替换接口。本发明创新性地实现了支持多通信协议的远程函数调用方法,在保证数据传输效率的同时,提供了规范的程序调用方法,简化了多机应用程序的开发流程。

附图说明

图1为本发明中的远程函数调用动态库架构图;

图2为本发明中的线程池相关的数据结构以及处理流程;

图3为本发明中的多通信协议调用图;

图4为本发明中的数据包格式示意图。

具体实施方式

为使本发明的目的、内容、和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。

为简化专用系统的开发流程,提高上层集群系统的开发效率,提高数据读写性能,本发明设计了一套基于专用通道的远程函数调用方法。该方法旨在为无法使用通用TCP/IP协议以及SOCKET编程的专用通道提供底层的远程函数调用方法。该方法中形成独立的远程函数调用动态库,并通过线程池高性能调度应用程序发起的远程调用,通过哈希表快速索引远程服务集合、分发数据并收集返回函数执行结果,通过桩函数使用不同的通信协议收发数据,并且可以添加新的通信协议,进而对外提供了完整的函数调用、服务注册、协议替换接口。本发明创新性地实现了支持多通信协议的远程函数调用方法,在保证数据传输效率的同时,提供了规范的程序调用方法,简化了多机应用程序的开发流程。

如图1所示,本发明提出的一种基于专用通道的远程函数调用方法包括以下步骤:

第一步,设计一个可以同时在服务端和客户端使用的远程函数调用动态库,提供客户端的函数调用接口与回调函数接口,同时提供服务端的注册服务接口,最为关键的是提供支持不同网络协议的通信接口;整个远程函数调用动态库内部分为应用层、处理层和通信层,其中,应用层负责与外部接口交互,以及转发数据到处理层和接收处理层的数据;处理层负责高性能的数据编码、解码与分发,解耦通信层的工作;通信层则根据提供的接口协议收发数据。

第二步,提出高性能线程池设计方法

本发明在客户端主要通过使用线程池来优化系统性能,图2描述了线程池相关的数据结构以及处理流程,主要分为初始化、执行函数、处理返回值三个部分。

具体而言,高性能线程池设计方法包括以下步骤:

首先是初始化流程,客户端通过特定的协议与服务端建立连接,客户端按照系统硬件性能(CPU核心、内存等信息)创建相应数量的线程,形成线程池,等待函数任务唤醒执行,每个线程持有一份与服务端的连接,每份连接包括多种协议的句柄;

在完成线程池的初始化后,应用程序即可发起远程函数的调用,其中,本发明允许应用程序采用异步的方式进行调用,应用程序只需要传入函数名、参数以及回调函数信息就可以返回,客户端会将这些数据打包并放入待执行函数队列中,而线程池中的所有线程都在轮询待执行函数队列,空闲的线程会将数据取出并发送至服务端。

最后,发送数据的线程会阻塞等待服务端返回,并解析收到的数据,调用相应的回调函数,完成本次远程函数调用。

第三步,提出哈希索引服务设计方法

本发明在服务端主要通过使用哈希表加速数据分发流程,提高数据处理性能。用户首先需要注册供远端应用程序调用的函数服务,即编写相应的函数处理代码,并将函数名保存在远程服务集合中;

服务端在接收到用户的服务注册请求后,将函数名与参数信息进行哈希处理,并将哈希值与相应的函数调用地址建立映射关系,保存到哈希表中,之后如果服务端接收到来自客户端的远程调用,则解析数据,获取到函数名和参数信息,就可以通过查找该哈希表找到对应需要执行的函数,如果查表获取到函数调用地址,则执行相应函数、获取返回值并返回客户端;如果未查找到相应函数,则返回远程调用不存在的错误信息。

第四步,提出多通信协议设计方法

本发明实现了对专用通道及其专用协议的支持,并且兼容常用的TCP/IP协议,而且可以添加新的协议,多协议同时工作。

如图3所示,首先用户需要将通信协议中完成listen、accept、connect、read、write功能的函数与远程函数调用动态库的通信层提供的桩函数完成绑定,后续只需要在调用的时候提供指定的协议库结构体,桩函数就会使用相应的协议建立连接并传输数据;在初始化线程池时,也可提供多种协议的连接信息,使得每个线程持有多种连接,保证在函数调用时指定的协议方法能够正常执行。

第五步,基于第一步、第三步、第四步执行服务端预备流程

首先,按照多通信协议设计方法新建协议库结构体,完成所有桩函数的映射,相关数据保存在远程函数调用动态库的通信层。这一步主要代码由用户提供,协议库结构体记录了各个桩函数实际需要调用的函数地址。随后桩函数被调用时即可根据传入的协议库结构体调用真正的通信函数进行数据传输。然后,启动服务端的监听线程,该线程调用listen桩函数,按照指定的协议对通信端口进行监听。在监听到客户端的请求后,会调用accept桩函数建立连接,并建立新线程处理该连接上的读写。最后,用户需要在远程函数调用动态库的应用层注册所有对外提供的函数服务。该操作按照哈希索引服务设计方法将用户提供的函数名与参数进行哈希,与最终提供服务的函数地址进行绑定存入哈希表。至此,服务端的工作就完成了,后续可以通过创建新的协议库结构体添加新的协议,也可以通过继续注册新的函数服务完善远程服务集合。

第六步,基于第二步执行客户端预备流程

当一个节点提供远程函数调用服务后,同一网络中的其他节点都可以启动客户端程序访问该远程节点上的服务。客户端首先同样需要新建协议库结构体,以便后续按照指定协议收发数据。然后客户端按照高性能线程池设计方法初始化线程池,此时可以传入多种协议的结构信息,进而通过多种协议与服务端建立连接。如果在此阶段未建立特定协议的连接,后续就无法使用相关协议进行远程函数调用。

第七步,基于第一步执行远程函数调用流程

当客户端与服务端完成了上述预备流程后,应用程序即可在此基础上进行任意次数的远程函数调用,执行用户任务。单次远程函数调用流程如下:

客户端只需要与远程函数调用动态库的应用层交互,使用rpc_call函数将函数名、参数以及协议库结构体传入远程函数调用动态库的通信层,阻塞等待函数返回;也可以通过sync_rpc_call函数异步调用远程函数,异步调用需要额外传入回调函数,以便远程函数调用动态库在完成远程调用后执行。应用程序的信息传入远程函数调用动态库的应用层后将任务转给处理层,即,将数据存入待执行函数队列,等待线程池中的空闲线程取出并通过此线程专有的连接通道传递到服务端。传递的数据以图4所示的结构封装,服务端在接收到数据后,可根据参数长度解析后续不定长的函数参数数据。在服务端接收并解析完所有数据后,通过哈希表查找到需要远端节点执行的函数,传递相应的参数,获取函数执行结果。最后还是通过上述客户端建立的连接通道将函数执行结果返回,客户端如果是异步模式则调用回调函数,如果是同步模式则返回服务端执行的结果。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

相关技术
  • 一种基于专用通道的远程函数调用方法
  • 一种基于VPN专用通道的远程通讯装置
技术分类

06120114714555