我正在设计银行ATM消息处理/路由框架,在最终确定技术和架构方面需要一些帮助。交易来自多家ATM合作银行,目前我们为5至6家银行提供服务,每家银行不超过10家ATMS。
消息来自ATM通过tcp套接字,并由称为ATM控制器的多线程Java进程接收。它以阻塞模式运行,每个插槽一个线程。每个银行都有一个唯一的端口,其所有ATM都发送消息。
将消息转换为发送到硬件安全模块(HSM)的ISO8583格式,以便通过tcp套接字进行解密,还可以使用其他软件模块进行PIN验证。这些是迄今为止工作正常的标准库。
然后再通过tcp套接字将消息发送到另一个名为Transaction router的Java程序。事务路由器将消息路由到本地系统用于通道内银行或NPCI网关用于非通道银行交易。
当前系统是使用核心java和阻塞线程构建的,但它有以下痛苦的区域
邮件在传输过程中丢失。
超时发生超时,导致我们数据库中的交易脱机逆转。我们需要在15秒内将响应发送回ATM
如果系统关闭或断电,则无法恢复。
在控制器或路由器程序中没有负载平衡。
为了消除这些痛苦领域,我们正在重新设计系统并考虑以下技术
Java Nio2用于非阻塞线程,或者可能是Netty或Mina,因为将来我们预计会有更多的银行和自动取款系统获得服务。或阻止io足以满足我们的需求?
用于对要发送的邮件进行排队的ActiveMQ在传输过程中是持久的。
用于tcp负载平衡的Nginx或HAProxy。
我的问题是
修改
进一步澄清了要求,
1)我们的TCP连接一旦与银行ATM建立,永远不会终止,除非存在网络问题。因此,对于每个请求,我们需要首先进行保持活动检查,然后才能发送响应,并将其转换为长时间连接。
2)我们期待500到800个并发的非终止tcp连接。此外,当ATM由于重启或维护而首次启动时,它需要与服务器交换一些配置数据,并且进一步的请求应始终命中已缓存此配置数据的同一服务器。
Q1)因此,如果我通过专家建议使用基于JMS的方法来阻止每个连接的线程,我怎样才能在发送响应之前进行保持活动检查。
Q2)如果我需要在高可用性模式下运行tcp服务器应该采用什么方法。 ?
答案 0 :(得分:2)
考虑到ATM和金融交易的使用案例,您不应该从复杂的低级非阻塞解决方案开始。
一直进行事务性JMS消息传递并阻止I / O.您不会被消息超支,因此您应该可以非常轻松地计算最大负载(同一分钟使用的所有ATM机)。即使您有数千台连接的ATM机,这也不会很高。这是一种典型情况,在扩展之前可靠性和较少的代码复杂性(较少的错误)。硬件很便宜,你不可能达到高峰负荷。