RabbitMQ接收速度慢

时间:2017-11-02 12:56:59

标签: java rabbitmq message-queue spring-amqp messagebroker

我需要创建应该从数据生成器接收数据并处理它的应用程序。我选择RabbitMQ作为消息代理。我的测试表明我不是最好的结果:

已发送 - 100 msg;
产量 - 100 msg / s;
消耗 - 6 msg / s;

为了解决这个问题,我设置listenerContainer.setAcknowledgeMode(AcknowledgeMode.NONE); 但我需要承认一些队列。我不能使用worker并行执行,因为消息的顺序对于数据处理很重要。

是否可以通过确认来提高接收速度?

制片:

@Bean
Queue queue() {
    return new Queue(queueName, false);
}

@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory("ip");
    connectionFactory.setUsername("name");
    connectionFactory.setPassword("pswd");
    return connectionFactory;
}

@Bean
public AmqpAdmin amqpAdmin() {
    return new RabbitAdmin(connectionFactory());
}

@Bean
public RabbitTemplate rabbitTemplate() {
    return new RabbitTemplate(connectionFactory());
}

@Bean
public FanoutExchange exchange() {
    return new FanoutExchange("exchange-1");
}

@Bean
public Binding binding(){
    return BindingBuilder.bind(queue()).to(exchange());
}

...

rabbitTemplate.setExchange("exchange-1");
rabbitTemplate.convertAndSend(data);

消费者:

@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory("ip");
    connectionFactory.setUsername("name");
    connectionFactory.setPassword("pswd");
    return connectionFactory;
}

@Bean
public RabbitTemplate rabbitTemplate() {
    return new RabbitTemplate(connectionFactory());
}

@Bean
Queue queue() {
    return new Queue("queue-1", false);
}

@Bean
public SimpleMessageListenerContainer listenerContainer() {
    SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
    listenerContainer.setConnectionFactory(connectionFactory());
    listenerContainer.setQueues(queue());
    listenerContainer.setMessageListener(new Receiver());
    listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
    return listenerContainer;
}

...

@Override
public void onMessage(Message message) {
    System.out.println("Received message: " + fromBytes(message.getBody()) + " \n Time = " + System.currentTimeMillis());
}

在具有2个vCPU和4 Gb内存的实例上进行测试。

1 个答案:

答案 0 :(得分:1)

您可以增加容器prefetchCount,这将大大提高性能。但是,如果拒绝并重新排队消息,则排序将丢失(重新排队的消息将在预取消息的后面)。