1. 前言
近几年,随着通讯行业的迅猛发展,三大运营商之间的竞争也越来越趋于白热化。在对用户资源的争夺中,大量丰富、粘滞性强的业务既是攻城略地的排头兵,又是保家护院的桥头堡。对任何一个业务来说,使用前的订购、到期后的续订以及使用后的退订都是必需的流程。从请求来源上说,有短信、WAP、IVR等;从用户规模上说,面对的是千万乃至亿级的大数据量和高并发。为这样的需求设计的系统,需要兼具高效、健壮、通用。下面以笔者亲身经历的国内某知名运营商平台上的XX项目为例,简要介绍一下自己在该类系统架构设计中的心得,以期达到抛砖引玉的效果。
2. 总体设计
用户进行业务开通的方式是多种多样的,常用的就有短信(SMS)、移动互联网(WAP)、互联网(WWW)、电话语音(IVR)、非结构化补充数据业务(USSD)等。为了对其进行标准化,我们设计了DB接口即上行队列表,所有业务开通的请求全部存入该表。
后台任务(用任务管理系统中的任务调度系统配置启动)首先读取上行队列表,封装为上行指令对象,发送至请求分发器。请求分发器在初始化上下文时,已将指令格式与对应的业务处理器的映射关系用HashMap的形式载入内存,在接到指令对象后,首先判断和其匹配的指令格式,再分发到业务处理器。
业务处理器采用典型的三层模型,Action层负责数据封装,Service层负责具体的业务处理逻辑,Dao层负责数据持久化。这里用到了模板模式,将子类Action共用的操作抽象到父类Action作为模板,简化了逻辑。
对业务开通,包括订购、续订、退订等请求的处理来说,关键是大量后台任务。这些后台任务要在大数据量、高并发的场景下高效、健壮的运行,需要一个通用性的框架。该框架包含了后台任务的配置、启动、关闭入口,我们还设计了启动监听亦即listener服务,可以指定需要跟随框架一起启动的服务。为了实时了解后台任务的运行情况,需要一个监控前台;另外,在错误和异常发生时要能告警,通知到相关人员。有了这样一套系统,后台任务的开发人员仅仅需要关注到其专属的任务逻辑上,其他工作已经移交框架统一管理。
3. 核心子系统设计
3.1. 任务管理系统设计
该平台将负责后台任务的定时调度,运行中任务的监控,当发生异常时须及时告知相关运营维护、开发人员。该平台将大大降低后台任务开发的难度,同时提高系统的稳定性和可监控性。
该任务管理系统包括如下模块:
Ø 任务调度系统
在指定时间执行指定任务,并且负责管理任务的生命周期,负责发送心跳信号至监控系统,发送任务运行状态至监控系统。包含如下模块:
-
- 任务调度基础框架
- 心跳发送模块
- 状态收集、发送模块
Ø 任务监控系统
旨在建立一个通用的应用服务监控平台,实现对每个运行任务的状态,运行参数收集、展现。同时该平台将对一些基础数据进行维护,如:
-
- 调度服务器信息
- 通知人员
Ø 告警平台
告警平台将采用EMAIL和短信并行的方式
这里可选的工具包括定时调度工具quartz.jar,JVM状态查看协议JMX,commons-httpclient.jar等
3.2. 请求分发器设计
Ø 指令解析
解析指令xml,生成指令格式与业务处理器的映射关系。
<command name="^[0-9]{14}$" targetClass="com.aspire.prov.business.handle.action.LoginAction"> </command> |
Ø 初始化上下文
随监听器与任务管理系统一起启动,主要是业务处理器的实例化。另外,指定当异常发生时由哪个类进行捕获、处理,以及会话管理的策略也在这个时候完成。
config = ConfigLoaderFactory.getDefaultConfigLoader().load( ClassLoaderUtils.getResource("commands.xml", FrameworkContextImpl.class).getFile()); config.instantiateAllAction(); config.instantiateAllExceptionHandlers(); |
Ø 业务分发
将请求发送至与指令格式匹配的业务处理器
action.perform(request, response); |
Ø 会话管理
利用粘性session,使来自同一个终端的所有请求由一个应用进行处理,避免了不同机器间session的同步的繁琐。利用取模技术,使不同任务间负载均衡。利用任务的stateful属性,避免了同一个任务不同线程间死锁。
session = context.getManager().getSession(sessionId); |
3.3. 业务处理器设计
Ø Action层
可统一继承自抽象类CommonAction,共用的逻辑抽象到perform方法中,子类实现execute方法。
Ø Service层
可按具体的业务开通类型进行分类,如订购、续订、退订。
Ø Dao层
可以采用jdbc直连,也可以利用第三方orm工具,如hibernate、ibatis,但要注意性能,尽量避免数据持久化成为整个系统的瓶颈。