【发布时间】:2016-09-21 09:14:54
【问题描述】:
我的问题和这个很相似:Why is there a delay in Spring AMQP Message dispatching from a filled Queue?
即使队列已填满消息,我也可以看到消息侦听器的两次调用之间存在延迟。我已经在日志消息中添加了方法开始时的时间、结束时间以及使用该方法的时间(以毫秒为单位):
开始 - 结束 - 时间
2016-09-21T10:08:55.263; - 2016-09-21T10:08:55.278; - 15;
2016-09-21T10:08:55.356; - 2016-09-21T10:08:55.356; - 0;
2016-09-21T10:08:55.388; - 2016-09-21T10:08:55.388; - 0;
2016-09-21T10:08:55.466; - 2016-09-21T10:08:55.466; - 0;
处理消息的时间约为 10 毫秒(平均),但我可以看到延迟大于 50 毫秒(有时大于 100 毫秒)。
如果我将 SimpleMessageListenerContainer 的参数 PrefetchCount 改成 200(例如改为 200),那么性能会大大提高,现在我可以在日志中看到延迟消失了:
开始 - 结束 - 时间
2016-09-21T10:26:27.336; - 2016-09-21T10:26:27.336; - 0;
2016-09-21T10:26:27.336; - 2016-09-21T10:26:27.351; - 15;
2016-09-21T10:26:27.351; - 2016-09-21T10:26:27.351; - 0;
2016-09-21T10:26:27.351; - 2016-09-21T10:26:27.351; - 0;
我的问题是:
- 是什么导致了这种延迟?真的是网络延迟吗?我如何证明这一点?
- 我在有关“prefetchCount”的文档中看到:“这越高,消息传递的速度越快,但非顺序处理的风险就越高。”那真的是什么意思?如果我需要按顺序处理消息,我可以让“prefetchCount”的值大于 1 吗?
我的配置是这样的:
@Bean
public MessageListenerAdapter broadcastMessageListenerAdapter() {
return new MessageListenerAdapter(myHandlerBroadcast(), "onMessage");
}
@Bean(name="myBroadcastMessageListenerContainer")
public SimpleMessageListenerContainer myBroadcastMessageListenerContainer()
{
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(myConnectionFactory());
container.setQueueNames(PX_BROADCAST_QUEUE + environment.getProperty("my.user"));
container.setMessageListener(broadcastMessageListenerAdapter());
container.setAcknowledgeMode(AcknowledgeMode.AUTO);
container.setMessageConverter(myMessageConverter());
container.setConcurrentConsumers(1);
container.setAutoStartup(false);
container.setPrefetchCount(500); // ¿1?
return container;
}
@Bean(name="myHandlerBroadcast")
public MyHandlerBroadcast myHandlerBroadcast(){
return new MyHandlerBroadcast();
}
【问题讨论】:
标签: spring-amqp