随笔 - 11  文章 - 79  trackbacks - 0
<2009年9月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

欢迎合作

 

联系方式:openhandx@foxmail.com

 

常用链接

留言簿

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

 

 

 

 

  OpenHandX-Batch 1.02

企业级批量应用架构

 

 

 

 

 

2010-12-28

 

作者:彭明华

pengminghua@hotmail.com

 

本文档中的任何部分都不得以任何手段任何形式进行复制与传播。

目录

 

1          为什么要批量架构

 

 

异步交易的概念相对于同步交易,同步交易是指BS/CS系统中当用户点击某个按钮系统就能很快查询出需要的信息,整个过程不需要长时间等待。随着计算机系统的普及化,更高级业务需求,如:分析型的报表、复杂的数据加工被提了出来。如果再做成同步交易用户可能需要等待几十分钟或数小时的时间,这显然是不被接受的。这时就需要一个高效异步交易系统。异步交易是指用户提交一个请求后系统很快返回提交成功的信息,随后用户可以继续做其它的工作,提交的请求由后台程序按照一定规则去处理,处理完成后用户可以取到结果,整个过程用户都不用刻意去等待因此是异步的。面对更高层的应用,更大的海量处理如:天气预报的卫星云图、生物基因工程等计算。

传统联机架构只能处理响应较快的普通业务处理,对于耗时等复杂业务处理会造成服务器资源大量被占用,客户端失去响应等严重问题。异步批量架构是解决复杂业务处理、数据分析、科学计算等耗时工作任务,这些任务被安排在特定的服务器上执行,被统一规划、拆分成子任务、统一调度、并发执行,大大提高了执行效率和可靠性,另外异步批量架构可以部署在网络内的任意服务器或PC上形成企业的云计算。

 

2          异步批量演化

2.1       初始级

初始级的批量是最简单的异步批量

由应用系统发起一个异步批量的请求,请求很简单只有一个节点一个任务,处理保存在数据库中,由应用系统去查询结果

2.2       应用级

应用级的批量是处理复杂业务系统的批量


某个应用发起一个批量请求到异步总控服务器,请求的业务逻辑是由复杂的节点图定义,总控服务器根据节点图定义拆分出多个任务,再发送给异步任务服务器群去并发执行这些任务,总控服务器负责任务的拆分、分配、调度

2.3       企业级

企业级的批量面对的是整个企业所有系统批量,不再局限只对某个系统提供服务,可以看作是企业信息化的一种资源

异步总控服务器群要处理的不仅有多个应用系统批量请求,还可能有人为发起的批量请求,如:月终、年终报表等

 2.4      云计算级





云计算级面向更大的理想应用,能提供绝对强大的运算能力,能对天气预报、生物工程等海量数据进行运算。同时在同一网络任何计算机终端很容易能加入到云计算系统中,这样能合理利用资源减少投资。

 

 

 

3          企业级架构需要什么

既然作为企业级架构就就应该具有一套完整的机制,比如:安全性、健壮性、高性能、扩展性等。只有在此基础上企业才能安全、有效、节省资源的情况下使用架构

3.1       安全性

企业级架构在数据存储、传输过程中处于安全环境,不能被外界获取,即使能获取也是无价值的

3.2       健壮性

企业级架构为企业重要系统的提供支持,甚至是核心的一部分,在系统中运行的企业级架构要有高可靠性、健壮性。除此之外,根据系统需要还应该有及时有效的监控机制,即使出现意外也应该有完善的应对方案

3.3       高性能

企业级架构一般部署在服务器上,企业级架构要能利用服务器提供的资源最大、最快程度完成交给的任务,并且能够通过多个服务器机群并发解决单一服务器的性能制约

3.4       扩展性

企业级架构最少是面向企业某一领域的应用,除了架构本身提供的缺省实现方法,还要提供对特殊情况的支持

3.5       可移植性性

企业级架构不能仅局限于部署在某一类服务器或某一类操作系统,企业级架构应该能在主流的服务器和操作系统中执行,并且运用主流的操作方式和通讯协议

3.6       多种应用模式

企业级架构面向不同企业,每个企业都有不同的情况和需求,这就需要企业级架能以各种模式来满足不同的企业。企业级架构应该是由多个组件组成,每个组件都是松耦合,通过组件的不同组合方式满足不同模式的需求

3.7       易操作性

企业级架构在必要情况下提供的方便、节约操作界面

4          OpenHandX-Batch企业级批量应用架构

OpenHandX-Batch 1.0是轻量级、可扩展的企业级异步批量框架。OpenHandX-Batch 1.0异步批量框架将共性的处理抽象化并提取出来,提供多种应用模式、并发、集群、多种节点图任务运行等能力,开发者可以将更多注意力放到自己的业务层面。减少开发环节和周期。OpenHandX-Batch 1.0异步批量框架也可以当做企业的一种资源,将企业多个系统的异步批量部署到OpenHandX-Batch 1.0上,由OpenHandX-Batch 1.0统一支持和管理。

4.1       术语及名词解释

批量框架:OpenHandX-Batch 1.0异步批量框架的简称

事件:应用系统向批量框架发送一次批量的请求

节点:一个复杂的事件是由多个步骤,每个节点代表一个步骤

节点图: 将多个节点按照某种逻辑关系组成运行流程,这个流程就叫节点运行图或节点图

任务:一个节点要执行必须实例化成任务,一般一个节点可拆分成一个任务,但一个节点也可能是同一类任务的定义

4.2       特性

4.2.1    主要特性

l        支持多个应用系统-能将多个应用系统部署到同一个总控服务器或多个总控服务器,由总控服务器统一控制和管理

l        支持多个异步事件-总控服务器能同时执行和监控多个事件,通过事件权重、优先级衡量和控制制服务器的资源

l        多批量任务并发-任务服务器同时支持来自多个总控服务器的任务,并行执行这些任务

l        多种节点图事件支持-总控服务器提供树型和层型节点图、单个任务类,复杂类型的事件可以通过节点图配置工具来定义自己的运行顺序图,支持断点续跑灾难恢复

l        良好扩展性-从总控服务器、任务服务器、事件服务器都提供了丰富的接口,能对节点图、事件和任务传输开发出业务个性的代码

l        快速开发接口-任务服务器提供一个主要接口就能完成所有应用系统业务代码的开发,同时也提供对Spring框架的支持

l        健壮性-总控服务器的每个应用实例有自己的运行容器和运行线程,任务服务器也有自己的独立任务容器和执行线程,保证了每个独立的应用或任务执行出现意外不影响其它执行的应用和任务。其次总控服务器还对每个应用和任务执行进行监控记录,即使整个总控服务器宕机重起后能自动恢复上次运行的步骤继续往下执行

l        安全和密级-所有的批量工具提供用户和密码管理,任务和事件的xml传输协议都支持加密和压缩

l        多种应用模式-完整的异步批量框架需要部署总控服务器、任务服务器、事件服务器,如果您不需要那么多的功能,可以灵活部署其中的任务服务器或任务服务器+总控服务器

l        丰富的监控和分析工具-任务服务器、总控服务器、事件服务器都有自己的监控和管理工具,能启动、暂停、重起服务器。另外批量框架提供了对日志实时分析的工具,比如事件、节点、任务的运行状态、完成进度

4.2.2    性能优势

l        总控服务器

1、总控服务器的事件接收、任务发送、任务信息接收,可以有3种配置模式:JMS服务器、数据库服务器、内存队列,其中内存队列服务器效率最高、其次是JMS服务器

2、对于复杂耗时节点图的解析可以采用异步接口的实现,采用异步的方式提高总控服务器的相应速度

l        任务服务器

1、任务服务器的任务信息发送、任务接收,也同样有3种配置模式:JMS服务器、数据库服务器、内存队列,其中内存队列服务器效率最高、其次是JMS服务器

2、任务实例的执行提供了独立的执行线程

3、任务实例由任务实例管理器统一管理,默认采用单实例模式一次创建多次执行减小执行中创建任务实例的开销

4.3       平台需求

OpenHandX-Batch 1.0需要:

l        Java 5

l        Servlet API 2.4 (可选)

l        JSP API 2.0 (可选)

l        Spring 2 (可选)

l        JMS1.1(可选)

l        OpenHandX common1.0.jar

4.4       OpenHandX批量架构逻辑结构

4.4.1    总体逻辑结构

l        事件由应用系统或事件中心创建,通过事件通讯服务器到达已部署的总控服务器

l        总控服务器将事件按照预先定义好的节点图拆分、解析成任务,按照合适的条件再发送到任务通讯服务器,并记录日志

l        任务服务器根据自身的资源情况从任务通讯服务器接受相应的任务去执行

l        任务执行完成后将记录日志,并将完成后的任务信息发送回任务通讯服务器

l        总控服务器再从任务通讯服务器取回任务信息,判断节点和事件的完成情况,如果未完成继续后续节点的拆分和任务的发送,如果全部节点的任务完成则该事件完成

4.4.2    总控服务器内部结构

l        一个总控服务器由部署的多个应用实例,总上下文、总的资源、配置管理组成

l        总控服务器以Task、Event对象的形式与外界传输数据

l        每个应用实例运行在自己独立的应用容器里和独立的线程,并且包含了多个不同的事件接收实例、应用上下文、应用资源、应用配置管理、事件接收管理、任务发送管理、任务信息接收管理

l        每个事件接收实例有自己独立的节点图解析器、任务拆分器、日志记录器、任务发送验证器、自己的上下文、自己的资源

4.4.3    任务服务器内部结构

l        一个任务服务器由部署的多个应用实例,总上下文、总的资源、配置管理组成

l        总控服务器以Task对象的形式与外界传输数据

l        每个应用实例运行在自己独立的应用容器里和独立的守护线程,并且包含了多个任务实例、应用上下文、任务运行池、任务实例管理类、、任务信息发送管理、任务接收管理

l        每个任务实例有自己独立的应用容器里和独立的执行线程、任务执行类、日志记录器、自己的上下文、自己的资源

4.5       节点模型

首先节点图是由总控服务器来解析的,负责节点及任务的拆分和调度。总控服务器默认支持3种最常用的节点图模型,开发人员也可以通过接口扩展支持新的节点图模型。这3种节点图模型是:单节点模型、树型节点图模型、层型节电图模型。单节点模型是由一个节点组成,非常简单。

4.5.1    树型节点图

树型节点图每个节点执行都依赖父节点是否完成。树型节点图实际上更像网状结构。通过节点之间关系建立紧密的联系,这样的好处是每个节点执行完能很快执行它下级节点,效率较高。但是节点关系过于紧密,因此创建树型节点图和维护的代价很大。

如:

假设这有7个节点,他们的关系如图所示。整个节点图执行完一共需要14分钟。

4.5.2    层型节点图

层型节点图像瀑布从上到下一批批地执行完,只有前一层执行完才能到下一层。这种结构关系相对简单,易于创建和维护。但是如果分层不当,层内会因某个节点非常费时而等待,从而影响整个执行的效率。

如:

还是这7个节点,整个节点图执行完一共需要18分钟。其实这节点5也可以放到第2层,但效率更低,需要21分钟。

4.6       组件及功能

4.6.1    任务服务器

批量任务执行的服务器

1、每个任务服务器实例都支持多线程、多应用系统、多服务器集群

2、通过任务的优先级、权重管理任务服务器群的负载均衡

3、任务类运行方式有单体类模式、配置文件容器运行模式、spring容器管理模式,最优化合理地利用资源

4、支持多数据源、多jms源、内存队列、多通道接受和发送任务

5、对于jms传送xml任务信息支持加密和压缩

4.6.2    任务服务器监控

监控当前任务服务器的运行状态


1、可以停止、暂停、重起任务服务器

2、可以对部署在任务服务器上的应用单独暂停

3、能查询运行的任务数量、部署的应用、内存应用情况、正在运行任务的状态

4.6.3    总控服务器

处理批量事件的服务器,负责事件任务拆分、任务调度

1、默认支持树型节点图、层型节点图、单个节点的任务拆分

2、支持多应用部署、多事件并发执行

3、可以设置敏感度,是否时时响应每个应用的事件

4、任务错误后的终止、忽略、重跑三种重跑方式

5、通过事件的优先级、权重管理总控服务器群的负载均衡

6、支持断点续跑,支持灾难恢复

7、对于jms传送xml任务支持加密和压缩

4.6.4    总控服务器监控

监控当前总控服务器的运行状态


1、可以停止、暂停、重起总控服务器

2、可以对部署在总控服务器上的应用单独暂停

3、能查询运行的总控数量、部署的应用、正在运行的事件状态

4.6.5    事件服务器和事件中心


可以给总控服务器的发送批量事件

1、人为发起的批量事件,如:月终、年终报表等

2、事件中心默认提供发起一个事件、发起多个事件、多个顺序事件、发起周期事件,可以根据需要定制事件,事件服务器负责创建并发送

3、可以对多个总控或多个应用发送批量事件

4.6.6    节点图编辑平台


定义事件的节点运行图

1、支持树型、层型图的节点图定义

2、树型节点图支持图嵌套,做到节点图定义的重用

3、节点和图都能配置业务参数,节点可以配置运行模式、权重、互斥等信息

4、支持对多个应用定义节点运行图

5、提供对已定义的节点图可以图形方式预览

4.6.7    日志分析中心



分析批量运行的结果

1、能查询到每个事件、节点、任务的日志信息

2、已不同的颜色区分当前事件、节点、任务运行的状态

3、提供对日志进行分析,以列表和图形方式展现事件的运行节点图

4、时时刷新分析结果可以很直观看到事件中的每个节点或任务的运行过程

5、支持多个应用的日志查询和日志分析

4.7       应用模式

支持多组件插拔式部署,典型的3种模式如下:

初始级的批量服务-只要部署任务服务器就可以满足需要,部署维护简单

应用级的批量服务-需要部署多个任务服务器,一个总控服务器,如果需要监控还要部署WEB的总控监控组件和任务服务器监控组件、日志分析中心

企业级的批量服务-部署所有组件,总控服务器和任务服务器的集群可以处理庞大的批量事件,加入事件服务器可以人为根据需要发起系统外批量程序

 

云计算级批量服务-在需要加入云计算的计算机安转批量任务服务器客户端并启动她,即完成了云计算的部署。在网络内的个人pc也能加入云计算,这样就为云计算提供灵活的、更多的资源


扩展模式-除了以上三种模式还可以根据实际情况组合自己需要的组件,也可以增加或减少总控服务器及任务服务器


下载地址:http://code.google.com/p/openhandx2/downloads/list

posted on 2009-09-02 15:15 彭明华 阅读(2060) 评论(12)  编辑  收藏 所属分类: OpenHandX工具

FeedBack:
# re: OpenView-Batch 1.0 企业级批量应用架构 2009-09-02 17:16 小丽
牛逼!!!  回复  更多评论
  
# re: OpenView-Batch 1.0 企业级批量应用架构 2009-09-02 18:14 wangchangbing
下载下来试试
异步处理在系统中经常需要用到
LZ的思路很好 这个项目很有前途 是一个人做的吗?需要人一起做吗?  回复  更多评论
  
# re: OpenView-Batch 1.0 企业级批量应用架构 2009-09-02 19:56 彭明华
谢谢,这个项目已近完成了,其中异步总控部分已经被应用项目使用过了。如果使用中有问题请发帖。@wangchangbing
  回复  更多评论
  
# re: OpenHandX-Batch 1.0 企业级批量应用架构 2010-03-18 14:04 小山羊
1、如果我换成sqlserver2005数据库,请问怎么配置数据库,在哪些文件中配置?
2、能不能提供一个简单例子的文档,比如从设置sql脚本开始,怎么在OpenHandX-Batch 中设置,然后下一步设置或操作的步骤?因为看你写的文档,有好多术语不太了解,如果结合着例子看,会事半功倍。  回复  更多评论
  
# re: OpenHandX-Batch 1.0 企业级批量应用架构 2010-03-19 14:18 彭明华
@小山羊
只要有sqlserver2005的jdbc驱动就可以;
异步批量架构太强大也比较复杂,目前的文档和参数太多,我也早有想法做一个快速配置手册,这都需要时间,我会努力的
异步批量架构需要对分布、集群等概念有个大概认识。  回复  更多评论
  
# re: OpenHandX-Batch 1.0 企业级批量应用架构 2010-03-19 17:08 小山羊
@彭明华
期待你的文档,顶!加油!
  回复  更多评论
  
# re: OpenHandX-Batch 1.02 企业级批量应用架构 2012-09-19 11:49 wmj2003
batchcosole 缺少预览功能。 另外 batch核心代码有bug。google上应该不是最终版本。呵呵  回复  更多评论
  
# re: OpenHandX-Batch 1.02 企业级批量应用架构 2012-10-31 09:26 彭明华
@wmj2003
batch核心可能有Bug,能说一下具体的吗,我好解决,谢谢!
batchcosole的预览分为两部分,一个是编辑节点运行图,另一个日志分析图时提供。这两个预览又分提供列表和图型方式提供展示,但是图型方式(使用VML技术)必须在IE6以上版本才能看  回复  更多评论
  
# re: OpenHandX-Batch 1.02 企业级批量应用架构 2012-11-22 10:58 wmj2003
@彭明华 (有理解不对的地方请指正。qq 229849534 王明杰-聚灵-济南)

数据库初始化的脚本有问题。记不清楚了,有个时间列默认值给弄错了,本应该在STARTTIME 上面设置默认值,结果设置在COMPLETETIME 上面了。导致整体程序执行错误(通过数据库发送信息的时候)。


事件中心建议修改整体设计规划,采用JcronTab框架实现,可以大大简化事件发送器。
事件发送器:CycleEvent 类
public EventDefine createEvent(Context context,
Map<String, String> configParams, Event event) throws EventCenterException{
Map<String,String> params = ParamParse.getParams(event.getConfigs());

if(params==null){
throw new EventCenterException("the configs can not be null");
}
// System.out.println("type="+params.get("type"));
// System.out.println("timeNum="+params.get("timeNum"));
// System.out.println("startTime="+params.get("startTime"));
// System.out.println("endTime="+params.get("endTime"));
if(params.get("type")==null || params.get("type").trim().equals("")){
throw new EventCenterException("the type parameter can not be null,interpose configs please");
}
if(params.get("timeNum")==null || params.get("timeNum").trim().equals("")){
throw new EventCenterException("the timeNum parameter can not be null,interpose configs please");
}
Timestamp ts = null;
if(params!=null && params.get("startTime")!=null && !params.get("startTime").trim().equals("")){
ts = Timestamp.valueOf(params.get("startTime"));
}
Timestamp ets = null;
if(params!=null && params.get("endTime")!=null && !params.get("endTime").trim().equals("")){
ets = Timestamp.valueOf(params.get("endTime"));
}
EventDefine eventDefine = null;
if(ets!=null){//如果定义了结束时间,那么就判断什么时间结束
//TODO 这段逻辑有bug
// if(ts==null || new Timestamp(System.currentTimeMillis()).compareTo(ts)>=0){
// eventDefine = getEvent(event.getId().replaceAll("#time#",String.valueOf(System.currentTimeMillis())),event);
// if(new Timestamp(System.currentTimeMillis()).compareTo(ets)>=0){
// complete = true;
// }
// }
//如果结束时间到了,那么就终止任务。
if(new Timestamp(System.currentTimeMillis()).compareTo(ets)>=0){
complete = true;
}

}else{

List<String> ids = ParamParse.getValues(event.getId());//有多少个ID就创建多少个事件
if(ids!=null && !ids.isEmpty() && (ts==null || new Timestamp(System.currentTimeMillis()).compareTo(ts)>=0)){
if(checkIsCreate(params)){//检查周期性时间是否匹配,匹配就创建任务
String tempId = ids.get(loop).replaceAll("#time#",String.valueOf(System.currentTimeMillis()));
eventDefine = getEvent(tempId,event);
System.out.println("CycleEvent----------开始创建事件请求----eventDefine="+eventDefine.getId());
loop++;
if(loop>=ids.size()){
complete = true;
}
}
}else{
complete = true;
}
}
return eventDefine;
}

控制器中:open.batch.controller.impl.application. LayerNodeMap 有bug。
方法private List<INode> getNodes(String mapId,String params) throws SQLException 中,把标记写错了。

if(rs.getString("RERUN")!=null)
node.setReRunMode(rs.getInt("RERUN")); //TODO 重跑模式在这里写错了吧,果然写错了.2012-09-20 又是一个bug已经修正

open.batch.taskserver.message.TaskSenderManager
这个类应做错误处理,将发送失败的任务重新进入队列中。同时需要修改他送任务的接口,让其只返回发送失败的任务。 否则一旦发送失败,这个任务就丢失了。
(注:其他发送任务的地方也有类似的问题。)
/**
* @see Runnable#run()
*/
public void run() {
while(!stopFlag){
synchronized(Lock){
if(tasks!=null && !tasks.isEmpty()){
// taskSender.sender(context,tasks,configParams);
// tasks.clear();
//将发送失败的任务重新加入到任务队列
List<Task> taskfailures = taskSender.sendernew(context,tasks,configParams); //初步只是实现了DB的方式
tasks.clear();
this.setTasks(taskfailures); //将发送失败的任务重新放入发送队列。
}
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
log4j.error(null,e);
}
}
complete = true;
}


  回复  更多评论
  
# re: OpenHandX-Batch 1.02 企业级批量应用架构 2012-11-23 11:11 彭明华
@wmj2003
好的,很感谢您的细心回复,我会在近期修改一版上传  回复  更多评论
  
# re: OpenHandX-Batch 1.02 企业级批量应用架构 2012-11-26 10:20 wmj2003
@彭明华
“batchcosole的预览分为两部分,一个是编辑节点运行图,另一个日志分析图时提供。这两个预览又分提供列表和图型方式提供展示,但是图型方式(使用VML技术)必须在IE6以上版本才能看”(注:引用)

异步任务监控调度代码中确实没有图形监控的代码,我看jsp和js代码了。另外在IE浏览器9下面无法打开。可能是extjs3的问题,在firefox下面可以打开。  回复  更多评论
  
# re: OpenHandX-Batch 1.02 企业级批量应用架构 2012-12-03 17:18 彭明华
图型方式(使用VML技术)在IE6下可以使用,是我表述不准确。IE9下不正常是EXT2的问题,可以使用IE9兼容方式解决(IE9地址输入框内后部的一个按钮)  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: