首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用java nio/netty和activemq实现银行atm tcp消息负载平滑和路由

使用java nio/netty和activemq实现银行atm tcp消息负载平滑和路由
EN

Stack Overflow用户
提问于 2015-10-15 03:26:24
回答 1查看 909关注 0票数 1

我正在设计银行ATM消息处理/路由框架,在最后确定技术和体系结构方面需要一些帮助。交易来自多个合作银行的自动取款机,例如目前我们为5至6家银行服务,但每家银行不超过10台自动取款机。

  1. 消息通过tcp套接字来自ATM,并被称为ATM控制器的多线程Java进程接收。它以阻塞模式运行,每个套接字只有一个线程。每个银行都有一个独特的端口,所有的自动取款机都在这里发送信息。
  2. 通过tcp套接字将消息转换为发送到硬件安全模块的ISO8583格式进行解密,并使用另一个软件模块进行PIN验证。到目前为止,这些标准库运行良好。
  3. 然后,消息被发送到另一个称为事务路由器的Java程序,同样通过tcp套接字发送。事务路由器将消息路由到本地系统,用于信道内银行,或将NPCI网关路由到非信道银行事务。

当前的系统是使用核心java和阻塞线程构建的,但它有以下痛苦之处

  1. 信息在传输过程中丢失。
  2. 超时经常发生,导致我们数据库中事务的脱机反转。我们需要在15秒内把响应发送回自动取款机。
  3. 如果系统关闭或断电,则无法恢复。
  4. 在控制器或路由器程序中没有负载平衡。

为了消除这些痛苦,我们正在重新设计系统,并考虑以下技术

  1. 用于非阻塞线程的Java Nio2,或者可能用于Netty或Mina,因为我们预计将来会有更多的银行和自动取款机由我们的系统提供服务。还是阻止io足够满足我们的需要?
  2. 用于生成队列消息的ActiveMQ在传输期间是持久的。
  3. 用于tcp负载平衡的Nginx或HAProxy。

我要问的问题是

  1. 如果我在ATM控制器和事务路由器上使用java Nio2,那么我是否需要一种机制来插入要插入到消息中的相关id,以便我能够将响应发送回正确的套接字,因为非阻塞是异步模式,因此一个线程可能会服务多个套接字。

编辑

对要求做了进一步的澄清,

1)我们与银行自动取款机建立的TCP连接永远不会终止,除非存在某种网络问题。因此,对于每个请求,在发送响应之前,我们需要先做一个保持活动的检查,因为这是一个长时间运行的连接。

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

因此,如果我按照专家的建议,使用基于JMS的方法阻塞每个连接的线程,那么在发送响应之前如何保持活动。

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

EN

回答 1

Stack Overflow用户

发布于 2015-10-15 08:44:33

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33139329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档