开发背景
我们公司是主要从事企业语音方面产品的开发,主要产品比如:调度系统,指挥系统,电话会议系统,呼叫中心系统等。这些系统都有一个共同特点,就是涉及到呼叫,放音,收发按键,会场操作。我们的业务产品都是基于我们的软交换系统之上构建的,软交换系统的应用服务器向外提供这些服务。
产生的问题
我们在开发的过程中就发现一个问题,每个产品在此接口上都会做很多重复的开发,特别是在IVR处理上面。
IVR (Interactive Voice Response)即交互式语音应答,可以提高呼叫服务的质量并节省费用。IVR是一种功能强大的电话自动服务系统。
由于我们的系统重新架构,正在开发软交换API接口,所以我们试图解决这个问题。
为了方便上层对底层接口的调用,减少重复开发,产品能够针对用户需求迅速更改,我们提出了事务流的概念。即上层程序设定一个事务流,比如:相对用户9092发起呼叫,用户应答后对用户放音,让用户输入密码,密码验证成功加入制定会场。上层程序设定好这样的事务流后,发送给下层进行处理。下层处理完毕后,回复处理结果。
事务流的概念最终并没有实现,一是我们对事务流的异常处理分析不足;二是采用事务流的概念扩展性,可维护性不是很好。
后来我们在事务流的基础上引进了SOA的概念,即将底层的接口封装为一系列松散耦合的服务,在上层通过对服务的编排实现流程编辑的功能。但是实施SOA困难非常大,一是SOA没有大规模的应用,文档,经验都比较少,实施风险较大;二是实施SOA要工具的支持,需要投资。这样的话我们宁可重复开发。
最终这个流程编辑的功能并没有完成,但是我们还是在API中实现了一个简单的流程编辑,这个流程编辑是通过硬编码来实现的,和我们的愿望相差较大。
新的思路
后来看了一家平台软件公司的介绍,他们是做企业应用平台的。企业应用中很多的一点就是工作流。他们的平台就是集成了一款开源的工作流引擎:JBPM。第一次接触JBPM,感觉很多思路可以借鉴。后来在网上搜资料的时候搜到几篇研究微内核流程引擎的文章:
这几篇文章是我设计流程引擎的核心基础。看完之后最终决定自己设计一个微内核流程引擎。
使用开源还是自己开发
决定动手开发前,有两种方式,一是使用开源产品,比如JBPM;二是自己动手开发。当时的考虑是:
1、JBPM是用java开发,我们公司的业务产品目前基本上都是c,和java交互不便。
2、JBPM是针对企业工作流设计的,工作流和IVR导航一个重要的区别是,IVR导航对时效性要求很高。要求系统能够及时响应。
3、我不是JAVA出身,当时对java还有些畏难心理。
所以,最终决定自己用C++开发流程引擎。
如果是现在的话,即便是决定自己开发,一会好好研究一下JBPM的源码的。
借鉴的其他思路
1、数据驱动(DD)。在脚本中XML定义流程,程序启动后将流程读入程序,然后供上层程序调用。如果流程更改,这直接修改脚本即可。
2、BPEL。Business Process Execution Language 的缩写,意为业务过程执行语言 ,是一种基于XML 的,用来描写业务过程的编程语言。我的脚步语言参考BPEL的描述。