我们在我们的项目中使用STOMP中继(外部代理- ActiveMQ 5.13.2)参见https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#websocket-stomp-handle-broker-relay
我们使用以下堆栈:
org.springframework:spring-jms:jar:5.1.8.RELEASE
org.springframework:spring-messaging:jar:5.1.8.RELEASE
io.projectreactor:reactor-core:jar:3.2.8.RELEASE
io.projectreactor.netty:reactor-netty:jar:0.8.6.RELEASE
io.netty:netty-all:jar:4.1.34.Final有时(比方说每两周一次),我们可以在tomcat catalina.out日志中观察到错误。
2019-08-21 13:38:58,891 [tcp-client-scheduler-5] ERROR com.*.websocket.stomp.SimpMessagingSender - BrokerAvailabilityEvent[available=false, StompBrokerRelay[ReactorNettyTcpClient[reactor.netty.tcp.TcpClientDoOn@219abb46]]]
2019-08-21 13:38:58,965 [tcp-client-scheduler-1] ERROR org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler - Transport failure: java.lang.IllegalStateException: No TcpConnection available在该错误之后,STOMP通信中断(system连接-单个TCP连接不可用)
当我们更新堆栈时,似乎一切都开始了:
org.springframework:spring-jms:jar:5.0.8.RELEASE
org.springframework:spring-messaging:jar:5.0.8.RELEASE
io.projectreactor:reactor-core:jar:3.1.8.RELEASE
io.projectreactor.netty:reactor-netty:jar:0.7.8.RELEASE
io.netty:netty-all:jar:4.1.25.FinalActiveMQ版本未更改
在春季报告了一个错误,当system连接丢失时,自动重新连接失败,请参阅:https://github.com/spring-projects/spring-framework/issues/22080。
现在有三个问题:
如何使这个问题更加reproducible?
编辑23.09.2019
发生错误后,端口61613(STOMP)的TCP堆栈如下(请注意CLOSE_WAIT状态):
netstat -an | grep 61613
tcp6 0 0 :::61613 :::* LISTEN
tcp6 2 0 127.0.0.1:49084 127.0.0.1:61613 CLOSE_WAIT发布于 2020-01-24 15:45:58
我不能说我有足够的信息来回答你的问题,尽管我有一些信息可以帮助你找到前进的方向。
ActiveMQ通常在宿主/分布式环境中使用,因此加载和缩放应该始终是考虑的问题。
大多数dbs/消息队列/等等。即使是在AWS上(通过请求更高的限制),也需要对负载进行某种类型的调优,尽管其中的大部分都是由主机提供商处理的。
但我离题了。
在这种情况下,您似乎使用TCP传输来处理队列:
https://activemq.apache.org/tcp-transport-reference
正如您所看到的,所有这些设置都可以被调优并具有默认值。
因此,在记录从spring端连接到AMQ的问题时,您需要缩小错误发生的时间,然后查看AMQ指标和日志。
如果你没有对AMQ的监控,我建议:
https://activemq.apache.org/how-can-i-monitor-activemq
。
为您的分布式系统设置正确的工具,使您的团队能够搜索/查找错误/日志(并记录如何做到这一点)是非常有帮助的。此外,(对于成熟的系统)是在监控的顶部添加一个层,这样您的系统就可以在出现问题时告诉您,而不是反过来(去寻找问题)。
这可能有点冗长--但这一切都会导致我问您是否有AMQ系统故障时的日志/度量标准。如果你这样做了,请张贴他们!
我提出这些建议是因为:
没有提供关于负载预期、负载可变性或系统中负载是考虑因素的信息(通过故障排除,steps).
还可以考虑在Spring端添加spring来监视您的消息客户端,因为客户机连接池和高级设置也经常有限制/设置,特别是当您缩放/缩小实例大小时,等等。您的实例将处理更多/更少的负载,您的客户端库可能需要一些设置调优。
https://www.baeldung.com/spring-boot-actuators
Exposing metrics about current Websocket connections with Spring
您还可以捕获异常并删除和重新创建连接/设置--尽管这不是我建议的第一件事,因为在连接失败时不了解更多的情况和状态。
https://stackoverflow.com/questions/57992857
复制相似问题