我在我的产品中使用apache servicemix和apache activeMQ。在HttpConnector的情况下,我发现了一个性能问题。
如果我一次增加总请求数,那么随着数量增加,交换队列会卡在任何组件上。在所有请求开始处理之后,大多数交换都停留在最终组件或调度程序*组件上。容器的堆大小达到很高,一段时间后它会自动崩溃并重新启动。
我也使用了transactionmanager。 flowname也被称为jms。
迫切需要一些解决方案。
答案 0 :(得分:0)
如果我一次增加总请求数,那么随着数量增加,交换队列会卡在任何组件上。
ActiveMQ有一种机制来阻止生产者写入消息,它被称为“流控制”,似乎你的生产者比消费者更快(或消费者的速度不稳定),所以首先检查你的AMQ的memoryLimit配置(也可以定义它或特殊队列)。尽量增加它。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic="FOO.>" producerFlowControl="false" memoryLimit="1mb">
<dispatchPolicy>
<strictOrderDispatchPolicy/>
</dispatchPolicy>
<subscriptionRecoveryPolicy>
<lastImageSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
</policyEntry>
</policyEntries>
</policyMap>
此外,您可以使用producerFlowControl="false"
选项禁用停止处理传入消息。因此,如果将使用所有缓冲区,AMQ将减速并且所有消息将存储到HD。更多信息Producer Flow Control和Message Cursors
Container的堆大小达到很高,一段时间后它会自动崩溃并重新启动。
但无论如何,它只是调整你的应用程序的方式,它不是解决方案,因为总是你会遇到一些资源耗尽的情况:)
您应该限制传入的请求或平衡它们f.e.使用Pound
答案 1 :(得分:0)
您可以尝试使用KahaDB代替“amqPersistenceAdapter”。通过切换到这一点,我们看到了巨大的吞吐量增长。
这是我们使用的配置(高度依赖于您的应用程序,但请确保“enableJournalDiskSyncs”设置为false)
<persistenceAdapter>
<kahaDB directory="../data/kaha"
enableJournalDiskSyncs="false"
indexWriteBatchSize="10000"
indexCacheSize="1000" />
</persistenceAdapter>