EJB业务处理方法、装置、设备及介质与流程

文档序号:21406585发布日期:2020-07-07 14:40阅读:247来源:国知局
EJB业务处理方法、装置、设备及介质与流程

本发明涉及计算机技术领域,尤其涉及一种ejb业务处理方法、装置、设备及介质。



背景技术:

目前针对java平台企业版(javaplatformenterpriseedition,javaee)类应用的三层架构,在万维网(worldwideweb,简称web)调用企业java组件(enterprisejavabean,ejb)时,高可用保证主要依赖于第三方组件。

目前的java平台企业版(javaplatform,enterpriseedition,javaee)中,ejb客户端调用ejb实例的高可用方案如图1所示,(1)负载均衡器请求转发策略等一些复杂的负载配置;(2)ejb客户端发出业务请求;(3)负载均衡器根据配置与ejb服务端的ejb实例建立连接,ejb客户端的业务请求直接提交给后端对应的ejb实例上;(4)若后端存在可用的ejb实例,ejb客户端与后端可用的ejb实例直接建立长连接,如果后端不存在可用的ejb实例,直接返回错误信息;(5)ejb实例处理完请求直接将结果返回ejb客户端进行处理。

现阶段方案有如下的缺点:

1、由于需要依赖于第三方的负载均衡设备,因此,请求流转环节增加,网络层的开销增大,请求处理效率也降低,维护成本增大。

2、后端的ejb列表是静态的,无法自动调整ejb列表,因此ejb列表中的ejb实例很有可能是异常的,导致将业务请求分发给异常的ejb实例。



技术实现要素:

本发明实施例提供了一种ejb业务处理方法、装置、设备及介质,能够免于依赖第三方的负载均衡设备,而且动态更新状态正常的ejb实例,保证ejb实例的高可用性。

第一方面,本发明实施例提供了一种ejb业务处理方法,应用于ejb客户端,所述的方法包括:

确定ejb集群中ejb实例的状态,以动态更新第一集合,所述第一集合中包括状态正常的ejb实例;

基于预先定制的序列化协议,将多个业务请求负载均衡分发给所述第一集合中的ejb实例。

第二方面,本发明实施例提供了一种ejb业务处理装置,应用于ejb客户端,所述的装置包括:

第一动态更新模块,用于确定ejb集群中ejb实例的状态,以动态更新第一集合,所述第一集合中包括状态正常的ejb实例;

请求分发模块,用于基于预先定制的序列化协议,将多个业务请求负载均衡分发给所述第一集合中的ejb实例。

第三方面,本发明实施例提供了一种ejb业务处理设备,包括:至少一个处理器、至少一个存储器以及存储在存储器中的计算机程序指令,当计算机程序指令被处理器执行时实现如上述实施方式中第一方面的方法。

第四方面,本发明实施例提供了一种计算机可读存储介质,其上存储有计算机程序指令,当计算机程序指令被处理器执行时实现如上述实施方式中第一方面的方法。

本发明实施例提供的ejb业务处理方法、装置、设备及介质,通过从协议层实现业务请求分发的负载均衡,能够免于依赖第三方的负载均衡设备,从而减少了请求流转环节,减少了网络层的开销,请求处理效率也随之升高,节省了负载均衡设备的购买费用和维护费用。进一步地,可以动态更新状态正常的ejb实例,保证ejb实例的高可用性。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1示出了现有技术中ejb客户端与ejb服务端之间连接的示意图;

图2示出了本发明的一个实施例的ejb系统的结构示意图;

图3示出了本发明的一个实施例的ejb业务处理方法的流程示意图;

图4示出了本发明的一个实施例的向ejb实例分发业务请求的示意图;

图5示出了本发明的另一个实施例的向ejb实例分发业务请求的示意图;

图6示出了本发明的又一个实施例的向ejb实例分发业务请求的示意图;

图7示出了本发明的一个实施例的ejb业务处理装置的结构示意图;

图8示出了本发明一个实施例的ejb业务处理设备的硬件结构图。

具体实施方式

下面将详细描述本发明的各个方面的特征和示例性实施例,为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细描述。应理解,此处所描述的具体实施例仅被配置为解释本发明,并不被配置为限定本发明。对于本领域技术人员来说,本发明可以在不需要这些具体细节中的一些细节的情况下实施。下面对实施例的描述仅仅是为了通过示出本发明的示例来提供对本发明更好的理解。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

图2示出了本发明的一个实施例的ejb系统的结构示意图。本发明的一个实施例的ejb业务处理方法基于如图2所示的ejb系统,该ejb系统包括:

ejb客户端(ejbclient):在javaee三层架构中一般指web端。ejb客户端包括:bean接口和存根(stub)。

ejb服务端(ejbserver):在javaee三层架构中一般指业务处理层,核心逻辑代码都在ejb服务端实现。ejb服务端包括:bean应用(implementation)和框架(skeleton)。

在两个java虚拟机(javavirtualmachine,jvm)中各开一个stub和skeleton,二者通过套接字socket通信来实现参数和返回值的传递。

图3示出了本发明的一个实施例的ejb业务处理方法的流程示意图。如图3所示,该方法应用于ejb客户端,该方法包括:

s101,确定ejb集群中ejb实例的状态,以动态更新第一集合,第一集合中包括状态正常的ejb实例。

另外,还可以根据ejb集群中ejb实例的状态,动态更新第二集合,第二集合中包括状态异常的ejb实例。因此,将ejb集群中的ejb实例分为状态正常的ejb实例和状态异常的ejb实例,第一集合中的ejb实例可以存放到一个列表中,第二集合中的ejb实例可以存放到另一个列表中。

s102,基于预先定制的序列化协议,将多个业务请求负载均衡分发给第一集合中的ejb实例。

其中,序列化协议是采用二进制压缩算法的序列化协议。

在本发明实施例中,为远程调用ejb实例定制私有的序列化协议,底层的传输协议基于传输控制协议(transmissioncontrolprotocol,tcp)。通过从协议层实现业务请求分发的负载均衡,能够免于依赖第三方的负载均衡设备,从而减少了请求流转环节,减少了网络层的开销,请求处理效率也随之升高,节省了负载均衡设备的购买费用和维护费用。序列化协议采用高效的二进制压缩算法,并内置了高可用方案,相对于现有方案具备更高效,更可靠的特点。进一步地,可以动态更新状态正常的ejb实例,保证ejb实例的高可用性。

在本发明的一个实施例中,有四种实施方式将多个业务请求负载均衡分发给第一集合中的ejb实例。

实施方式一

将多个业务请求均分发给与ejb客户端对应的ejb实例上。

其中,基于会话轮询算法(sessionroundrobin)分发多个业务请求。会话轮询算法对于来自于一个ejb客户端的请求,只会将压力分配到一个ejb实例上。

ejb客户端在初始化时,将ejb集群实例列表中的实例随机排序后选取列表的第一个ejb实例,此后该ejb客户端的所有业务请求均发送到该ejb实例上。其中,业务请求包括:java命名和目录接口(javanaminganddirectoryinterface,jndi)请求和ejb请求。

如图4所示,将ejb客户端1的业务请求均分发到对应的ejb实例3上,将ejb客户端2的业务请求均分发到对应的ejb实例1上。其中,在创建新的ic(initialcontext,初始化内容)时,随机选择一个ejb实例,将ejb客户端的业务请求分发给该ejb实例。

在该实施方式中,由于将ejb集群的实例列表进行了随机排序并选取第一个ejb实例,可以避免来自于多个ejb客户端的业务请求均分配到同一个ejb实例的情况。

实施方式二

以轮询方式在第一集合中选择ejb实例,将业务请求分发给轮询选择的ejb实例。

其中,基于请求轮询算法(requestroundrobin)将多个业务请求分发给ejb实例。

比如,总共有4个ejb实例,将第一组的业务请求分发给第一个ejb实例,将第二组的业务请求分发给第二个ejb实例,将第三组的业务请求分发给第三个ejb实例,将第四组的业务请求分发给第四个ejb实例,将第五组的业务请求分发给第一个ejb实例,以此类推。

如图5所示,ejb客户端的业务请求依次分发给ejb实例1、ejb实例2和ejb实例3。需要说明的是,ejb请求会轮询选取集群中的ejb实例来处理,jndi请求则采用会话轮询算法,所有的jndi请求发送到同一个ejb实例上。无状态ejb请求依次轮询集群中的所有ejb实例,有状态ejb请求则粘滞到lookup时所选择的ejb实例。

对于轮询算法,假如集群中有n个ejb实例,存活或健康的ejb实例(即正常状态的ejb实例)为m个,当前并发的总请求数目为globalconcurrent个,则每台机器上分发的并发处理的请求的最大数目maxdispatchcount满足:

maxdispatchcount=globalconcurrent/m+((globalconcurrent%m)==0?0:1)。

实施方式三

根据第一集合中每个ejb实例的当前权重,将多个业务请求分别分发给第一集合中的ejb实例。

根据集群中ejb实例的权重来分配ejb实例来处理ejb请求和jndi请求。每次分配ejb实例时,ejb请求和jndi请求可能分配到不同的ejb实例上。

对于权重算法,假如集群中有n个ejb实例,存活或健康的ejb实例为m个,m个ejb实例的总权重为totalweight,当前并发的总请求数目为globalconcurrent个,当前分发的ejb实例的权重为weight,则当前分发实例的并发处理的请求的最大数目maxdispatchcount满足:

maxdispatchcount=globalconcurrent*weight/totalweight

+((globalconcurrent*weight)%totalweight==0?0:1)。

实施方式四

当第一集合中包括多个ejb实例时,在同一时刻将多个业务请求分发给第一集合中的不同的ejb实例。

对于连接被动断开的情况,比如已经建立的socket连接无法在短时间内检测出网线断掉或者网卡松掉,出现该种情况时,会导致ejb客户端请求卡住较长时间。如果按照传统的轮询算法(requestroundrobin)进行请求分发或者按照权重进行请求分发,会将所有业务请求都负载到网线已经断掉的ejb实例上导致整个ejb客户端瘫痪。为了解决该问题,可以通过控制请求分发来实现。在ejb客户端并发多个业务请求,并且有多个状态正常的ejb实例时,在同一时刻不允许将所有并发的业务请求负载到一个ejb实例上。如图6所示,ejb客户端在同一个时刻将三个因特网包探索器(packetinternetgrope,ping)请求分别分发给ejb实例1、ejb实例2和ejb实例3。在业务分发过程中,如果发现与ejb实例3的连接坏掉,则存根向连接管理器报告该连接已坏掉,连接管理器将连接坏掉的ejb实例从好连接列表移到坏连接列表中。

在本发明实施方式中,通过请求分发控制算法,解决现在负载均衡器在特殊连接被动断开的情况下,后端ejb实例故障发现太晚导致前台客户端的请求都分发到故障ejb实例上,前台客户端瘫痪的情况,确保前台客户端不瘫痪,提高私有序列化协议的高可用性。请求分发控制可以避免轮询算法和权重算法的一些缺陷,即使ejb实例的服务端出现网线断掉和网卡松掉的情况,ejb客户端不会瘫痪,解决已建立连接无法及时检测出故障ejb实例的情况。

在本发明的一个实施例中,s101包括:

根据ejb集群的ejb实例列表,向ejb实例列表中的ejb实例发送连接请求;根据与ejb实例的连接结果,确定ejb实例的状态;和/或,通过应用程序接口api,接收来自ejb服务端的ejb实例的监控指标;根据监控指标,确定ejb实例的状态。

其中,ejb客户端包括连接管理器,连接管理器用于确定ejb集群中ejb实例的状态。

作为一个示例,连接管理器在初始化时,会根据用户配置的ejb实例列表来创建连接。其中,用户配置的ejb实例列表中包含实例ip和端口信息。连接管理器会依次向ejb实例列表中的所有ejb实例发送请求来验证ejb实例是否正常,这是主动检测手段。还可以通过api接收ejb实例的监控指标,以监测ejb实例的状态。将ejb实例列表中能够正常访问或者指标正常的实例,放入到好连接列表中,好连接列表中的ejb实例组合的集合是第一集合。如果ejb实例列表中存在不能访问或者指标异常的实例,则将其放入坏连接列表中,坏连接列表中的ejb实例组合的集合是第二集合。

在本发明实施例中,实时更新ejb实例的动态,可以更加准确地判断ejb实例的状态情况,使得ejb实例的高可用性更有保证。基于协议实现了故障转移,ejb集群的状态实时更新,无需针对第三方负载均衡器做重加载的操作和重启操作。

在本发明的一个实施例中,该方法还包括:

在分发多个业务请求的过程中,若与第一集合中的ejb实例的连接中断,则将该连接中断的ejb实例从第一集合中删除,将该连接中断的ejb实例添加到第二集合中。

在本发明的一个实施例中,该方法还包括:

在分发多个业务请求的过程中,若第一集合为空,则向第二集合中的ejb实例发送连接请求;若与第二集合中的ejb实例连接成功,则将多个业务请求中的至少一个请求分发给该连接成功的ejb实例。

作为一个示例,如果没有状态正常的ejb实例可以使用,则连接管理器尝试从坏连接列表中恢复连接,如果恢复与坏连接列表中的ejb实例的连接,则将恢复连接的ejb实例放入好连接列表中,业务调用继续。如果没有ejb实例可以恢复连接,则业务请求失败。

在本发明的一个实施例中,该方法还包括:

从第一集合中选择待询问ejb实例,向待询问ejb实例询问ejb集群中各个ejb实例的状态;根据待询问ejb实例反馈的结果,更新第一集合和第二集合中的ejb实例。

需要说明的是,ejb服务端通过组服务(gms)来维护好连接列表和坏连接列表,任何一个集群实例均可获取当前集群的好连接列表和坏连接列表,所以连接管理器可以向任何一个ejb实例询问当前集群的ejb实例状态,实时构建动态集群,从而确保业务请求被分发到正常状态下的ejb实例上。如果开启负载均衡,则根据来自ejb服务端的好连接列表、坏连接列表,对ejb客户端的好连接列表和坏连接列表进行更新。

在本发明的一个实施例中,ejb客户端包括侦测线程;该方法还包括:

建立侦测线程与ejb服务端之间的短连接,以通过侦测线程向待询问ejb实例询问ejb实例的状态。

作为一个示例,在业务分发过程中,如果发现与ejb实例的连接坏掉,则向连接管理器报告该连接已断掉,连接管理器将连接断掉的ejb实例放入坏连接列表中并通知侦测线程立即同步ejb服务端的ejb实例列表,ejb服务端的ejb实例列表也包括好连接列表和坏连接列表,好连接列表中包括状态正常的ejb实例,坏连接列表中包括状态异常的ejb实例。

需要说明的是,侦测线程会定期的从ejb服务端获取当前集群的最新状态,并和ejb客户端的连接列表整合。在一个检查周期内,发现集群里有新的ejb实例启动或是恢复到正常状态的ejb实例时,则将该ejb实例加入到好连接列表中,如果集群里有ejb实例停止或是出现状态异常的ejb实例时,则从好连接列表中移除该ejb实例并将其放入坏连接列表中。由于每个集群实例可获取当前集群实例的状态,所以侦测线程可以从好连接列表中随机选择一个ejb实例询问集群中ejb实例的状态。如果没有状态正常的ejb实例可用时,则尝试从坏连接列表中恢复连接并询问集群实例列表。当侦测线程发现超过10分钟没有业务请求的分发需求,则会关闭该线程。当后续有业务请求的分发需求时,连接管理器发现侦测线程已经停止,则会重新启动一个侦测线程。最小化资源开销的侦测线程在连接管理器中只存在一个。

socket连接建立后,如果socket连接的另一方的设备突然断电或者网卡松动,tcp底层存在需要花费很长时间才能侦测到对方连接已经断开,因此,将侦测线程的健康检查连接默认配置为短连接,并为进行ejb实例状态检测的socket连接设置较小的so_timeout。本发明实施例同时支持短连接和长连接的监测机制,解决已建立连接无法及时发现故障ejb实例的问题。

图7示出了本发明的一个实施例的ejb业务处理装置的结构示意图。该装置应用于ejb客户端,如图7所示,该装置200包括:

第一动态更新模块201,用于确定ejb集群中ejb实例的状态,以动态更新第一集合,第一集合中包括状态正常的ejb实例。

请求分发模块202,用于基于预先定制的序列化协议,将多个业务请求负载均衡分发给第一集合中的ejb实例。

在本发明的一个实施例中,请求分发模块202包括:

会话轮询分发模块,用于将多个业务请求均分发给与ejb客户端对应的ejb实例上。

请求分发模块202包括:

请求轮询分发模块,用于以轮询方式在第一集合中选择ejb实例,将多个业务请求分发给轮询选择的ejb实例。

请求分发模块202包括:

权重分发模块,用于根据第一集合中每个ejb实例的当前权重,将多个业务请求分别分发给第一集合中的ejb实例。

请求分发模块202包括:

分发控制模块,用于当第一集合中包括多个ejb实例时,将多个业务请求中的同一时刻产生的多个请求分发给第一集合中的不同的ejb实例。

在本发明的一个实施例中,第一动态更新模块201包括:

第一连接模块,用于根据ejb集群的ejb实例列表,向ejb实例列表中的ejb实例发送连接请求。

第一确定模块,用于根据与ejb实例的连接结果,确定ejb实例的状态。

在本发明的一个实施例中,第一动态更新模块201包括:

指标接收模块,用于通过应用程序接口api,接收来自ejb服务端的ejb实例的监控指标。

第二确定模块,用于根据监控指标,确定ejb实例的状态。

在本发明的一个实施例中,该装置200还包括:

第二动态更新模块,用于根据ejb集群中ejb实例的状态,动态更新第二集合,第二集合中包括状态异常的ejb实例。

在本发明的一个实施例中,该装置200还包括:

在分发多个业务请求的过程中,若与第一集合中的ejb实例的连接中断,则将该连接中断的ejb实例从第一集合中删除,将该连接中断的ejb实例添加到第二集合中。

在本发明的一个实施例中,该装置200还包括:

第二连接模块,用于在分发多个业务请求的过程中,若第一集合为空,则向第二集合中的ejb实例发送连接请求。

请求分发模块202,用于当与第二集合中的ejb实例连接成功时,将多个业务请求中的至少一个请求分发给该连接成功的ejb实例。

在本发明的一个实施例中,该装置200还包括:

状态询问模块,用于从第一集合中选择待询问ejb实例,向待询问ejb实例询问ejb集群中各个ejb实例的状态。

实例更新模块,用于根据待询问ejb实例反馈的结果,更新第一集合和第二集合中的ejb实例。

在本发明的一个实施例中,该装置还包括:ejb客户端包括侦测线程;该装置还包括:

连接建立模块,用于建立侦测线程与ejb服务端之间的短连接,以通过侦测线程向待询问ejb实例询问ejb实例的状态。

在本发明的一个实施例中,序列化协议是采用二进制压缩算法的序列化协议。

图8示出了本发明一个实施例的ejb业务处理设备的硬件结构图。如图8所示,ejb业务处理设备300包括输入设备301、输入接口302、处理器303、存储器304、输出接口305、以及输出设备306。

其中,输入接口302、处理器303、存储器304、以及输出接口305通过总线310相互连接,输入设备301和输出设备306分别通过输入接口302和输出接口305与总线310连接,进而与ejb业务处理设备300的其他组件连接。

具体地,输入设备301接收来自外部的输入信息,并通过输入接口302将输入信息传送到处理器303;处理器303基于存储器304中存储的计算机可执行指令对输入信息进行处理以生成输出信息,将输出信息临时或者永久地存储在存储器304中,然后通过输出接口305将输出信息传送到输出设备306;输出设备306将输出信息输出到ejb业务处理设备300的外部供用户使用。

ejb业务处理设备300可以执行本申请上述的方法中的各步骤。

处理器303可以是一个或多个中央处理器(英文:centralprocessingunit,cpu)。在处理器303是一个cpu的情况下,该cpu可以是单核cpu,也可以是多核cpu。

存储器304可以是但不限于随机存储存储器(randomaccessmemory,ram)、只读存储器(read-onlymemory,rom),可擦除可编程只读存储器(erasableprogrammablereadonlymemory,eprom)、光盘只读存储器(compactdiscread-onlymemory,cd-rom)、硬盘等中的一种或多种。存储器304用于存储程序代码。

可以理解的是,在本申请实施例中,图7提供的任一模块或全部模块的功能可以用图8所示的处理器303实现。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用全部或部分地以计算机程序产品的形式实现,所述计算机程序产品包括一个或多个计算机程序指令。在计算机上加载或执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机程序指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机程序指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输)。所述计算机可读取存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘solidstatedisk(ssd))等。

本说明书的各个部分均采用递进的方式进行描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点介绍的都是与其他实施例不同之处。尤其,对于装置和系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例部分的说明即可。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1