rabbitmq 中的 prefetch count 和 no ack 有什么区别

What is the difference between prefetch count vs no ack in rabbitmq

我需要知道 rabbitmq 中预取计数与无确认之间的区别是什么?

还有 以下语句之间有什么区别:-

如果我设置预取计数为 10,是否会创建 10 个消费者线程? 或者--

如果我注册 10 个消费者,它会创建 10 个线程吗?

以上哪个效率更高

预取计数:消费者应该从队列中读取多少条消息并保留在内部,而不是一次选择一条消息。

No-Ack:不确认消费者已完成消费消息。

它们都用于微调您的设置

解决问题的第二部分: 如果将预取计数设置为 10,则不会创建 10 个消费者,但您的单个消费者将一次获取 10 条消息。

如果您创建 10 个消费者,它很可能会创建 10 个线程(或进程)。这完全取决于您如何配置它。尽管

您很可能会想要使用线程池

专门为 spring-amqp 回答这个问题。

prefetchCount=10 表示代理允许每个消费者最多 10 条未确认的消息;它不影响线程数。

使用 concurrentConsumers 创建多个消费者 - 每个消费者有一个线程。

auto ack 表示代理不需要 ack(因此您可能会丢失消息)。 Spring 如果侦听器跟不上,AMQP 也会阻止传送(预取计数)。

我知道这个问题很老了,但其中的一部分从未得到具体回答,所以对于后来来这里寻找答案的人:

如果您不想在确认之前的消息后立即向您发送新消息,而是希望仅在您明确请求时才向您发送消息,那么您不想设置建立一个“消费者”(在 RabbitMQ 术语中);具体来说,您需要使用 AMQP 的 basic.get operation (which just fetches a single message without creating a consumer) rather the more common basic.consume 操作(它注册了一个消费者,当消息可用时,该消费者将被发送)。

不同的库和框架会有不同的实现方式;例如,在 Ruby 中,使用 Bunny 客户端,您可以调用 message = queue.get 而不是 queue.subscribe do ...。在 Spring 中,你会做类似 GetResponse response = channel.basicGet("some.queue", false);.

的事情