【问题标题】:Understanding ActiveMQ Artemis AMQ222061 & AMQ222107 warnings了解 ActiveMQ Artemis AMQ222061 & AMQ222107 警告
【发布时间】:2021-09-06 19:24:12
【问题描述】:

目前,我的应用程序接收到非常低的流量 1-2 请求/秒,这些流量被发送到 JMS 队列。但是在artemis.log 中,我看到了以下WARN 消息。

2021-06-23 10:51:49,433 WARN  [org.apache.activemq.artemis.core.server] AMQ222061: Client connection failed, clearing up resources for session d798a4d3-d3f7-11eb-86d7-005056b536f0
2021-06-23 10:51:49,434 WARN  [org.apache.activemq.artemis.core.server] AMQ222107: Cleared up resources for session d798a4d3-d3f7-11eb-86d7-005056b536f0
2021-06-23 10:51:49,434 WARN  [org.apache.activemq.artemis.core.server] AMQ222061: Client connection failed, clearing up resources for session d798cbe4-d3f7-11eb-86d7-005056b536f0
2021-06-23 10:51:49,435 WARN  [org.apache.activemq.artemis.core.server] AMQ222107: Cleared up resources for session d798cbe4-d3f7-11eb-86d7-005056b536f0

Artemis 日志由 NFS 支持,所有消息都被持久化。我正在使用 Spring 的 JmsTemplate 和 JmsPoolConnectionFactory。

@Bean
public ConnectionFactory jmsConnectionFactoryOnline() {
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl,username,password);
    connectionFactory.setCallTimeout(3000);
    return connectionFactory;
}
@Bean
@Primary
public JmsPoolConnectionFactory pooledConnectionFactory() {
    JmsPoolConnectionFactory poolingFactory = new JmsPoolConnectionFactory();
    poolingFactory.setConnectionFactory(jmsConnectionFactoryOnline());
    poolingFactory.setMaxConnections(8);
    poolingFactory.setMaxSessionsPerConnection(20);
    poolingFactory.setConnectionIdleTimeout(0);
    return poolingFactory;
}

知道为什么会有这么多断开连接(它们每 15 分钟重复一次)以及如何调试它?

在客户端级别,我收到以下警告,但 3 秒似乎很长,因为代理已启动并接受其他消息:

23-06-2021 09:33:15 [Thread-24 (ActiveMQ-client-global-threads)] [WARN ] org.apache.activemq.artemis.core.client - AMQ212037: Connection failure to XXXXXX:61616 has been detected: AMQ219014: Timed out after waiting 3,000 ms for response when sending packet 71 [code=CONNECTION_TIMEDOUT]

编辑

我每 3 秒进行一次线程转储。相关信息请查看here。

监控推送到队列的延迟我可以清楚地看到,在 1 个请求/秒的情况下,我有延迟峰值,而在 20 个请求/秒的情况下,推送到队列的延迟似乎是正常的,如下图所示。

Push to Queue latency

同样从 tcpdump 我可以看到客户端和代理之间存在暂停。他们之间似乎没有流量交换。 因此,一旦 callTimeout 时间过去,客户端就会关闭连接。

tcpdump

【问题讨论】:

    标签: spring-jms activemq-artemis


    【解决方案1】:

    无法告诉为什么与您提供的信息有这么多的脱节,但这里有一些调试思路:

    • 从代理获取线程转储,以查看它在断开连接期间是否忙碌。
    • 打开 GC 日志记录以确保长时间的暂停不会导致代理无响应。
    • 为org.apache.activemq.artemis.core.protocol.core.impl.RemotingConnectionImpl 启用 TRACE 日志记录。有关如何配置的详细信息,请参阅 ActiveMQ Artemis documentation。这将让您看到来自客户端的传入PING 数据包或没有。当代理在配置的连接 TTL 内没有收到 ping 时,它将关闭客户端的连接。
    • 监控网络资源是否存在延迟、丢包、断开连接等问题。

    【讨论】:

    • 嗨贾斯汀,感谢您的快速回复。我已经用更多信息编辑了我的问题
    • 最初你问,“有什么想法为什么会有这么多断开连接(它们每 15 分钟重复一次)以及如何调试它?”我在回答中解决了这两个问题。但是,您跟进了我的一些调试想法并在问题中提供了这些信息。 这些信息中的每一个都可以在他们自己的问题中呈现和分析。
    • 感谢我提供了信息,因为缺少信息无助于回答“为什么有这么多断开连接”。如果这更清楚,我可以提出一个新问题。然而,看到所采取的措施可以帮助其他有类似情况的人
    • 我认为您应该创建一个或多个新问题来处理这些新信息,因为现在这个问题与您开始时的问题大不相同。需要明确的是,任何新问题都应该专门与一些调试信息有关。如果你只是扔掉一堆线程转储或 TCP 转储或屏幕截图并问“这是什么意思?”您的问题可能会结束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2020-10-09
    • 2021-10-09
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多