我在我的产品中使用 apache servicemix 和 apache activeMQ。在 HttpConnector 的情况下,我发现了一个性能问题。
如果我一次增加总请求的数量,那么随着数量的增加,交换队列会卡在任何组件上。在所有请求开始处理之后,大部分交换都卡在了端组件或 dispatcher* 组件上。容器的堆大小达到非常高,一段时间后它会崩溃并自动重新启动。
我也使用过事务管理器。flowname 也被称为 jms。
迫切需要一些解决方案。
我在我的产品中使用 apache servicemix 和 apache activeMQ。在 HttpConnector 的情况下,我发现了一个性能问题。
如果我一次增加总请求的数量,那么随着数量的增加,交换队列会卡在任何组件上。在所有请求开始处理之后,大部分交换都卡在了端组件或 dispatcher* 组件上。容器的堆大小达到非常高,一段时间后它会崩溃并自动重新启动。
我也使用过事务管理器。flowname 也被称为 jms。
迫切需要一些解决方案。
如果我一次增加总请求的数量,那么随着数量的增加,交换队列会卡在任何组件上。
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。更多信息生产者流控制和消息游标
容器的堆大小达到非常高,一段时间后它会崩溃并自动重新启动。
但无论如何,这只是调整你的应用程序的方式,它不是解决方案,因为当一些资源用完时你总会遇到这种情况:)
您应该使用Pound限制传入请求或平衡它们
您可以尝试使用KahaDB而不是“amqPersistenceAdapter”。仅仅通过切换到这个,我们就看到了巨大的吞吐量增加。
这是我们使用的配置(高度依赖于您的应用程序,但请确保“enableJournalDiskSyncs”设置为 false)
<persistenceAdapter>
<kahaDB directory="../data/kaha"
enableJournalDiskSyncs="false"
indexWriteBatchSize="10000"
indexCacheSize="1000" />
</persistenceAdapter>