java - Kubernetes 上与 ActiveMQ 的 TCP 连接不断变化
问题描述
我设置了如下场景:Web 应用程序(部署在 VM 上)连接到 ActiveMQ(版本:部署在 k8s 容器上的 5.15.10)。Kubernetes 集群包含 2 个工作节点。我在 ActiveMQ 的连接仪表板上发现几分钟后连接发生了变化。
应用程序抛出以下日志:
javax.jms.JMSException: java.io.EOFException
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:54)
at org.apache.activemq.ActiveMQConnection.onAsyncException(ActiveMQConnection.java:1960)
at org.apache.activemq.ActiveMQConnection.onException(ActiveMQConnection.java:1979)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:114)
at org.apache.activemq.transport.ResponseCorrelator.onException(ResponseCorrelator.java:126)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:114)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:114)
at org.apache.activemq.transport.WireFormatNegotiator.onException(WireFormatNegotiator.java:173)
at org.apache.activemq.transport.AbstractInactivityMonitor.onException(AbstractInactivityMonitor.java:345)
at org.apache.activemq.transport.TransportSupport.onException(TransportSupport.java:96)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:219)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.io.EOFException
at java.base/java.io.DataInputStream.readInt(DataInputStream.java:397)
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:268)
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:240)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:232)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215)
... 1 more
从 ActiveMQ 方面,我找到了日志:
2020-04-07 15:06:09,575 | WARN | Transport Connection to: tcp://10.171.159.210:41910 failed: org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: tcp://10.171.159.210:41910 | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ InactivityMonitor Worker
Web 应用程序具有以下与 ActiveMQ 的 openwire 格式的 tcp 连接:
tcp://10.171.159.210:61616?connectionTimeout=0&keepAlive=true&useInactivityMonitor=false&wireFormat.maxInactivityDuration=0
任何人都可以有解决方案来保持连接被重用吗?因为,当套接字连接断开时,可能会导致消息被重新传递。
编辑我的服务 yaml 是:
apiVersion: v1
kind: Service
metadata:
annotations:
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private
service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "2760930"
creationTimestamp: "2020-02-18T06:13:01Z"
labels:
run: message-broker
name: message-broker-service
namespace: default
resourceVersion: "9923438"
selfLink: /api/v1/namespaces/default/services/message-broker-service
uid: b765e641-5215-11ea-8a3b-6eead9e5000e
spec:
clusterIP: 172.21.166.249
externalTrafficPolicy: Cluster
loadBalancerIP: 10.93.197.99
ports:
- name: port8161
nodePort: 32577
port: 8161
protocol: TCP
targetPort: 8161
- name: port61616
nodePort: 31958
port: 61616
protocol: TCP
targetPort: 61616
- name: port61613
nodePort: 31200
port: 61613
protocol: TCP
targetPort: 61613
selector:
run: message-broker
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 10.93.197.99
解决方案
推荐阅读
- java - 如果其他条件未设置属性,则 logback
- regex - 我的 perl 中的 escape_Q 无法识别括号
- firebase - 如何从 Flutter 向本地云功能服务器发送 HTTP POST
- corda - Corda - 如何在 Java 中使用令牌 SDK 实用程序函数
- python - 网格内的 Tkinter 网格?
- go - golang服务器中的连接卡在CLOSE_WAIT
- node.js - Axios 请求后出现 502 Bad Gateway Error
- c# - 如何将日期时间反序列化为当地时间?
- dataframe - 从给定的日期列(pyspark)创建一个日期为 3 年的列?
- ruby - 如何猴子补丁“GC.start”