Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory ActiveMQ-已达到主题(镜像队列)的内存限制_Memory_Persistence_Activemq_Jms Topic_Flooding - Fatal编程技术网

Memory ActiveMQ-已达到主题(镜像队列)的内存限制

Memory ActiveMQ-已达到主题(镜像队列)的内存限制,memory,persistence,activemq,jms-topic,flooding,Memory,Persistence,Activemq,Jms Topic,Flooding,我们正在使用具有以下配置的ActiveMQ 5.6: -上的流量控制 -主题1MB的内存限制 -已启用镜像队列(未定义显式虚拟主题) 有持久消息被发送到队列QueueA。显然,此消息被复制到Mirror.QueueA,这是一个非持久性的自动创建主题 在这个话题上,没有消费者。如果偶尔有消费者,则他们是非持久订户 一段时间后,生产者阻塞,我们得到以下错误: Usage Manager memory limit reached for topic://Mirror.QueueA 根据include

我们正在使用具有以下配置的ActiveMQ 5.6: -上的流量控制 -主题1MB的内存限制 -已启用镜像队列(未定义显式虚拟主题)

有持久消息被发送到队列
QueueA
。显然,此消息被复制到
Mirror.QueueA
,这是一个非持久性的自动创建主题

在这个话题上,没有消费者。如果偶尔有消费者,则他们是非持久订户

一段时间后,生产者阻塞,我们得到以下错误:

Usage Manager memory limit reached for topic://Mirror.QueueA
根据include,主题中没有持久订阅者的消息将被删除,这是我想要的,也是我所期望的。但情况显然并非如此

但公认的解决方案建议使用流控制,但禁用磁盘假脱机:

这将不会使用磁盘,并在命中MemoryLit时阻止生产者

但我不想阻止生产商,因为他们会无限期地阻止,因为没有消费者到来。为什么要持久化这些消息

我看到的选择很少: -这是一个bug,可能在以后的AMQ版本中已修复 -这是一个配置问题(我不知道如何解决) -有一些选项可以在达到内存限制时简单地删除最旧的消息(我找不到任何这样的选项)

我希望有人能帮忙

谢谢

//J

[更新]

虽然我们已经在现场部署了5.6版本,但我目前正在使用相同的配置在5.8安装的AMQ上运行相同的耐久性/负载测试。现在,我已经在5.6系统上传输了10倍的消息,没有任何问题。我会让这个测试运行一个晚上甚至几天,看看是否有其他限制。

好的

正如之前的更新中所述,我在ActiveMQ的5.8安装上运行了相同的laod测试,配置与导致存储超出的配置相同

这是在大约将450个事务发送到主题内存限制为1MB的3个队列之后发生的。您甚至可以看到KahaDB数据库文件的大小在增长

使用AMQ5.8,我在4天后停止了负载测试,导致发送了大约280.000个事务。没有存储问题,没有卡死生产者,KahaDB文件始终保持大致相同的大小

因此,尽管我不能肯定这是ActiveMQ 5.6中的一个bug,但5.8的行为显然不同,正如预期和记录的那样。当没有注册订户时,它不会将消息持久地存储在镜像队列中

对于AMQ5.6的现有安装,我们使用了一些技巧来避免更改应用程序代码

  • 由于应用程序使用的是前缀为“Mirror.”(默认前缀)的主题和一些通配符,因此我们只需在启动时使用
    XML标记在配置中定义一个主题。在使用通配符的地方,我们只使用了硬编码名称,如
    all device
    。不幸的是,下一步需要这样做:
  • 我们在配置的
    部分中定义了一个
    ,它将所有消息(
    )的副本从实际(镜像)队列路由到一个主题。此主题需要提前定义或手动创建,因为简单地定义
    compositeQueue
    也不会创建主题。另外,您不能使用
  • 然后,我们从配置中删除了镜像队列功能
总而言之,它看起来有点像这样:

    <destinations>
        <topic name="Mirror.QueueA.all-devices" physicalName="Mirror.all-devices" />
    </destinations>

    <destinationInterceptors>
      <virtualDestinationInterceptor>
        <virtualDestinations>
          <compositeQueue name="QueueA.*" forwardOnly="false">
            <forwardTo>
              <topic physicalName="Mirror.QueueA.all-devices" />
            </forwardTo>
          </compositeQueue>
        </virtualDestinations>
      </virtualDestinationInterceptor>
    </destinationInterceptors>

希望这有帮助。这种“黑客”可能不可能在每种情况下都出现,但因为我们从未在个别镜像主题上花费精力,所以这是可能的