使用JavaNIO/netty和activemq的银行atm tcp消息负载均衡和路由

使用JavaNIO/netty和activemq的银行atm tcp消息负载均衡和路由,tcp,activemq,netty,load-balancing,nio,Tcp,Activemq,Netty,Load Balancing,Nio,我正在设计银行ATM消息处理/路由框架,需要一些技术和架构方面的帮助。交易来自合作银行的多台自动取款机,比如说,目前我们为5到6家银行提供服务,每家银行不超过10台自动取款机 消息通过tcp套接字来自ATM,并由称为ATM控制器的多线程Java进程接收。它以阻塞模式运行,每个套接字一个线程。每个银行都有一个唯一的端口,所有的ATM都在这个端口发送信息 消息转换为ISO8583格式,通过tcp套接字发送到硬件安全模块(HSM)进行解密,PIN验证也使用另一个软件模块完成。这些是标准库,到目前为止运

我正在设计银行ATM消息处理/路由框架,需要一些技术和架构方面的帮助。交易来自合作银行的多台自动取款机,比如说,目前我们为5到6家银行提供服务,每家银行不超过10台自动取款机

  • 消息通过tcp套接字来自ATM,并由称为ATM控制器的多线程Java进程接收。它以阻塞模式运行,每个套接字一个线程。每个银行都有一个唯一的端口,所有的ATM都在这个端口发送信息

  • 消息转换为ISO8583格式,通过tcp套接字发送到硬件安全模块(HSM)进行解密,PIN验证也使用另一个软件模块完成。这些是标准库,到目前为止运行良好

  • 消息然后被发送到另一个Java程序,称为事务路由器,同样通过tcp套接字。交易路由器将消息路由到本地系统(用于通道内银行)或NPCI网关(用于非通道银行交易)

  • 当前的系统是使用核心java和阻塞线程构建的,但它有以下方面的问题

  • 信息在传输过程中丢失

  • 超时的发生非常频繁,这会导致数据库中事务的脱机反转。我们需要在最长15秒内将响应发送回ATM

  • 如果系统关闭或断电,则无法恢复

  • 控制器或路由器程序均无负载平衡

  • 为了消除这些问题,我们正在重新设计系统,并考虑采用以下技术

  • Java Nio2用于非阻塞线程,或者可能是Netty或Mina,因为未来我们预计更多的银行和ATM将由我们的系统提供服务。或者阻塞io就足以满足我们的需要

  • 用于对要生成的消息进行排队的ActiveMQ在传输期间是持久的

  • Nginx或HAProxy用于tcp负载平衡

  • 我的问题是

  • 如果我在ATM控制器和事务路由器上使用java Nio2,那么我是否需要一种机制来插入要插入到消息中的相关id,这样我就可以将响应发送回正确的套接字,因为非阻塞是异步模式,所以一个线程可以为多个套接字提供服务
  • 编辑

    对要求做了进一步澄清

    1) 我们的TCP连接一旦与银行ATM建立,就永远不会终止,除非出现网络问题。因此,对于每个请求,在发送响应之前,我们需要先进行一次保持活动状态检查,以确保它是一个长期运行的连接

    2) 我们预计有500到800个并发的非终止tcp连接。此外,当ATM由于重新启动或维护而首次启动时,它需要与服务器交换一些配置数据,并且进一步的请求应该始终命中缓存此配置数据的同一服务器

    Q1)所以,如果我按照专家的建议使用基于JMS的方法,每个连接阻塞线程,那么在发送响应之前如何进行保持活动状态检查


    问题2)如果我需要在高可用性模式下运行tcp服务器,应该采取什么方法

    考虑到ATM和金融交易的使用案例,您不应该从复杂的低级别非阻塞解决方案开始


    一直使用事务性JMS消息传递和阻塞I/O。您不会被消息溢出,因此您应该能够非常轻松地计算最大负载(所有ATM机在同一分钟内使用)。即使你有数千台相连的ATM机,这也不会很高。这是一种典型的情况,在这种情况下,可靠性和较低的代码复杂性(较少的bug)会在扩展之前出现。硬件很便宜,您可能不会达到高峰负载。

    欢迎使用堆栈溢出!如果您可以发布单独的问题,而不是将您的问题合并为一个问题,这是首选。这样,它可以帮助人们回答你的问题,也可以帮助其他人寻找至少一个你的问题。谢谢我强烈建议您不要为此使用NIO。您需要做的是调试现有系统。使用NIO只会使情况变得更糟。非阻塞NIO服务器套接字线程的请求-响应是否与阻塞线程套接字的工作方式相同,或者需要在服务器代码侦听器的有效负载中插入任何特殊字段,以识别用于发送响应的正确服务器套接字(由于其异步性质)?不。我建议您这样做看看基于JMS的解决方案。Nginx和HAProxy是在第4层工作以平衡传入tcp套接字连接的负载,还是仅在第7层使用。最大并发套接字的限制应该是多少,超过这个限制就需要进行负载平衡?