我需要知道在rabbitmq中预取计数与无确认之间的区别是什么?还有以下语句之间的区别是什么:-如果我设置预取计数,比如说10,是否会创建10个消费者线程?或者--如果我注册了10个消费者,是否会创建10个线程?以上哪一项更有效
mum43rcc1#
要回答这个问题,请专门针对spring-amqp。prefetchCount=10表示代理允许每个消费者最多10个未确认消息;它不会影响线程的数量。使用concurrentConsumers创建多个消费者-每个消费者将有一个线程。自动确认意味着代理不需要确认(因此可能会丢失消息)。如果监听器跟不上,SpringAMQP也会阻止传递(以达到预取计数)。
prefetchCount=10
concurrentConsumers
hsgswve42#
预取计数:使用者应从队列中读取并在内部保留多少条消息,而不是一次选取一条消息。No-Ack:不确认使用者已使用完消息。这两个都是用来微调您的设置回答你问题的第二部分:如果将预取计数设置为10,则不会创建10个使用方,但单个使用方一次将提取10封邮件。如果你创建10个消费者,它很可能会创建10个线程(或进程),这完全取决于你如何配置它。
osh3o9ms3#
我知道这个问题已经很久了,但有一部分问题从来没有得到过明确的回答,所以对于后来来这里寻找答案的人:如果您不希望在确认之前的消息后立即向您发送新消息,而是希望仅在您明确请求消息时才向您发送消息,那么您根本就不需要设置“消费者”(RabbitMQ术语);具体来说,您将希望使用AMQP的basic.get操作(它只获取单个消息,而不创建消费者),而不是更常见的basic.consume操作(它注册一个消费者,当消息可用时将向该消费者发送消息)。不同的库和框架将有不同的方法来实现这一点;例如,在Ruby中,使用Bunny客户机,可以调用message = queue.get而不是queue.subscribe do ...,在Spring中,可以执行类似GetResponse response = channel.basicGet("some.queue", false);的操作。
basic.get
basic.consume
message = queue.get
queue.subscribe do ...
GetResponse response = channel.basicGet("some.queue", false);
3条答案
按热度按时间mum43rcc1#
要回答这个问题,请专门针对spring-amqp。
prefetchCount=10
表示代理允许每个消费者最多10个未确认消息;它不会影响线程的数量。使用
concurrentConsumers
创建多个消费者-每个消费者将有一个线程。自动确认意味着代理不需要确认(因此可能会丢失消息)。如果监听器跟不上,SpringAMQP也会阻止传递(以达到预取计数)。
hsgswve42#
预取计数:使用者应从队列中读取并在内部保留多少条消息,而不是一次选取一条消息。
No-Ack:不确认使用者已使用完消息。
这两个都是用来微调您的设置
回答你问题的第二部分:如果将预取计数设置为10,则不会创建10个使用方,但单个使用方一次将提取10封邮件。
如果你创建10个消费者,它很可能会创建10个线程(或进程),这完全取决于你如何配置它。
osh3o9ms3#
我知道这个问题已经很久了,但有一部分问题从来没有得到过明确的回答,所以对于后来来这里寻找答案的人:
如果您不希望在确认之前的消息后立即向您发送新消息,而是希望仅在您明确请求消息时才向您发送消息,那么您根本就不需要设置“消费者”(RabbitMQ术语);具体来说,您将希望使用AMQP的
basic.get
操作(它只获取单个消息,而不创建消费者),而不是更常见的basic.consume
操作(它注册一个消费者,当消息可用时将向该消费者发送消息)。不同的库和框架将有不同的方法来实现这一点;例如,在Ruby中,使用Bunny客户机,可以调用
message = queue.get
而不是queue.subscribe do ...
,在Spring中,可以执行类似GetResponse response = channel.basicGet("some.queue", false);
的操作。