2013-09-11 29 views
1

我已经开始同时生产者和消费者。 6小时后,制作人制作了大约6亿分钟的信息,并在6小时后停止了制作人,但消费者仍在持续运行,即使在运行18小时后仍然有4千万信息在排队。请问任何人,请让我知道为什么消费者表现非常缓慢?为什么spring-amqp的消费者表现很慢?

在此先感谢!

@Bean 
    public SimpleMessageListenerContainer listenerContainer() { 
     SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
     container.setConnectionFactory(connectionFactory()); 
     container.setQueueNames(this.queueName); 
     container.setMessageListener(new MessageListenerAdapter(new TestMessageHandler(), new JsonMessageConverter())); 
     return container; 
    } 
@Bean 
    public ConnectionFactory connectionFactory() { 
     CachingConnectionFactory connectionFactory = new CachingConnectionFactory(
       "localhost"); 
     connectionFactory.setUsername("guest"); 
     connectionFactory.setPassword("guest"); 
     return connectionFactory; 
    } 

    @Bean 
    public RabbitTemplate rabbitTemplate() { 
     RabbitTemplate template = new RabbitTemplate(connectionFactory()); 
     template.setMessageConverter(new JsonMessageConverter()); 
     template.setRoutingKey(this.queueName); 
     template.setQueue(this.queueName); 
     return template; 
    } 

    public class TestMessageHandler { 
      // receive messages 
     public void handleMessage(MessageBeanTest msgBean) { 
        // Storing bean data into CSV file 
      } 
    } 

回答

2

根据维基百科,crore == 10,000,000,所以你的意思是6000万。

容器只能像听众那样处理邮件 - 您需要分析每条邮件正在做什么。

您还需要尝试容器并发设置(concurrentConsumers),预取等以获得最佳性能,但它仍然最终成为您的侦听器,它将占用大部分处理时间;该容器的顶部已经非常枯燥。如果您的监听器构造不好,增加并发将无济于事。

如果您使用的是交易,那将显着减慢消耗。

尝试使用与消息无关的侦听器。

最后,在问这样的问题时,您应该始终显示配置。

+0

谢谢罗素的回复。消费者花费32个小时消费1亿条消息。在消费者,我没有做任何仅仅消费生产消息的事务,而是将这个配置添加到这个帖子中。谢谢 – Pand005

+0

你的信息有多大?我在<30秒内发布了100,000条短消息,并且都在100秒内消耗完毕 - 这包括在消费者端记录每条消息!而且,它在一台小型笔记本电脑上。你有没有基准你的TestMessageHandler?图片中没有RabbitMQ,每秒可以处理多少条消息? –

+0

每个消息的大小是46个字节。当我处理100,000条消息时,我确实同意,如上所述,它花费的时间更少。在这里,RabbitMQ服务器运行在局域网内部大小为30GB的一台服务器上,运行内存为3.4GB的桌面上的生产者和消费者的Java客户端。消费者将接收到的消息插入CSV文件而不是其他操作的逻辑。我不明白,“你测试了你的TestMessageHandler吗?”可以告诉我吗? – Pand005

1

根据加里的建议,你可以按如下方式设置它们。退房@RabbitListener

@Bean 
public SimpleRabbitListenerContainerFactory listenerContainer( { 
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
    factory.setConnectionFactory(baseConfig.connectionFactory()); 
    factory.setConcurrentConsumers(7); // choose a value 
    factory.setPrefetchCount(1); // how many messages per consumer at a time 
    factory.setMaxConcurrentConsumers(10); // choose a value 
    factory.setDefaultRequeueRejected(false); // if you want to deadletter 
    return factory; 
}