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

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

【技术实现步骤摘要】

本专利技术涉及电信联机交易方法,尤其是大规模并发联机交易系统中的软件版本动态更新问题,根据组件注册表自动实现软件的同步更新。
技术介绍
电信业务支撑系统是一个大规模的并发联机交易系统,需要为全省数千万电信用户提供各种电信服务,其中用户在营业前台所办理的开户、缴费、查询等业务都属于必须实时完成的联机交易(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接口形式。附本文档来自技高网
...

【技术保护点】
大规模并发联机交易中基于版本的C/C++组件热插拔方法,其特征是首先通过代理使客户(client)和服务(server)之间的调用隔离,由代理动态决定使用哪个动态库的哪个函数;在unix环境中通过dlopen和dlsym来实现此功能;   同时设计一个组件注册表,登记每个组件的版本,来解决多个组件同步更新问题;当一个业务依赖许多组件时,组件与组件之间由于依赖关系,必须保证版本的一致,代理根据组件注册表统一管理动态库,其查询服务句柄流程如下:客户端调用代理查询某服务句 柄,代理首先检查组件注册表是否修改;如果修改则重新读取整个注册表;然后查询是否有该组件的动态库处于打开状态,如果该组件的动态库没有处于打开状态,则根据注册表中登记的版本打开该组件动态库,如果该组件动态库处于打开状态,则需要判断该库的版本是否和注册表中登记的版本是否一致,如果不一致则需要关闭该动态库,重新打开新的动态库;最后在库中查找函数句柄并返回。

【技术特征摘要】
1.大规模并发联机交易中基于版本的C/C++组件热插拔方法,其特征是首先通过代理使客户(client)和服务(server)之间的调用隔离,由代理动态决定使用哪个动态库的哪个函数;在unix环境中通过dlopen和dlsym来实现此功能;同时设计一个组件注册表,登记每个组件的版本,来解决多个组件同步更新问题;当一个业务依赖许多组件时,组件与组件之间由于依赖关系,必须保证版本的一致,代理根据组件注册表统一管理动态库,其查询服务句柄流程如下客户端调用代理查询某服务句柄,代理首先检查组件注册表是否修改;如果修改则重新读取整个注册表;然后查询是否有该组件的动态库处于打开状态,如果该组件的动态库没有处于打开状态,则根据注册表中登记的版本打开该组件动态库,如果该组件动态库处于打开状态,则需要判断该库的版本是否和注册表中登记的版本是否一致,如果不一致则需要关闭该动态库,重新打开新的动态库;最后在库中查找函数句柄并...

【专利技术属性】
技术研发人员:陆忠亮张家荣束善杭
申请(专利权)人:南京联创科技股份有限公司
类型:发明
国别省市:84[中国|南京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1