如果我设置 autoAck=true,消息是否会同时发送给消费者?

Are messages sent to the consumer all at once if I set autoAck=true?

有一个包含 10000 条消息的队列。当我启动一个消费者(autoack=true)时,我可以从 rabbitmq_management 中看到消息数量很快变为零。这是否意味着所有 10000 条消息都在消费者端?它存储在哪里(我正在使用 Spring-AMQP)?如果我的consumer配置的并发度是1,处理一条消息需要很长时间,是否会运行 out of memory(如果消息数量很大)?

这取决于你的意思;如果您直接使用basicConsume,它们将全部发送。

Spring 的解释略有不同; ack 模式 NONE 表示 RabbitMQ autoAck(在 basicConsume 中)。 AUTO表示监听器正常退出后容器acks。 MANUAL 表示用户代码负责确认。

和Spring一样,ack模式NONE也取决于容器;使用 SimpleMessageListenerContainer,只会发送 prefetchCount 条消息。为防止出现 OOM 情况,内部队列会阻止其他消息的传递,直到侦听器处理完当前消息。

使用 DirectMessageListenerContainer 它们将全部发送给消费者,就像使用 basicConsume 本机一样。

一般不推荐使用 RabbitMQ autoAck,因为它会导致潜在的消息丢失。