我们目前正在使用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是一个单例,可能是一个瓶颈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消息之前等待时间很长。
MQ连接池无法正常工作
您的空闲超时值为60 ms。默认值为30000毫秒(30秒)。这是连接可以在池中保持空闲状态的最长时间(以毫秒为单位)。因此,使用您的空闲超时属性,可以在60毫秒空闲时间后删除连接,并在需要时创建连接。创建连接非常耗时。
尝试一下:
ibm.mq.pool.idleTimeout=60000