如果我设置 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
,因为它会导致潜在的消息丢失。
有一个包含 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
,因为它会导致潜在的消息丢失。