0

我迫切希望得到一些帮助。

当大量消息通过不同服务器上的 TCP 套接字连接发送以进行 HSM 卡验证时,我们遇到了问题。

这就是我们为批量测试测试的内容:我们以 15 次/秒的速度处理 30,000 笔交易的 3 个区块进行了测试,并且在第三个区块交易开始被拒绝。

当时的情况是:

  1. 我们成功地处理了区块 1 和 2 的 30,000 笔交易。
  2. 在第三个区块,系统刚刚成功处理了 8,000 个事务,之后与 HSM 的连接被阻止。
  3. 我们看到所有 HSM 套接字都在使用中,因此事务被拒绝。

我们认为由于消息量大,一些套接字没有关闭或超时

以下是代码的要点。

    ; Open the device
    OPEN SOCK:(CONNECT=HOST_":"_PORT_":TCP":DELIMITER=$C(13,10,58,27,95):ATTACH="HSMCLIENT"):TIMOUT:"SOCKET"

    ELSE  SET ER=1 CLOSE SOCK QUIT "-1"
    ; Use the socket
    USE SOCK
    ; Write the request. The request message is packed and the bytesteam is written
    WRITE HREQ,#
    ; Read the first two bytes from the socket to identify the length of the reponse
    READ BRESP#2:TIMOUT ELSE  SET ER=1 CLOSE SOCK QUIT "-1"
    ; Calculate the length of the incoming data
    SET RESPLEN=$A(BRESP,1)_$A(BRESP,2)
    ; Now read the data of the calculated length
    READ BRESP#RESPLEN:TIMOUT ELSE  SET ER=1 CLOSE SOCK QUIT "-1"
    ; Cleanup
    CLOSE SOCK
    #ENDBYPASS

如果您能提供任何建议或建议,将不胜感激。

谢谢

4

1 回答 1

0

TIME_WAIT当您启动主动关闭时,您很可能会将套接字留在 HSM 上。

由于连接建立的速度和周期的持续时间TIME_WAIT以及临时端口的数量有限,您最终会用完可用端口并且无法接受更多连接。

您可以通过在事务完成时中止连接(发送RST而不是发送FIN)来避免 HSM 的套接字进入 TIME_WAIT。Linger您可以通过在关闭连接之前将选项设置为 false 在代码中执行此操作。或者,您的 HSM 可能有一个您可以发送的命令,这意味着“谢谢,我完成了,请关闭连接”,这将允许它启动主动关闭,然后将 TIME_WAIT 移动到客户端计算机(这可能不会如果您有一台客户端计算机,则可以提供帮助,因为您只需将问题从 HSM 无法接受更多连接转换为您无法启动它们...)。

于 2010-09-23T06:52:16.803 回答