本文将对Summit系统的实现进行一个概述性的介绍。Summit系统从架构上来讲是很优秀的,个人认为其架构师的想法非常好,当然也设计出来了。但在实现的时候就没那么美好了,Summit系统的实现比较复杂,比较麻烦,感觉跟架构师的想法有很大出入。如果你做过Summit项目,再深入到细节,你就会感觉到恶心了,因为Summit实现细节真的很烂。但我是站上现在的技术基础上开了上帝视角看一个存在了30年系统,有点站着说话不腰疼。个人而言,还是比较佩服Summit架构师的,为它的实现感到惋惜。当前,笔者认为Summit系统的架构正在向分布式方向演进,因为它开始大量采用MQ、Web Service这些降低耦合的方式来优化架构了。
笔者今天要介绍的内容,是Summit系统实现的各个模块,以及模块之间的交互方式。本文站在架构师角度描述各个模块之间的关系,不会涉及具体细节,因此,还是可以感受到Summit系统架构的优秀之处:
- Summit系统模块
- Summit系统运行时模块交互
1 Summit系统模块
Summit系统按照MVC来划分的话,可以分成View层即客户端/表单;Control层包含负责通讯的Web Service、负责业务逻辑的动态库/程序;Model层包含数据抽象层及持久化层。
Summit系统经过多年的架构优化,在V6.0及之后的版本中,将之前版本采用的CORBA模块替换成Web Service(aixs2实现)。这是Summit系统向分布式架构演进的体现之一。
进一步划分的话,可以分成以下模块:
序号 | 分层 | 模块 | 说明 |
1 | View | Summit FT | Summit系统客户端 |
2 | Control | ETK Web Service | 创建、销毁会话(HTTP会话) |
3 | Middle Web Service | 负责HTTP会话报文与Web Service Soap报文之间的转换 | |
4 | Naming Web Service | 负责Web Service的注册、查找;负责客户端会话与后台etkservice进程之间的注册、查找(会话保持) | |
5 | Generate ID Web Service | 产生全局唯一ID的Web Service | |
6 | MQ | 消息中间件(服务之间的松耦合) | |
7 | etkservice | 用户HTTP请求后台服务进程 | |
8 | Model | database | 持久化数据库 |
9 | N/A | STP Service | Summit系统事件处理服务 |
10 | N/A | BVS Service | Blotter View Server,即实时刷新服务 |
1 | N/A | Sequencer | Summit系统事件发布服务 |
12 | N/A | SMT | Service Management Tool,即STP/BVS服务管理工具 |
前文提到,Summit系统前后端通讯协议是HTTP。首先,HTTP协议是无状态的,因此Summit系统需要提供一套类似于Web Server的会话服务。这个就是Summit Naming Service的作用。Summit Naming Service提供服务的注册和查询功能,Summit利用此服务来提供会话服务;其次,Summit后端功能都是用C/C++开发的,如何利用后端的C/C++提供HTTP服务呢?Summit采用的是Web Service的方式。Summit后端提供了etkservice,这是一个Web Service服务端程序,启动进程后,会通过一个端口服务某个用户会话。Summit会为每个客户端连接启动一个etkservice进程来提供服务,利用Middle Web Service将HTTP请求内容转换成SOAP(Web Service)请求并转发给相应的etkservice进程。etkservice进程处理完成后,结果通过SOAP报文能加给Middle Web Service,进而转换成HTTP报文返回给客户端。不仅如此,Middle Web Service负责所有前、后端交互的HTTP报文 <-> SOAP报文之间的转换工作。
Summit系统不仅提供了用户操作的基石,同时提供工作流和数据的生命周期管理的功能。这些功能是由STP服务来完成,STP服务即事件处理服务。STP服务会订阅系统事件,每当Sequencer发布系统事件时,订阅了相应事件的STP服务即会工作,完成自动化的处理任务。常见的STP服务如现金流产生服务、支付报文产生服务、额度计算服务、头寸计算服务、合规检查服务等。
Summit系统将Generate ID独立出来作为一个Web Service也是其架构向分布式演进的体现。Generate ID服务用来生成全局唯一的ID。Summit会为其保存或管理的数据分配一个全局唯一的ID,其内部包括事件生成、分发、存/取,都是以此ID作为标识,这些ID全部由Generate ID来生成。因此,Generate ID会向Naming Service注册自己,并且所有Generate ID服务注册名是一样的,以此来保证只有一个实例提供服务。
MQ作为消息中间件来处理STP订阅、BVS消息发布和Sequencer的事件发布。当前,Summit一般采用Active MQ实现。当STP服务启动时,会首先在ActiveMQ对应的队列订阅相应的事件;Sequencer服务检索到事件发生时,会向MQ发布事件。MQ将事件广播到对应队列,供相关的STP服务处理。BVS服务启动后,会监听BVS请求队列,当Summit FT中,用户打开Blotter view时,会发送一个BVS请求。BVS服务根据订阅数据筛选条件,将筛选的数据不断推向BVS响应队列。
最后,Summit系统提供了一个用来管理所有的STP服务及Sequencer服务。STP由于是监听器的角色,因此其是长时间运行的,这就需要提供一个管理工具,来监控各个STP服务的。Service Management Tool(SMT)就是这样一个管理工具。提供了基本的服务启动、停止、新建、删除的功能。
2 Summit系统模块交互
上文静态地介绍了Summit系统的各个模块,接下来,笔者将会介绍在Summit系统运行时,各个模块之间的交互协议以及方式,对于不同的操作,调用的模块不同,交互的方式也不同,因此,笔者选取了以下几个典型场景,来说明交互过程:
- 登陆过程
- 操作过程
- ü 事件处理过程
2.1 登陆过程
0. 系统启动时,Generate ID需要启动,启动时向Naming Service注册自己- 用户登陆点击登陆后,Summit FT向ETK服务发起HTTP请求
- ETK服务启动一个etkservice进程来服务此用户
- etkservice启动后,向Naming Service注册自己(Session ID <-> 端口号)
- etkservice读取数据库中的用户信息,验证密码及其他信息(比如是否过期、是否被锁定)
- etkservice验证完成后,将结果以SOAP报文的形式返回给Middle Service
- Middle Service将SOAP报文转换成HTTP报文并返回给Summit FT
2.2 操作过程
操作过程是指用户登陆成功后,在Summit FT客户端进行相关的操作,比如点击按钮、订阅实时消息操作。此时的交互方式与登陆有所差别。
- Summit FT发送HTTP请求至Middle Service(带有Session标识)
- Middle service向Naming Service发起Web Service查询此请求对应的etkservice端口(使用Session ID),查询成功后,以SOAP报文形式返回
- Middle service查询到session对应的etkservice后,向etkservice发起Web Service请求
- etkservice响应请求,与数据库交互,如果需要生成新的ID,则会向Generate ID发起Web Service请求生成ID。Generate ID生成ID后,以SOAP形式返回给etkservice。
- etkservice处理完成后,将结果以SOAP报文形式返回给Middle Service
- Middle Service将SOAP报文转换成HTTP报文并返回给Summit FT
2.3 事件处理过程
笔者将Summit系统的事件分成2个大类,第一类由Sequencer服务产生,产生后推向MQ队列并由STP服务来处理;第二类由用户产生自Summit FT,比如打开了Blotter View来订阅实时数据,此类事件由BVS服务处理。因此,笔者将分成2个部分来说明Summit的事件处理过程。注:为使交互图清晰,省略了前文提到的部分步骤及相关服务。
2.3.1 Sequencer事件
Sequencer事件使用黑底白色表示:
- STP服务启动时,会向MQ订阅相关事件
- Sequencer检索数据库,查询每个STP服务处理的进度,并检索出未处理事件
- Sequencer将未处理事件发布到MQ
- MQ收到事件后,将事件推送给相关的订阅者,即STP服务
- STP服务处理事件,过程中很有可能生成新的数据,因此需要使用Generate ID服务
- STP服务处理事件,过程中很有可能进行数据库的读取和保存。处理完成后,更新对应STP服务的Sequencer,以防止重复处理事件
2.3.2 用户BVS事件
- 用户在Summit FT打开Blotter View,Summit FT发送HTTP请求至Middle Service
- Middle Service收到请求后,通过Naming Service(见2.2)找到对应的etkservice,并将HTTP报文转换成SOAP报文发送过去
- etkservice向对应的BVS请求队列中发送“实时数据订阅”请求;
- BVS服务从请求队列中获取“实时数据订阅”请求,
- BVS服务按照请求的筛选条件,从数据库中加载相关数据
- BVS服务将检索出的数据推送到返回队列
- etkservice从返回队列中获取BVS检索到的数据
- etkservice将检索到的数据转换成SOAP报文,返回给Middle Service
- Middle Service将SOAP报文转换成HTTP报文,返回给Summit FT
3 结论
Summit系统架构在不断地演进,从6.0开始大量引入分布式的架构和组件,比如使用MQ去除服务耦合;将服务做成WebService;引入Naming Service等。相信随着架构演进,Summit系统会越来越优秀,性能会逐渐提高、部署更加方便、开发也也更加灵活。