即使在读了很多这样的问题之后(
1
,
2
和文章,目前尚不清楚哪个是更好的选择为消费者设置。多个使用者还是更高的预取值?
据我所知
SimpleRabbitListenerContainerFactory
,
因为它最初的设计是每个连接只有一个线程
它的设计是为了解决一个限制,即AMQP客户端每个连接只有一个线程,这是否意味着设置多个消费者不会有太大的区别,因为只有一个线程实际上是从兔子消费的,而不是把它交给多个消费者(线程)?
还是实际上有几个消费者同时消费?
那么,关于兔子的预取/消费者的春天实施,最好的做法是什么?什么时候用一个代替另一个?我应该换成这个新的
DirectRabbitListenerContainerFactory
?是“更好”还是仅仅取决于用例?
在高预取时,我看到的一些缺点是,如果一个应用程序消耗了更多的消息,那么它可能会导致内存问题。(尚未实际测试,待定)
当涉及到多个消费者时,我看到了在操作系统级别打开更多文件描述符的缺点,我看到了
this
文章说,每个消费者实际上为每个ACK兔子,这使它慢。
FY,如果它是相关的,我通常会这样配置:
@Bean
public ConnectionFactory connectionFactory() {
final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(server);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualHost);
connectionFactory.setRequestedHeartBeat(requestedHeartBeat);
return connectionFactory;
}
@Bean
public AmqpAdmin amqpAdmin() {
AmqpAdmin admin = new RabbitAdmin(connectionFactory());
admin.declareQueue(getRabbitQueue());
return admin;
}
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
final SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrentConsumers(concurrency);
factory.setMaxConcurrentConsumers(maxConcurrency);
factory.setPrefetchCount(prefetch);
factory.setMissingQueuesFatal(false);
return factory;
}
@Bean
public Queue getRabbitQueue() {
final Map<String, Object> p = new HashMap<String, Object>();
p.put("x-max-priority", 10);
return new Queue(queueName, true, false, false, p);
}