RabbitMq:使用 auto-ack=false 禁用预取 (prefetch_count=0)
RabbitMq: Disabling prefetching (prefetch_count=0) with auto-ack=false
是否可以通过 auto-ack=false 禁用预取?我只是想避免每次确认消息时都从队列中读取消息(预取)。我只想在调用 'consume_message' 时阅读消息。设置 prefetch_count=0 似乎不起作用,它被视为 'no specif limit'.
更新:
据我了解,'prefetch_count' 是客户端缓存的消息数(本地读入缓冲区)。例如有一个用例:
(假设我们连接到一个队列并且它有消息)
- 创建连接。
- 设置Basic.Qos (prefetch_count=1)
- 开始消费Basic.Consume
- 由于 prefetch_count=1 一条消息已经 传输到客户端 并准备好被读取并标记为 not-ack' d.
- 正在读取消息然后处理它。
- 然后消息被确认。一切都从 步骤 4.
开始
我认为将 prefetch_count 设置为 0 可以避免第 4 步,并且只有在您阅读消息时才会传输消息 - 客户端没有缓存。
预取和自动确认没有这样的关系。预取计数只是一些 未确认 准备发送给特定消费者的消息。
假设您将预取计数设置为 N。如果您将自动确认设置为真,这意味着这 N 条消息在接收时被确认。如果将其设置为 false,这意味着您仍然会收到 N 条消息,但在您手动确认之前它们不会被确认。
对于最后一部分 - 尝试将 prefetch_count 设置为 1。
同时检查这个 和两个答案。
是否可以通过 auto-ack=false 禁用预取?我只是想避免每次确认消息时都从队列中读取消息(预取)。我只想在调用 'consume_message' 时阅读消息。设置 prefetch_count=0 似乎不起作用,它被视为 'no specif limit'.
更新:
据我了解,'prefetch_count' 是客户端缓存的消息数(本地读入缓冲区)。例如有一个用例:
(假设我们连接到一个队列并且它有消息)
- 创建连接。
- 设置Basic.Qos (prefetch_count=1)
- 开始消费Basic.Consume
- 由于 prefetch_count=1 一条消息已经 传输到客户端 并准备好被读取并标记为 not-ack' d.
- 正在读取消息然后处理它。
- 然后消息被确认。一切都从 步骤 4. 开始
我认为将 prefetch_count 设置为 0 可以避免第 4 步,并且只有在您阅读消息时才会传输消息 - 客户端没有缓存。
预取和自动确认没有这样的关系。预取计数只是一些 未确认 准备发送给特定消费者的消息。
假设您将预取计数设置为 N。如果您将自动确认设置为真,这意味着这 N 条消息在接收时被确认。如果将其设置为 false,这意味着您仍然会收到 N 条消息,但在您手动确认之前它们不会被确认。
对于最后一部分 - 尝试将 prefetch_count 设置为 1。
同时检查这个