【问题标题】:MQ Listener PerformanceMQ 侦听器性能
【发布时间】:2017-06-16 11:08:11
【问题描述】:

我正在构建 Docker 容器,它在 Jetty 上运行了一个 war 文件,我一直在交替设置一些设置以查看性能是否有所提高,但到目前为止还没有。每个容器已经达到 7 tps。

设置是

<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="MQConnectionFactory" />
    <property name="sessionCacheSize" value="10"/>
</bean>


<bean id="requestQueue" class="com.ibm.mq.jms.MQQueue">
    <constructor-arg index="0" value="${queuemanager}"/>
    <constructor-arg index="1" value="${incoming.queue}"/>
</bean>


<integration:poller id="poller" default="true" fixed-delay="1000" error-channel="errorChannel"/>

如何提高这里处理的线程数?

另外,我的连接工厂详情如下图

@Bean(name="DefaultJmsListenerContainerFactory")
public DefaultJmsListenerContainerFactory provideJmsListenerContainerFactory(PlatformTransactionManager transactionManager) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());     
    factory.setTransactionManager(transactionManager);
    factory.setConcurrency(jmsConcurrency);
    factory.setCacheLevel(jmsCacheLevel);
    factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    factory.setSessionTransacted(true); 

    return factory;
}


 @Bean(name = "txManager")
 public PlatformTransactionManager provideTransactionManager() {         
     return new JmsTransactionManager(connectionFactory());
 }

@Bean(name = "JmsTemplate")
public JmsTemplate provideJmsTemplate() {
    JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory());        
    jmsTemplate.setReceiveTimeout(Long.parseLong(env.getRequiredProperty(RECEIVE_TIMEOUT)));
    return jmsTemplate;
}

@Bean(name="MQConnectionFactory")
public ConnectionFactory connectionFactory() {

    if (factory == null) {
        factory = new MQXAConnectionFactory();
        try {
            factory.setHostName(env.getRequiredProperty(HOST));
            factory.setPort(Integer.parseInt(env.getRequiredProperty(PORT)));            
            factory.setQueueManager(env.getRequiredProperty(QUEUE_MANAGER));
            factory.setChannel(env.getRequiredProperty(CHANNEL));
            factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);  

        } catch (JMSException e) {
            throw new RuntimeException(e);
        }
    }
    return factory;
}

并发的初始设置是“1-2”,我将其更改为“10-15”。不影响性能。

jmsCache 设置为 3 (Consumer cache),但也没有任何变化。

非常感谢任何帮助。

干杯 克里斯

【问题讨论】:

  • 您能告诉我们一些关于您系统的其他信息吗?你有多少个推杆?发送消息的速率是多少?你有多少并发的吸气剂?是否有并发消息供他们处理,或者一个吸气剂能否跟上推杆?每项事务还需要做什么才能全面了解您的系统性能?
  • 此时推杆由 NFT 团队使用 LoadRunner 以 100 tps 进行模拟。我有 2 个容器实例正在运行,这意味着我们达到了 15 tps。我认为通过在 DefaultJmsListenerContainerFactory 中将并发设置为“10-15”,这实际上将允许这么多线程并行处理。应用程序的另一部分将 json 消息从 1 格式转换为另一种格式,并向 Api 发送 HTTP 请求,该 API 在 DB 中执行插入操作。
  • 这也是我对 setConcurrency 的理解。你看到有多少个 getter 在你的队列中运行?试试 MQSC 命令DISPLAY QSTATUS(q-name) IPPROCS
  • 我会尽快提供一些更新。看起来问题实际上出在数据库连接池上。数据库中有数千个会话,我们预计会有几个。

标签: spring-integration ibm-mq


【解决方案1】:

在这里回答我自己的帖子。我们发现问题实际上是我们的数据库池设置不正确。

但为了增加监听器数量,我不得不更改我的 Spring 集成适配器设置

<jms:message-driven-channel-adapter id="jmsIn"
        destination="requestQueue"
        channel="inputJsonConversionChannel" 
        connection-factory="cachingConnectionFactory" 
        error-channel="errorChannel"
        concurrent-consumers="${jms_adapter_concurrent_consumers}" />

只有当concurrent-consumers不同时,队列中的监听器才会增加。

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 2010-12-04
    • 2012-07-11
    • 2011-01-20
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多