高并发中的JmsTemplate调用延迟

问题描述 投票:1回答:1

我们目前正在使用200 TPS进行负载测试,以使用Spring Boot 2.1.1和带有IBM MQ Spring Boot Starter v2.1.1的Spring JMS的应用程序模拟高并发性。另外,我们将MQ连接池配置为最大连接大小为500,空闲超时为60秒。

ibm.mq.pool.enabled=true
ibm.mq.pool.idleTimeout=60
ibm.mq.pool.maxConnections=500

问题是,当负载测试达到100TPS时,在将消息发送到MQ之前等待很长的时间(超过1分钟),并且没有任何瓶颈。仅有的可疑点是:

  1. 调用包装JmsTemplate的MQ客户端组件(弹簧组件)
  2. 调用JmsTemplate发送消息

从我们的动态追踪中,它无法解释哪一个速度慢;但是,实际发送时间确实很快。因此,我们怀疑以下任何一项都可能有问题:

1)JmsTemplate是一个单例,可能是一个瓶颈2)出于与单例相同的原因,MQClient.class可能是瓶子3)MQ连接池无法正常工作

我们已经尝试在性能测试过程中通过Dynatrace进行日志记录和跟踪等许多方法来指出。但是我们还没有找到根本原因,为什么花这么长时间才向MQ发送消息

@Component
@AllArgsConstructor
@Slf4j
public class MQClient {
    private final JmsTemplate jmsTemplate;
    private final QueueResolver queueResolver;
    public String requestSomething(
        final String someId,
        final String messageText) throws JMSException {
    final AtomicReference<Message> message = new AtomicReference<Message>();
    jmsTemplate.send(
            queueResolver.getRequestQueueName(someId),
            new MessageCreator() {
                @Override
                public Message createMessage(Session session) throws JMSException {
                    final BytesMessage msg = session.createBytesMessage();
                    msg.writeBytes(messageText.getBytes(Charset.forName("UTF-8")));
                    msg.setJMSReplyTo(session.createQueue(
                            queueResolver.getReplyQueueName(someId)));
                    message.set(msg);
                    return message.get();
                }
            });
    return message.get().getJMSMessageID();
    }
}

没有错误,因为发送MQ消息之前等待时间很长。

spring jms jmstemplate
1个回答
0
投票

MQ连接池无法正常工作

您的空闲超时值为60 ms。默认值为30000毫秒(30秒)。这是连接可以在池中保持空闲状态的最长时间(以毫秒为单位)。因此,使用您的空闲超时属性,可以在60毫秒空闲时间后删除连接,并在需要时创建连接。创建连接非常耗时。

尝试一下:

ibm.mq.pool.idleTimeout=60000
© www.soinside.com 2019 - 2024. All rights reserved.