gpt4 book ai didi

activemq - 代理网络充斥着未使用的 ActiveMQ.Advisory.TempQueue 消息

转载 作者:行者123 更新时间:2023-12-04 16:01:00 25 4
gpt4 key购买 nike

我目前正在调查代理网络中的内存问题。
根据 JConsole,当代理开始阻塞消息时,ActiveMQ.Advisory.TempQueue 占用了 99% 的配置内存。

关于配置的一些细节

大多数情况下的默认配置。一个开放式 stomp+nio 连接器,一个开放式 openwire 连接器。所有代理形成一个超立方体(与其他所有代理的一个在途连接(更容易自动生成))。没有流量控制。

问题详情

webconsole 在 30 个消费者(6 个代理,一个消费者,其余是使用 java 连接器的客户端)处显示 1974234 条入队消息和 45345 条出队消息。据我所知,出队计数不应小于:入队*消费者。所以在我的情况下,一大堆建议没有被消耗并开始填满我的临时消息空间。 (目前我配置了几个 GB 作为临时空间)

由于没有客户端主动使用临时队列,我觉得这很奇怪。在查看临时队列后,我更加困惑。大多数消息看起来像这样(msg.toString):

ActiveMQMessage {commandId = 0, responseRequired = false, messageId = ID:srv007210-36808-1318839718378-1:1:0:0:203650, originalDestination = null, originalTransactionId = null, producerId = ID:srv007210-36808-1318839718378-1:1:0:0, destination = topic://ActiveMQ.Advisory.TempQueue, transactionId = null, expiration = 0, timestamp = 0, arrival = 0, brokerInTime = 1318840153501, brokerOutTime = 1318840153501, correlationId = null, replyTo = null, persistent = false, type = Advisory, priority = 0, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = org.apache.activemq.util.ByteSequence@45290155, dataStructure = DestinationInfo {commandId = 0, responseRequired = false, connectionId = ID:srv007210-36808-1318839718378-2:2, destination = temp-queue://ID:srv007211-47019-1318835590753-11:9:1, operationType = 1, timeout = 0, brokerPath = null}, redeliveryCounter = 0, size = 0, properties = {originBrokerName=broker.coremq-behaviortracking-675-mq-01-master, originBrokerId=ID:srv007210-36808-1318839718378-0:1, originBrokerURL=stomp://srv007210:61612}, readOnlyProperties = true, readOnlyBody = true, droppable = false}

看到这些消息后,我有几个问题:
  • 我是否正确理解消息的来源是跺脚连接?
  • 如果是,stomp 连接如何创建临时队列?
  • 不使用建议是否有一个简单的原因?

  • 目前,我通过停用网络连接器上的 bridgeTempDestinations 属性来推迟问题。这样消息就不会传播,并且它们填充临时空间的速度要慢得多。如果我无法修复这些消息的来源,我至少希望阻止它们填充商店:
  • 我可以在一定时间后丢弃这些未使用的消息吗?
  • 这会产生什么后果?

  • 更新:我对集群进行了更多监控,发现消息已被消耗。它们已入队并被分派(dispatch),但消费者(其他集群节点与使用 activemq 库的 java 消费者一样)无法确认消息。所以他们留在调度的消息队列中,这个队列不断增长。

    最佳答案

    这是一个旧线程,但如果有人遇到同样的问题,您可能想查看这篇文章:http://forum.spring.io/forum/spring-projects/integration/111989-jms-outbound-gateway-temporary-queues-never-deleted

    该链接中的问题听起来很相似,即临时队列产生大量咨询消息。在我的例子中,我们使用临时队列来实现同步请求/响应消息传递,但是大量的咨询消息导致 ActiveMQ 将大部分时间花在 GC 上,并最终引发 GC Overhead Limit Exceeded 异常。这是在 v5.11.1 上。即使我们关闭了连接、 session 、生产者、消费者,临时队列也不会被 GC 处理,并且会继续接收咨询消息。

    解决方案是在清理其他资源时显式删除临时队列(参见 https://docs.oracle.com/javaee/7/api/javax/jms/TemporaryQueue.html)

    关于activemq - 代理网络充斥着未使用的 ActiveMQ.Advisory.TempQueue 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7805161/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com