rabbitmq 为什么春装消费者表现很慢?

anauzrmj  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(2)|浏览(141)

我已经同时启动了生产者和消费者。6小时后,生产者生产了大约6亿条消息进入队列,6小时后停止生产者,但消费者继续运行,即使运行18小时后,队列中仍有4亿条消息。有人能告诉我为什么消费者性能非常慢吗?
提前感谢!

@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
             }
    }
jdg4fx2g

jdg4fx2g1#

按照Gary的建议,您可以如下设置它们。

@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;
}
i34xakig

i34xakig2#

根据维基百科,亿== 1000万,所以你的意思是6000万。
容器处理消息的速度只能与侦听器一样快-您需要分析对每条消息执行的操作。
您还需要试验容器并发设置(concurrentConsumers)、prefetch等,以获得最佳性能,但它最终仍然是您的侦听器占用了大部分处理时间;容器的开销非常小。如果侦听器的构造不好,增加并发性也没有什么帮助。
如果使用事务,则会显著降低消耗。
请尝试使用不处理消息的侦听器。
最后,在询问此类问题时,您应该始终显示配置。

相关问题