Summit System Implementation Ove
上文介绍了Summit系统的整体MVC构架。本文将对Summit系统的实现进行一个概述性的介绍。Summit系统从架构上来讲是很优秀的,个人认为其架构师的想法非常好,当然也设计出来了。但在实现的时候就没那么美好了,Summit系统的实现比较复杂,比较麻烦,感觉跟架构师的想法有很大出入。如果你做过Summit项目,再深入到细节,你就会感觉到恶心了,因为Summit实现细节真的很烂。但我是站上现在的技术基础上开了上帝视角看一个存在了30年系统,有点站着说话不腰疼。个人而言,还是比较佩服Summit架构师的,为它的实现感到惋惜。当前,笔者认为Summit系统的架构正在向分布式方向演进,因为它开始大量采用MQ、Web Service这些降低耦合的方式来优化架构了。
笔者今天要介绍的内容,是Summit系统实现的各个模块,以及模块之间的交互方式。本文站在架构师角度描述各个模块之间的关系,不会涉及具体细节,因此,还是可以感受到Summit系统架构的优秀之处:
Summit系统模块
Summit系统运行时模块交互
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 Control Middle Web Service 负责HTTP会话报文与Web Service Soap报文之间的转换
4 Control Naming Web Service 负责Web Service的注册、查找;负责客户端会话与后台etkservice进程
之间的注册、查找(会话保持)
5 Control Generate ID Web Service 产生全局唯一ID的Web Service
6 Control MQ 消息中间件(服务之间的松耦合)
7 Control etkservice 用户HTTP请求后台服务进程
8 Model database 持久化数据库
9 N/A STP ServiceSummit 系统事件处理服务
10 N/A BVS ServiceBlotter View Server 即实时刷新服务
11 N/A SequencerSummit 系统事件发布服务
12 N/A SMTService 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,这是一个WebService服务端程序,启动进程后,会通过一个端口服务某个用户会话。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)就是这样一个管理工具。提供了基本的服务启动、停止、新建、删除的功能。
Summit系统模块交互
上文静态地介绍了Summit系统的各个模块,接下来,笔者将会介绍在Summit系统运行时,各个模块之间的交互协议以及方式,对于不同的操作,调用的模块不同,交互的方式也不同,因此,笔者选取了以下几个典型场景,来说明交互过程:
登陆过程
操作过程
事件处理过程
2.1 登陆过程
1 系统启动时,Generate ID需要启动,启动时向Naming Service注册自己
2 用户登陆点击登陆后,Summit FT向ETK服务发起HTTP请求
3 ETK服务启动一个etkservice进程来服务此用户
4 etkservice启动后,向Naming Service注册自己(Session ID<-> 端口号)
5 etkservice读取数据库中的用户信息,验证密码及其他信息(比如是否过期、是否被锁定)
6 etkservice验证完成后,将结果以SOAP报文的形式返回给Middle Service
7 Middle Service将SOAP报文转换成HTTP报文并返回给Summit FT
2.2 操作过程
操作过程是指用户登陆成功后,在Summit FT客户端进行相关的操作,比如点击按钮、订阅实时消息操作。此时的交互方式与登陆有所差别。
1 Summit FT发送HTTP请求至Middle Service(带有Session标识)
2 Middle service向Naming Service发起Web Service查询此请求对应的etkservice端口(使用Session ID),查询成功后,以SOAP报文形式返回
3 Middle service查询到session对应的etkservice后,向etkservice发起Web Service请求
4 etkservice响应请求,与数据库交互,如果需要生成新的ID,则会向Generate ID发起Web Service请求生成ID。Generate ID生成ID后,以SOAP形式返回给etkservice。
5 etkservice处理完成后,将结果以SOAP报文形式返回给Middle Service
6 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事件使用黑底白字表示:
1 STP服务启动时,会向MQ订阅相关事件
2 Sequencer检索数据库,查询每个STP服务处理的进度,并检索出未处理事件
3 Sequencer将未处理事件发布到MQ
4 MQ收到事件后,将事件推送给相关的订阅者,即STP服务
5 STP服务处理事件,过程中很有可能生成新的数据,因此需要使用Generate ID服务
6 STP服务处理事件,过程中很有可能进行数据库的读取和保存。处理完成后,更新对应STP服务的Sequencer,以防止重复处理事件
2.3.2 用户BVS事件
用户BVS事件使用白底黑字表示:
1 用户在Summit FT打开Blotter View,Summit FT发送HTTP请求至Middle Service
2 Middle Service收到请求后,通过Naming Service(见2.2)找到对应的etkservice,并将HTTP报文转换成SOAP报文发送过去
3 etkservice向对应的BVS请求队列中发送“实时数据订阅”请求;
4 BVS服务从请求队列中获取“实时数据订阅”请求,
5 BVS服务按照请求的筛选条件,从数据库中加载相关数据
6 BVS服务将检索出的数据推送到返回队列
7 etkservice从返回队列中获取BVS检索到的数据
8 etkservice将检索到的数据转换成SOAP报文,返回给Middle Service
9 Middle Service将SOAP报文转换成HTTP报文,返回给Summit FT
3 结论
Summit系统架构在不断地演进,从6.0开始大量引入分布式的架构和组件,比如使用MQ去除服务耦合;将服务做成WebService;引入Naming Service等。相信随着架构演进,Summit系统会越来越优秀,性能会逐渐提高、部署更加方便、开发也也更加灵活。