0

私はこれについて何らかの助けを得ることを切望しています。

HSM カードの検証のために、別のサーバー上の TCP ソケット接続を介して大量のメッセージが送信されると、問題が発生します。

これは、ボリューム テストでテストしたものです。15 トランザクション/秒で 30,000 トランザクションの 3 ブロックを処理してテストし、3 番目のブロックでトランザクションが拒否され始めました。

状況は次のとおりです。

  1. 30,000 件のトランザクションでブロック 1 と 2 を正常に処理しました。
  2. 3 番目のブロックで、システムは 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トランザクションの完了時に接続を中止する (ではなくを送信する) ことにより、HSM のソケットが TIME_WAIT になるのを回避できる場合がありますFINLinger接続を閉じる前にオプションを false に設定することにより、コードでこれを行います。別の方法として、HSM に「ありがとうございます。完了しました。接続を閉じてください」という意味のコマンドを送信できる場合があります。これにより、アクティブ クローズを開始し、クライアント マシンに TIME_WAIT を移動できます (これはできない場合があります)。 HSM がより多くの接続を受け入れることができないという問題から、それらを開始できないという問題に切り替えるだけなので、単一のクライアント マシンがある場合に役立ちます...)。

于 2010-09-23T06:52:16.803 に答える