为实现一个高TPS、高可靠性、高扩展性、低响应延迟的交易处理系统,在系统架构设计上,需要有诸多考虑。
1. 交易处理系统的功能
交易系统是用于连接多个不同的交易请求系统(上游系统)与交易受理系统(下游系统),在这些交易上下游系统之间传递不同格式的交易报文。同时一个交易请求可能需要发送多个不同的子交易请求到不同的交易受理系统,交易处理系统还负责子交易的拆分、交易完整性与一致性保证。
一个典型的交易处理系统,往往需要支持多种不同的通信协议(TCP长连接、TCP短链接、CTG、CICS、MQ等),支持多种不同的报文格式(固定长度报文、IST8583、key/value、JSON、XML等)。
2. 模块划分
首先,我们可以将交易处理系统分为三层:上游网关、交易处理、下游网关。三层各为独立的进程,三层之间用消息队列进行数据交换。
上、下游网关层负责与上下游系统建立通讯链接、完成报文的拆包、组包。
对每种不同的通讯协议,有相应的通讯链接模块,负责建立通讯链接。
对不同的报文格式,有相应的报文转换模块。为便于系统内部的统一处理,需要定义一个统一的交易数据结构,报文转换模块负责将外部报文与内部数据结构进行相互转换。
交易处理层需实现交易拆分、路由选择、完整性与一致性保证等功能,分为交易请求处理模块与交易返回处理模块。
从上游网关收到交易请求时,需要判断交易需拆分为哪几个子交易,第一个子交易需发给哪个下游系统,随即将此子交易发给对应的下游网关。
从下游网关收到交易返回时,需要判断此交易是否还有下一个子交易待处理,如还有子交易,则同样需要将此子交易发给对应的下游网关。如没有更多子交易,则返回给上游网关。
3. 高TPS与低响应延迟
为实现高TPS与低响应延迟,必须尽量缩短交易处理耗费的时间。为此可从以下几个方面加以考虑:
- 将常用参数载入内存
在交易处理过程中会用到很多参数,例如报文格式参数、交易拆分参数等待。这些参数基本上每笔交易都会用到,且很少会修改。因此可以将这些参数都载入本地内存,加快参数读取速度。
另外可以考虑使用内存数据库,使得多个进程可以共享同一份内存参数,减少对内存的消耗。
- 减少网络IO
上下游网关与交易处理这三层之间是使用消息队列进行数据交换,因此可以将这三层部署在同一个节点(即一个逻辑分区)中,使得三层之间的数据交换无需通过网络IO,减少耗时。
- 使用暂存表缩短查询时间
在处理子交易的返回时,我们需要从数据库中找到这笔子交易的原交易信息。在一个大交易量的系统中,每日交易可能达到数千万笔甚至更多,如果要在数千万笔交易中查找原交易信息,会使数据库面临较大压力。为此可建立一个交易暂存表,这个暂存表只保留近几分钟的交易(如5分钟,一般可设为交易超时时间),这样便可极大减少查找原交易消耗的数据库资源。
4. 高可靠性与可高扩展性
在系统部署时,可以部署多个节点(即多个逻辑分区),每个节点均部署完整的上下游网关与交易处理进程。同时使用负载均衡器负责将交易分发到各节点。上游系统均直连负载均衡器。这样即可任意部署多个节点,任何节点损坏均不影响其他节点的交易处理,增加节点即可(在一定程度上)成比例的增加交易处理能力。从而实现了高可靠性与高扩展性。