Spring boot 修复客户端可以接收传入消息,但不能发送传出心跳消息

Spring boot 修复客户端可以接收传入消息,但不能发送传出心跳消息,spring-boot,apache-camel,quickfix,quickfixj,camel-quickfix,Spring Boot,Apache Camel,Quickfix,Quickfixj,Camel Quickfix,我们已经构建了一个修复客户端。修复客户端可以接收传入消息,但无法发送传出心跳消息或回复TestRequest消息在发送最后一个心跳后,会触发某些内容以停止从客户端发送心跳 修复版本:fix5.0 以前也发生过同样的事件,在这段时间内我们有一个会话的tcpdump 我们将每个修复会话部署到单独的k8s吊舱 我们怀疑这是CPU资源问题,因为在问题出现的时候,平均负载很高,但在我们添加更多CPU内核后,这并没有得到解决。我们认为平均负载很高,因为固定点重新连接 我们怀疑这是IO问题,因为我们使用3个

我们已经构建了一个修复客户端。修复客户端可以接收传入消息,但无法发送传出心跳消息或回复TestRequest消息在发送最后一个心跳后,会触发某些内容以停止从客户端发送心跳

修复版本:fix5.0

以前也发生过同样的事件,在这段时间内我们有一个会话的tcpdump

我们将每个修复会话部署到单独的k8s吊舱

  • 我们怀疑这是CPU资源问题,因为在问题出现的时候,平均负载很高,但在我们添加更多CPU内核后,这并没有得到解决。我们认为平均负载很高,因为固定点重新连接
  • 我们怀疑这是IO问题,因为我们使用3个会话共享的AWS efs进行日志记录和消息存储。但在我们使用pod亲和性将3个会话分配给不同的节点之后,这个问题仍然没有得到解决
  • 这也不是网络问题,因为我们可以接收修复消息,其他会话在那个时候工作得很好。我们在k8s集群中也禁用了SNAT
  • 我们正在使用quickfixj 2.2.0创建一个修复客户端,我们有3个会话,它们部署到单独节点中的k8s吊舱中

  • 从服务器获取外汇价格的速率会话
  • 命令会话要从服务器获取事务(执行报告)消息,我们只向服务器发送登录/心跳/注销消息
  • 后台获取市场状态的会话
  • 我们使用apache camel quickfixj组件来简化编程。它在大多数情况下运行良好,但在3个会话中重新连接到修复服务器时会不断发生,频率就像一个月一次,通常只有2个会话出现问题

    heartbeatInt=30s

    客户端的修复事件消息

    20201004-21:10:53.203 Already disconnected: Verifying message failed: quickfix.SessionException: Logon state is not valid for message (MsgType=1)
    20201004-21:10:53.271 MINA session created: local=/172.28.65.164:44974, class org.apache.mina.transport.socket.nio.NioSocketSession, remote=/10.60.45.132:11050
    20201004-21:10:53.537 Initiated logon request
    20201004-21:10:53.643 Setting DefaultApplVerID (1137=9) from Logon
    20201004-21:10:53.643 Logon contains ResetSeqNumFlag=Y, resetting sequence numbers to 1
    20201004-21:10:53.643 Received logon
    
    8=FIXT.1.1☺9=65☺35=0☺34=2513☺49=Quote1☺52=20201004-21:09:02.887☺56=TA_Quote1☺10=186☺
    8=FIXT.1.1☺9=65☺35=0☺34=2514☺49=Quote1☺52=20201004-21:09:33.089☺56=TA_Quote1☺10=185☺
    8=FIXT.1.1☺9=74☺35=1☺34=2515☺49=Quote1☺52=20201004-21:09:48.090☺56=TA_Quote1☺112=TEST☺10=203☺ 
    ----- 21:10:53.203 Already disconnected ----
    8=FIXT.1.1☺9=87☺35=A☺34=1☺49=Quote1☺52=20201004-21:10:53.639☺56=TA_Quote1☺98=0☺108=30☺141=Y☺1137=9☺10=183☺
    8=FIXT.1.1☺9=62☺35=0☺34=2☺49=Quote1☺52=20201004-21:11:23.887☺56=TA_Quote1☺10=026☺
    
    8=FIXT.1.1☺9=65☺35=0☺34=2513☺49=TA_Quote1☺52=20201004-21:09:02.884☺56=Quote1☺10=183☺
    ---- no heartbeat message around 21:09:32 ----
    ---- 21:10:53.203 Already disconnected ---
    8=FIXT.1.1☺9=134☺35=A☺34=1☺49=TA_Quote1☺52=20201004-21:10:53.433☺56=Quote1☺98=0☺108=30☺141=Y☺553=xxxx☺554=xxxxx☺1137=9☺10=098☺
    8=FIXT.1.1☺9=62☺35=0☺34=2☺49=TA_Quote1☺52=20201004-21:11:23.884☺56=Quote1☺10=023☺
    8=FIXT.1.1☺9=62☺35=0☺34=3☺49=TA_Quote1☺52=20201004-21:11:53.884☺56=Quote1☺10=027☺
    
    客户端的修复传入的消息

    20201004-21:10:53.203 Already disconnected: Verifying message failed: quickfix.SessionException: Logon state is not valid for message (MsgType=1)
    20201004-21:10:53.271 MINA session created: local=/172.28.65.164:44974, class org.apache.mina.transport.socket.nio.NioSocketSession, remote=/10.60.45.132:11050
    20201004-21:10:53.537 Initiated logon request
    20201004-21:10:53.643 Setting DefaultApplVerID (1137=9) from Logon
    20201004-21:10:53.643 Logon contains ResetSeqNumFlag=Y, resetting sequence numbers to 1
    20201004-21:10:53.643 Received logon
    
    8=FIXT.1.1☺9=65☺35=0☺34=2513☺49=Quote1☺52=20201004-21:09:02.887☺56=TA_Quote1☺10=186☺
    8=FIXT.1.1☺9=65☺35=0☺34=2514☺49=Quote1☺52=20201004-21:09:33.089☺56=TA_Quote1☺10=185☺
    8=FIXT.1.1☺9=74☺35=1☺34=2515☺49=Quote1☺52=20201004-21:09:48.090☺56=TA_Quote1☺112=TEST☺10=203☺ 
    ----- 21:10:53.203 Already disconnected ----
    8=FIXT.1.1☺9=87☺35=A☺34=1☺49=Quote1☺52=20201004-21:10:53.639☺56=TA_Quote1☺98=0☺108=30☺141=Y☺1137=9☺10=183☺
    8=FIXT.1.1☺9=62☺35=0☺34=2☺49=Quote1☺52=20201004-21:11:23.887☺56=TA_Quote1☺10=026☺
    
    8=FIXT.1.1☺9=65☺35=0☺34=2513☺49=TA_Quote1☺52=20201004-21:09:02.884☺56=Quote1☺10=183☺
    ---- no heartbeat message around 21:09:32 ----
    ---- 21:10:53.203 Already disconnected ---
    8=FIXT.1.1☺9=134☺35=A☺34=1☺49=TA_Quote1☺52=20201004-21:10:53.433☺56=Quote1☺98=0☺108=30☺141=Y☺553=xxxx☺554=xxxxx☺1137=9☺10=098☺
    8=FIXT.1.1☺9=62☺35=0☺34=2☺49=TA_Quote1☺52=20201004-21:11:23.884☺56=Quote1☺10=023☺
    8=FIXT.1.1☺9=62☺35=0☺34=3☺49=TA_Quote1☺52=20201004-21:11:53.884☺56=Quote1☺10=027☺
    
    修复客户端传出的消息

    20201004-21:10:53.203 Already disconnected: Verifying message failed: quickfix.SessionException: Logon state is not valid for message (MsgType=1)
    20201004-21:10:53.271 MINA session created: local=/172.28.65.164:44974, class org.apache.mina.transport.socket.nio.NioSocketSession, remote=/10.60.45.132:11050
    20201004-21:10:53.537 Initiated logon request
    20201004-21:10:53.643 Setting DefaultApplVerID (1137=9) from Logon
    20201004-21:10:53.643 Logon contains ResetSeqNumFlag=Y, resetting sequence numbers to 1
    20201004-21:10:53.643 Received logon
    
    8=FIXT.1.1☺9=65☺35=0☺34=2513☺49=Quote1☺52=20201004-21:09:02.887☺56=TA_Quote1☺10=186☺
    8=FIXT.1.1☺9=65☺35=0☺34=2514☺49=Quote1☺52=20201004-21:09:33.089☺56=TA_Quote1☺10=185☺
    8=FIXT.1.1☺9=74☺35=1☺34=2515☺49=Quote1☺52=20201004-21:09:48.090☺56=TA_Quote1☺112=TEST☺10=203☺ 
    ----- 21:10:53.203 Already disconnected ----
    8=FIXT.1.1☺9=87☺35=A☺34=1☺49=Quote1☺52=20201004-21:10:53.639☺56=TA_Quote1☺98=0☺108=30☺141=Y☺1137=9☺10=183☺
    8=FIXT.1.1☺9=62☺35=0☺34=2☺49=Quote1☺52=20201004-21:11:23.887☺56=TA_Quote1☺10=026☺
    
    8=FIXT.1.1☺9=65☺35=0☺34=2513☺49=TA_Quote1☺52=20201004-21:09:02.884☺56=Quote1☺10=183☺
    ---- no heartbeat message around 21:09:32 ----
    ---- 21:10:53.203 Already disconnected ---
    8=FIXT.1.1☺9=134☺35=A☺34=1☺49=TA_Quote1☺52=20201004-21:10:53.433☺56=Quote1☺98=0☺108=30☺141=Y☺553=xxxx☺554=xxxxx☺1137=9☺10=098☺
    8=FIXT.1.1☺9=62☺35=0☺34=2☺49=TA_Quote1☺52=20201004-21:11:23.884☺56=Quote1☺10=023☺
    8=FIXT.1.1☺9=62☺35=0☺34=3☺49=TA_Quote1☺52=20201004-21:11:53.884☺56=Quote1☺10=027☺
    
    当从服务器收到测试消息时线程转储。顺便说一句,要点来自我们的开发环境,它具有相同的部署。


    我们在quickfixj上启用了调试日志,但没有太多信息,只有接收到的消息的日志。

    时间序列

  • 20201101-23:56:02.742此时应发送传出心跳信号,看起来它正在发送,但在io写入时挂起-处于运行状态
  • 20201101-23:56:18.651从服务器端发送到触发线程转储的测试消息
  • 20201101-22:57:45.654服务器端开始关闭连接
  • 20201101-22:57:46.727螺纹卸载-右侧
  • 20201101-23:57:48.363登录消息
  • 20201101-22:58:56.515螺纹卸载-左侧
  • 右侧(2020-11-01T22:57:46.727Z):悬挂时,左侧(2020-11-01T22:58:56.515Z):重新连接后

    看起来我们正在使用的storage-aws efs导致了问题的发生。 但是来自aws支持部门的反馈是,aws efs方面没有任何问题。 可能是k8s ec2实例和aws efs之间的网络问题

  • 首先,我们使日志记录在所有会话中都是异步的,从而减少断开连接的发生
  • 其次,对于市场会话,我们将序列文件写入本地磁盘,在市场会话中断开连接
  • 第三,最后我们用aws ebs(k8s中的持久卷)替换了所有会话的aws efs。现在效果很好

  • 顺便说一句,aws ebs跨区域的可用性不高,但它比修复断开连接要好。

    时间序列中的序列

  • 20201101-23:56:02.742此时应发送传出心跳信号,看起来它正在发送,但在io写入时挂起-处于运行状态
  • 20201101-23:56:18.651从服务器端发送到触发线程转储的测试消息
  • 20201101-22:57:45.654服务器端开始关闭连接
  • 20201101-22:57:46.727螺纹卸载-右侧
  • 20201101-23:57:48.363登录消息
  • 20201101-22:58:56.515螺纹卸载-左侧
  • 右侧(2020-11-01T22:57:46.727Z):悬挂时,左侧(2020-11-01T22:58:56.515Z):重新连接后

    看起来我们正在使用的storage-aws efs导致了问题的发生。 但是来自aws支持部门的反馈是,aws efs方面没有任何问题。 可能是k8s ec2实例和aws efs之间的网络问题

  • 首先,我们使日志记录在所有会话中都是异步的,从而减少断开连接的发生
  • 其次,对于市场会话,我们将序列文件写入本地磁盘,在市场会话中断开连接
  • 第三,最后我们用aws ebs(k8s中的持久卷)替换了所有会话的aws efs。现在效果很好

  • 顺便说一句,aws ebs在整个区域内的可用性不高,但它比修复断开连接要好。

    您或客户方面有什么问题吗?有点令人困惑的问题。你能问个确切的问题吗?谢谢,更新了描述。我们是修复客户端,问题发生在修复客户端。你在收到的每封邮件上都做了线程转储(见要点)吗?@ChristophJohn No,只有在服务器无法在1.5*heartbeatInt中从客户端接收到心跳信号后,客户端才从服务器接收到TestRequest消息。您或客户端是否有任何问题?有点令人困惑的问题。你能问个确切的问题吗?谢谢,更新了描述。我们是修复客户端,问题发生在修复客户端。您是否对每个收到的消息都执行此线程转储操作(如gist中所示)?@ChristophJohn否,仅当服务器在1.5*heartbeatInt中无法从客户端接收心跳后,客户端才从服务器接收到TestRequest消息。