移动运营商业务开通类标准化框架初探

1.   前言

近几年,随着通讯行业的迅猛发展,三大运营商之间的竞争也越来越趋于白热化。在对用户资源的争夺中,大量丰富、粘滞性强的业务既是攻城略地的排头兵,又是保家护院的桥头堡。对任何一个业务来说,使用前的订购、到期后的续订以及使用后的退订都是必需的流程。从请求来源上说,有短信、WAPIVR等;从用户规模上说,面对的是千万乃至亿级的大数据量和高并发。为这样的需求设计的系统,需要兼具高效、健壮、通用。下面以笔者亲身经历的国内某知名运营商平台上的XX项目为例,简要介绍一下自己在该类系统架构设计中的心得,以期达到抛砖引玉的效果。

 

2.   总体设计

用户进行业务开通的方式是多种多样的,常用的就有短信(SMS)、移动互联网(WAP)、互联网(WWW)、电话语音(IVR)、非结构化补充数据业务(USSD)等。为了对其进行标准化,我们设计了DB接口即上行队列表,所有业务开通的请求全部存入该表。

   后台任务(用任务管理系统中的任务调度系统配置启动)首先读取上行队列表,封装为上行指令对象,发送至请求分发器。请求分发器在初始化上下文时,已将指令格式与对应的业务处理器的映射关系用HashMap的形式载入内存,在接到指令对象后,首先判断和其匹配的指令格式,再分发到业务处理器。

   业务处理器采用典型的三层模型,Action层负责数据封装,Service层负责具体的业务处理逻辑,Dao层负责数据持久化。这里用到了模板模式,将子类Action共用的操作抽象到父类Action作为模板,简化了逻辑。
  
对业务开通,包括订购、续订、退订等请求的处理来说,关键是大量后台任务。这些后台任务要在大数据量、高并发的场景下高效、健壮的运行,需要一个通用性的框架。该框架包含了后台任务的配置、启动、关闭入口,我们还设计了启动监听亦即listener服务,可以指定需要跟随框架一起启动的服务。为了实时了解后台任务的运行情况,需要一个监控前台;另外,在错误和异常发生时要能告警,通知到相关人员。有了这样一套系统,后台任务的开发人员仅仅需要关注到其专属的任务逻辑上,其他工作已经移交框架统一管理。

  

   3.   核心子系统设计

3.1.     任务管理系统设计

该平台将负责后台任务的定时调度,运行中任务的监控,当发生异常时须及时告知相关运营维护、开发人员。该平台将大大降低后台任务开发的难度,同时提高系统的稳定性和可监控性。

该任务管理系统包括如下模块:

Ø  任务调度系统

在指定时间执行指定任务,并且负责管理任务的生命周期,负责发送心跳信号至监控系统,发送任务运行状态至监控系统。包含如下模块:

  •  
    • 任务调度基础框架
    • 心跳发送模块
    • 状态收集、发送模块

Ø  任务监控系统

旨在建立一个通用的应用服务监控平台,实现对每个运行任务的状态,运行参数收集、展现。同时该平台将对一些基础数据进行维护,如:

  •  
    • 调度服务器信息
    • 通知人员

Ø  告警平台

告警平台将采用EMAIL和短信并行的方式

 

这里可选的工具包括定时调度工具quartz.jarJVM状态查看协议JMXcommons-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工具,如hibernateibatis,但要注意性能,尽量避免数据持久化成为整个系统的瓶颈。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值