【问题标题】:bank atm tcp message load blancing and routing using java nio/netty and activemq使用 java nio/netty 和 activemq 进行银行 atm tcp 消息负载平衡和路由
【发布时间】:2015-10-15 03:26:24
【问题描述】:

我正在设计银行 ATM 消息处理/路由框架,在最终确定技术和架构时需要一些帮助。交易来自合作银行的多个 ATM,例如目前我们为 5 到 6 家银行提供服务,每家银行不超过 10 个 ATM。

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

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

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

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

  1. 消息在传输过程中丢失。

  2. 经常发生超时,导致我们数据库中的事务脱机撤销。我们需要在最多 15 秒内将响应发送回 ATM。

  3. 如果系统关闭或断电,则无法恢复。

  4. 在控制器或路由器程序中没有负载平衡。

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

  1. Java Nio2 用于非阻塞线程,或者可能是 Netty 或 Mina,因为我们预计将来会有更多的银行和自动取款机由我们的系统提供服务。还是阻塞 io 足以满足我们的需求??

  2. 用于排队消息的 ActiveMQ 在传输过程中是持久的。

  3. 用于 tcp 负载平衡的 Nginx 或 HAProxy。

我的问题是

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

编辑

得到了一些关于要求的进一步说明,

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

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

Q1) 因此,如果我按照专家的建议使用基于 JMS 的方法并在每个连接上阻塞线程,我该如何在发送响应之前进行保持活动检查。

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

【问题讨论】:

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

标签: tcp activemq netty load-balancing nio


【解决方案1】:

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

一直使用事务性 JMS 消息传递和阻塞 I/O。您不会被消息淹没,因此您应该能够很容易地计算最大负载(同时使用所有 ATM 机)。即使您有数千台连接的 ATM 机,这也不会很高。这是一个典型的案例,即可靠性和更少的代码复杂性(更少的错误)出现在扩展之前。硬件很便宜,您不太可能遇到高峰负载。

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多