在systemUsage和destinationPolicy配置周围寻找一些帮助,因为我很难完全理解systemUsage,destinationPolicy和流量控制之间的关系。
我们所有的消息都是持久的! producerFlowControl已启用。
所以我们给ActiveMQ说最多512MB的堆空间。
我们的systemUsage设置如下:
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="200 mb"/>
</memoryUsage>
<storeUsage>
<storeUsage limit="10 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="1000 mb"/>
</tempUsage>
</systemUsage>
</systemUsage>
我们的目标政策如下:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" producerFlowControl="true" memoryLimit="1mb">
<pendingSubscriberPolicy>
</pendingSubscriberPolicy>
</policyEntry>
<policyEntry queue=">" producerFlowControl="true" memoryLimit="1mb">
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
任何人都可以验证以下内容是否正确:
这意味着对于每个单独的队列/主题,内存限制为1MB。当这个1MB命中时,究竟会发生什么,生产者的队列阻止还是翻页?
所有队列和主题的总允许内存为200MB。这意味着我们可以拥有200个以1MB的全容量运行的通道。我们目前总共有16个队列和主题,所以显然从未达到过。
我们是否更好地删除内存限制上的单个策略条目并在各个通道之间共享内存?
如果我们这样做会阻止他们?
非常感谢任何帮助!可以付钱给你一些啤酒钱!
答案 0 :(得分:6)
你在这里谈到了很多要点,我将不按顺序回答。
memoryUsage对应于分配给内存存储的内存量。 storeUsage对应于应该为KahaDB商店提供多少空间。您可以使用其中一个,具体取决于您希望代理如何保留消息。 tempUsage是文件游标的一种特殊情况(http://activemq.apache.org/message-cursors.html) - 一种在超出内存限制时将内存从内存存储区溢出到磁盘的机制(你必须如果需要,请在目标级别配置此行为。
policyEntry @ memoryLimit是各个目标的子限制。
超出内存限制时会发生什么情况取决于生产者流量控制(PFC)是否已打开。它默认为队列,关闭主题和异步发送到队列;所有这些都可以在policyEntry中配置(http://activemq.apache.org/per-destination-policies.html)。
如果在PFC打开时达到“内存限制”,则客户端将阻止,直到有人通过使用来自商店的消息释放空间。如果它关闭,send将抛出异常(更好的是客户端比代理更好)。 “内存限制”表示由所有队列中的memoryUsage定义的那个,或者特定于队列的限制(可以在后者之前命中前者)。
是否需要特定于目标的限制取决于您的使用案例。我建议忽略它,除非你试图达到一个特定的结果。