首页> 中国专利> 大规模并发联机交易中基于版本的C/C++组件热插拔方法

大规模并发联机交易中基于版本的C/C++组件热插拔方法

摘要

本发明公开了一种大规模并发联机交易中基于版本的C/C++组件热插拔方法,其特征是通过代理使客户(client)和服务(server)之间的调用隔离,由代理动态决定使用哪个动态库的哪个函数;在unix环境中通过dlopen和dlsym来实现此功能。本发明解决了大规模并发联机交易系统中的软件版本动态更新问题,尤其是在不间断系统运行的情况下,根据组件注册表自动实现软件的同步更新。

著录项

  • 公开/公告号CN1987774A

    专利类型发明专利

  • 公开/公告日2007-06-27

    原文格式PDF

  • 申请/专利权人 南京联创科技股份有限公司;

    申请/专利号CN200610098059.4

  • 发明设计人 陆忠亮;张家荣;束善杭;

    申请日2006-11-29

  • 分类号G06F9/44(20060101);

  • 代理机构32112 南京天翼专利代理有限责任公司;

  • 代理人汤志武

  • 地址 210013 江苏省南京市定淮门12号16楼

  • 入库时间 2023-12-17 18:46:19

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-01-18

    未缴年费专利权终止 IPC(主分类):G06F9/44 授权公告日:20081022 终止日期:20151129 申请日:20061129

    专利权的终止

  • 2014-11-19

    专利权人的姓名或者名称、地址的变更 IPC(主分类):G06F9/44 变更前: 变更后: 申请日:20061129

    专利权人的姓名或者名称、地址的变更

  • 2011-10-05

    专利权人的姓名或者名称、地址的变更 IPC(主分类):G06F9/44 变更前: 变更后: 申请日:20061129

    专利权人的姓名或者名称、地址的变更

  • 2010-05-26

    专利权的转移 IPC(主分类):G06F9/44 变更前: 变更后: 登记生效日:20100419 申请日:20061129

    专利申请权、专利权的转移

  • 2009-01-21

    专利实施许可合同的备案 合同备案号:2008320001106 让与人:南京联创科技股份有限公司 受让人:联创科技(南京)有限公司 发明名称:大规模并发联机交易中基于版本的C/C++组件热插拔方法 授权公告日:20081022 许可种类:排他许可 备案日期:20081124 合同履行期限:2008.11.4至2026.11.29合同变更 申请日:20061129

    专利实施许可合同的备案

  • 2008-10-22

    授权

    授权

  • 2007-08-22

    实质审查的生效

    实质审查的生效

  • 2007-06-27

    公开

    公开

查看全部

说明书

技术领域

本发明涉及电信联机交易方法,尤其是大规模并发联机交易系统中的软件版本动态更新问题,根据组件注册表自动实现软件的同步更新。

背景技术

电信业务支撑系统是一个大规模的并发联机交易系统,需要为全省数千万电信用户提供各种电信服务,其中用户在营业前台所办理的开户、缴费、查询等业务都属于必须实时完成的联机交易(OLTP),一般情况下每天的交易量可在100万笔以上,而高峰时段每分钟的并发交易量可达4000笔以上,联机交易系统的可用性直接影响电信用户的满意度。随着电信市场的改革开放和市场竞争的日趋白热化,电信业务支撑系统的业务需求不断变更,应用软件的版本不断需要升级换代。如何在不中断或减少中断时间的要求下,快速更新软件、提高大规模并发联机交易服务的可用性成为一个重要课题。实现动态的组件热插拔就是一个很好的解决方案。如CN02111249.5统一访问数据库系统的方法:创建数据库连接池;对各数据库系统的底层调用接口按功能进行分类;根据分类,封装底层调用接口;将封装好的统一数据库接口做成动态库;通过数据库进行读或写访问。所述方法由于所封装的接口均为各数据库系统的最高效的底层调用接口,实测表明,效率比采用ODBC技术高出20%~30%,提高了数据库的访问速度,提高了系统的处理能力;封装了多种数据库系统的底层接口。

在java编程语言中,由于java支持多个类装载器(ClassLoader),也可以自定义类装载器,可以自行决定加载哪个类。不同的类装载器可以加载不同版本的类,也可以在运行时刻动态的加载一个新类,不使用的类也会被虚拟机(JVM)自动回收。利用这些机制,实现动态的组件热插拔就很容易了。

但在目前的电信业务支撑系统中,由于安全、高效等各方面的原因,目前普遍使用传统的交易中间件(如tuxedo、cics等),使用的语言都是C/C++,诸如weblogic、websphere等只用于网上营业厅等接入,而核心的业务层基本都是在C/C++中实现。C/C++是一个相对静态的语言,函数之间的调用,都是在编译时刻决定的,要在语言层实现动态热插拔机制几乎不可能。

所以,目前一般方法是在交易请求不繁忙的深夜中断服务,更新服务软件(组件),然后重启,以减少由于服中断而造成的影响。

另一种方法使用软件和硬件结合的方法,即利用两台互备的机器(A、B),当需要更新的时候,修改路由表,使所有交易自动定向到B机,然后在A机上更新程序,并进行必要的测试,然后修改路由表,使所有的服务全部自动定向到A,更新B机,完毕后,修改路由配置,使A和B机都能接受交易请求。这种方案比较可靠,但成本比较昂贵。

发明内容(本发明要解决的技术问题、所采用的技术方案、效果简介)

发明内容

本发明目的是提出一种大规模并发联机交易中基于版本的C/C++组件热插拔方法,为了解决大规模并发联机交易系统中的软件版本动态更新问题而发明的,尤其是在不间断系统运行的情况下,根据组件注册表自动实现软件的同步更新。

本发明的技术解决方案是:大规模并发联机交易中基于版本的C/C++组件热插拔方法,实现客户(client)和服务(server)的隔离。也是解决同步更新的首要问题。在通常情况下,使用的方法有:

(1)客户直接调用服务函数,即在程序编译时就决定了使用哪个函数,

如果服务逻辑变化,则需要整体重新编译。

(2)把一个个业务服务包做成动态库,然后客户程序只是连接(link)。

业务服务包做成的动态库,这种方法好处是在启动程序的时候决定使用那个动态库,更新时可以只编译服务程序,客户程序可以不做任何动作(当然前提是接口没有作变化)。

很多系统在处理这一问题时,一般采用方法(2),但如果更新则必须重启程序。那么如何在运行时刻动态更换动态库呢?本发明的解决方案描述如下:

(一)定义一个代理实现运行时刻动态切换服务版本

如图1,在客户和服务之间使用代理作隔离,由代理动态决定使用哪个动态库的哪个函数,即可解决在运行时刻动态切换服务版本的问题。在unix环境中可以通过dlopen和dlsym来实现此功能。

(二)定义一个组件注册表用于保存每个动态库所使用的版本

同时需要设计一个组件注册表,登记每个组件的版本,来解决多个组件同步更新问题,因为一个业务往往依赖许多组件时,组件与组件之间由于依赖关系,为了保证逻辑的一致性,必须保证版本的一致,代理根据组件注册表统一管理动态库,其查询服务句柄流程如下:

客户端调用代理查询某服务句柄,代理首先检查组件注册表是否修改;如果修改则重新读取整个注册表;然后查询是否有该组件的动态库处于打开状态,如果该组件的动态库没有处于打开状态,则根据注册表中登记的版本打开该组件动态库,如果该组件动态库处于打开状态,则需要判断该库的版本是否和注册表中登记的版本是否一致,如果不一致则需要关闭该动态库,重新打开新的动态库;最后在库中查找函数句柄并返回。

动态切换可以通过代理解决,但一个业务往往使用很多组件,如何控制切换,以及如何保证在切换过程中的版本的一致,如图2,A组件依赖B、C、D,B依赖E,假设A、B、C、D、E都作了修改,更新时必须保证同时更新,否则会造成版本不一致,业务逻辑错误。所以在此设计一个组件注册表,用于登记每个动态库所使用的版本,代理根据组件注册表统一管理动态库。

查询服务句柄流程如下(见图3):客户端调用代理查询某服务句柄,代理首先检查组件注册表是否修改;如果修改则重新读取整个注册表;然后查询是否有该组件的动态库处于打开状态,如果该组件的动态库没有处于打开状态,则根据注册表中登记的版本打开该组件动态库,如果该组件动态库处于打开状态,则需要判断该库的版本是否和注册表中登记的版本是否一致,如果不一致则需要关闭该动态库,重新打开新的动态库;最后在库中查找函数句柄并返回。

编写(静态)代理的方法如下:首先使用typedef定义服务接口函数的类型,然后定义接口函数代理实现,该函数实现与客户端程序静态联编。客户端真正调用到的是代理函数,而非服务函数。代理函数根据组件名和函数名,通过上述的“查询服务句柄流程”获得服务句柄,然后强制类型转换为服务接口函数的类型,最后才真正执行服务函数的调用。

编写组件注册表的方法是:在正式环境中,定义一个文件,文件的每一行由“组件名=版本号”构成,登记所有组件的当前版本。系统作更新时,只需要把更新的组件以添加的方式,登记在文件的顶部,这样可以保留系统的变更历史,程序在读取注册表时,以最先匹配到的版本为准。修改注册表时,必须在副本上进行,修改完毕后,覆盖正式版本,必须一次提交,否则会造成组件之间版本混乱问题。

(三)注册表更新机制

在运行环境中,所有的服务进程共享一个注册表,所以注册表更新必须考虑互斥,即在更新注册表时进程不能读取。因此,需要为注册表准备两份,一份是在线注册表,另一份是注册表副本,在更新版本时,首先修改副本,修改完毕后,锁定在线注册表,防止进程读取不完整的信息,最后提交。注册表更新流程如图4。

本发明中热插拔组件的适用范围:

a)服务组件必须是无状态的,因为切换时不会自动把状态复制到新的实例中。

b)接口不能变化,否则需要全部重编译,并且修改代理部分的代码。

c)要求接口的代码必须是C形式,因为C++支持函数的重载,所以函数名都被改名,如果组件是C++的,可以编写一段C程序封装成C接口形式。

附图说明

图1是本发明客户和软件服务之间由代理动态的结构示意图

图2是本发明组件依赖下层组件的示意图

图3是代理根据组件注册表统一更新动态库的流程示意图

图4是更新注册表流程

图5是客户程序通过静态代理库调用组件的函数示意图

具体实施方式

下面以一个例子说明实施步骤,组件echo只是简单返回传入的字符串,客户程序通过静态代理库,调用组件echo的函数。

1、编写组件echo

#ifndef ECHO_H#define ECHO_H#include<string>using namespace std;extern″C″{   string echo(const string & str);}

echo.h文件

#include″echo.h″extern″C″{    string echo(const string & str){           return″echo:″+str;    }}

echo.c文件

2、编译echo.c,并连接生成libecho-1.0.so echo.h文件echo.c文件

3、编写组件注册表

4、编写静态代理(可以使用工具生成)

首先使用typedef定义服务接口函数的类型,然后定义接口函数代理实现,该函数实现与客户端程序静态联编。代理函数根据组件名和函数名,通过查询服务句柄的函数获得服务句柄,然后强制类型转换为服务接口函数的类型,最后执行服务函数的调用。实现如下:

#include″echo.h″extern″C″{  typedef string(*echo_f)(const string &);  string echo(const string & str){     //通过服务句柄查询函数获得句柄     void*handle=findhandle(“echo”,//组件名echo                             “echo”);//函数名echo     string result=((echo_f)handle)(str);     return result;  }}

5、编译echo_proxy.c,并打包生成libecho.a

6、编写客户端

7、编译echo_client.c并连接libecho.a,生成echoclient

8、执行echoclient

9、更新组件,修改输出格式

10、编译echo.c,并连接生成libecho-2.0.so

编写组件注册表,在正式环境中,一般需要修改多个动态库,以保证版本一致组件注册表

#动态库名和版本号

#以第一个指定的版本为准

#patch 2.0修改转换方式

echo=2.0

#初始版本

echo=1.0

11、编写组件注册表,在正式环境中,一般需要修改多个动态库,以保证版本一致

#组件注册表#动态库名和版本号#以第一个指定的版本为准#patch 2.0修改转换方式echo=2.0#初始版本

12、查看测试程序的输出

#include″echo.h″extern″C″{     string echo(const string & str){          return″echo(ver 2.0):″+str;     }}

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号