首页 > 解决方案 > # 通过 MQTT 订阅会导致连接丢失时出现巨大的队列

问题描述

我在两个具有 4 个内核和 16 GB RAM 的 Ubuntu 18.04 VM 上使用 Artemis 2.14 和 Java 14.0.2。我的生产者每秒向大约 5,500 个不同的主题发送大约 2,000 条消息。

当我使用基于证书的授权通过MQTT.FX客户端连接并订阅#MQTT.FX 客户端时,一段时间后我会在 Web 控制台中看到一个队列,该队列#带有我的客户端 ID,Artemis 不会清除该队列。这个队列似乎一直在增长,直到 RAM 被 100% 使用。一段时间后,我的 Artemis Broker 会自行重启。

Artemis的这种行为正常吗?我如何告诉 Artemis 在一段时间后清理“僵尸”队列?

我已经尝试以不同的方式使用此配置参数,但没有任何效果:

confirmationWindowSize=0 
clientFailureCheckPeriod=30000
consumerWindowSize=0

标签: activemq-artemis

解决方案


在以下情况下,默认情况下会自动删除自动创建的队列:

  • 消费者计数为 0
  • 消息计数为 0

这样做是为了不会无意中删除任何消息。

但是,您可以将相应auto-delete-queues-message-count address-setting的 inbroker.xml更改-1为跳过消息计数检查。此外,如果需要,可以调整auto-delete-queues-delay以配置延迟。

值得注意的是,如果您创建类似的订阅#(这是相当危险的),您需要准备好在消息产生后尽快使用它们,以避免消息在队列中累积。如果积累是不可避免的,那么你应该根据你的需要配置max-size-bytesaddress-full-policy,这样经纪人就不会不知所措。有关详细信息,请参阅文档。


推荐阅读