当前位置: 首页 > 知识库问答 >
问题:

AMQP:确认和预取

荀靖
2023-03-14

我试图了解AMQP协议的一些方面。目前我有RabbitMQ项目并使用python pika库。所以问题是关于确认和消息预取。

>

  • 假设我们有一个只有消费者的队列(确保这个队列被声明为独占的)。那么,我是否正确理解了:无论我使用ack标志还是不使用ack标志?无论如何,我不应该能够同时处理多条消息,而且没有其他消费者可以接收其他仍在排队的消息。最好不要打开确认,因为这可能会减少AMQP服务器的负载。

    如果没有确认,预取计数就没有任何意义。对吗?

    我不确定预取是如何工作的。我对新消息有一个回调,在它的最终语句中我承认或拒绝该消息。这是唯一的功能,无论预取计数有多大——无论如何,在当前消息完成之前不会处理另一条消息。那么为什么我需要更改prefetch_count值呢?

    提前谢谢。

  • 共有1个答案

    方风华
    2023-03-14

    取消设置autoack标志后,如果应用程序在消息处理过程中失败,所有收到的消息都将丢失。如果这种情况非常罕见,并且message lose是应用程序中的适当选项(例如,但不限于日志处理),则可以关闭autoack。

    是的,取消设置autoackunset需要更简单的代理逻辑,因此它使用的资源更少。

    至于prefetch count(和prefetch size),这些选项告诉代理,对于单个消息,提前发送到客户端的有效负载可能有多大。通常用于节省网络操作等待新消息的时间。当prefetch size使用时,客户端将收到一条或多条消息,其总大小等于或小于预设的pretch size(和/或count,小于)。

    应用预取计数预取大小规则。当其中一个设置为零(未设置)时,将不应用该设置。

    最重要的是,预取定义了在客户端未确认的更多消息之前发送消息的行为。

    这两种设置结合起来会产生如下效果:

    使用邮件计数限制预回迁并提前发送邮件:

    条件:

    • 队列:N条消息x 1kb

    工作流程:

    • 代理向客户端发送4条消息(受预取计数=4限制)。4消息将被标记为未确认并从队列中移出(这样它们就不会被传递到其他客户端)

    使用大消息预回迁:

    条件:

    • 队列:1条消息x 5Kb,N条消息x 1kb
    • 预取:预取大小=5kb,预取计数=2
    • 自动确认:关闭

    工作流程

    • Broker向客户端发送1条消息(受预取大小=5kb的限制),并将该消息标记为un-aked

    使用自动确认:

    条件:

    • 队列:N条消息x 1kb
    • 预取:预取大小=5kb,预取计数=10
    • 自动确认:开启

    工作流程:

    • no ack设置为true时,prefetch sizeprefetch count都被忽略(这是RabbitMQ和AMQP文档中调用自动确认功能的方式),消息将逐个发送到客户端,并在成功发送后从队列中删除

    请注意,AMQP具有异步体系结构,因此在某些情况下,两个客户端可能会同时接收单个消息。此外,未确认的消息可能会被发送回同一个客户端(尤其是如果您只有一个客户端)。

    此外,查看prefetch-sizeprefetch-count官方留档,并尝试使用这些选项。

    注意:autoack基本上是no ackAMQP标志设置为true

     类似资料:
    • 我们正在使用SpringAMQP,其风格与使用AMQP的SpringRemoting相同。我在每封邮件上设置,以便在无法立即发送给消费者时立即过期。这非常有效,但是,它让生产者等待指定的值,然后使用失败(如果我没有记错的话)。如果消息无法传递(只有在消息实际接收时才等待超时),是否有任何方法可以使生产者立即失败?

    • 我正在使用spring amqp使用出站网关将消息发布到RabbitMQ。我在连接工厂上设置了publisher confirms,并添加了自定义回调侦听器。 问题是我的相关数据总是空,我不能在出站网关上添加任何相关数据。这仅适用于出站通道适配器。 对于出站网关,出版商是否会确认工作? 编辑我的配置如下。我查看了SI代码,是的,publisher确认已启用。问题是当我收到NACK时我会做什么?由于

    • 接收到do-new推送后,确认一个预订单 请求参数说明 参数 描述 必填 示例值 类型 最大长度 action 接口参数组 是 object └action 需要调用的接口名称 是 bk_state string get GET参数组,本组参数需要参与签名 是 object └id 预订单id 是 8601458771 number └state 预订状态,1=预订成功,-1=预订失败 是 1 n

    • 有没有办法更改发布者-确认每条消息?我们有一个接收消息并发布到RabbitMQ的Rest层。根据特定的消息属性,我们决定是否需要发布者确认。 有没有一种方法可以在发送消息时覆盖,发布者-确认?

    • 是否可以使用auto-ack=false禁用预取?我只是想避免每次确认消息时从队列中读取消息(预取)。我只想在调用“consume_message”时读取消息。设置prefetch_count=0似乎不起作用,它被视为“无特定限制”。 更新: 据我所知,“prefetch_count”是客户端缓存的消息数(本地读取到缓冲区)。例如,有一个用例: (让我们假设有一个我们连接到的队列并且它有消息) 创

    • 几周前,使用F2重构代码时没有得到任何确认。然而,几天后,使用F2在底部面板中打开一个“重构预览”选项卡。 直到我手动检查我想要重构的内容,并单击右上角的复选标记,重构才会完成。 我在网上或vscode设置中找不到任何内容。是否可以禁用此功能,以便重构像以前一样自动进行?