Python 云发布/订阅在回调中缺少ack/nack,不会导致重新交付

Python 云发布/订阅在回调中缺少ack/nack,不会导致重新交付,python,google-cloud-platform,google-cloud-pubsub,Python,Google Cloud Platform,Google Cloud Pubsub,我正在尝试确保,如果没有发送ack/nack,云发布/订阅将重新传递我的消息。虽然我等待了10分钟以上,但它似乎没有这样做,这应该是确认截止日期的最长时间 我将这里的示例作为起点: 本质上,我在回调函数中注释了ack是消息的那一行。我使用了两个终端,一个用于发布消息,另一个作为订户接收消息。由于没有发送ack,我希望Cloud Pub/Sub会在ack截止日期内的某个时间尝试将消息重新传递给订阅者,但事实并非如此 这里的文件 假设“客户定期延长确认截止日期…最多10分钟”,因此我等待了10分

我正在尝试确保,如果没有发送ack/nack,云发布/订阅将重新传递我的消息。虽然我等待了10分钟以上,但它似乎没有这样做,这应该是确认截止日期的最长时间

我将这里的示例作为起点:

本质上,我在回调函数中注释了ack是消息的那一行。我使用了两个终端,一个用于发布消息,另一个作为订户接收消息。由于没有发送ack,我希望Cloud Pub/Sub会在ack截止日期内的某个时间尝试将消息重新传递给订阅者,但事实并非如此

这里的文件

假设“客户定期延长确认截止日期…最多10分钟”,因此我等待了10分钟,以防确认截止日期延长到最大值,但我仍然没有收到重新发送的消息

下面是我使用的经过编辑的回调方法。这是我对示例代码所做的唯一更改

def callback(message):
        print('Received message {} of message ID {}'.format(
            message, message.message_id))
        # Acknowledge the message. Unack'ed messages will be redelivered.
        # message.ack()
        print('Acknowledged message of message ID {}\n'.format(
            message.message_id))
如果我杀死订户(sub.py)并重新启动它,消息将重新传递。我做错什么了吗?此外,当我发送Nack而不是根本不发送任何内容时,消息会很快重新传递

编辑:

似乎也有人问过类似的问题

我想确认的事情:

  • 订阅中设置的确认截止日期并不总是使用的值。如酒吧/酒吧认为有必要,可将其扩展

  • 最长10分钟的确认截止时间实际上不是重新发送邮件之前可以经过的最长时间

  • 此最长时间由flow_control.max_lease_duration变量确定(默认值为2小时)


  • ackDeadline
    是在没有ack、nack或ack的情况下,一条消息对订阅者未完成的最长时间。一旦这段时间过去,消息将成为重新传递的候选消息,尽管重新传递可能不会立即进行。此字段的最大值为10分钟

    云发布/订阅客户端库在接收到消息后,会自动发送消息的ModackDaildate请求,直到消息被确认、取消或
    flow\u control.max\u lease\u duration
    period过去。本质上,它延长了ack的截止日期。客户端库的目标是跟踪ack截止日期,并根据需要扩展消息本身,以便用户不必这样做


    这就是为什么您会看到客户端库行为与订阅上配置的
    ackDeadline
    之间存在差异。使用客户端库时,应将
    max\u lease\u duration
    设置为您希望订阅者未收到邮件的最长时间。

    将此添加到代码底部
    返回中止(500)
    。消息是否已重新传递?@JohnHanley在我的回调方法末尾添加
    return abort(500)
    会导致此错误:“找不到记录器“google.cloud.pubsub\u v1.subscriber.\u protocol.streaming\u pull\u manager”的处理程序,然后大约每半秒立即、连续地重新传递消息。我担心的问题是,如果由于某种原因,回调停止或出错,并且ack/nack从未发送(或者在本例中为中止),我不确定这是否有帮助,但我运行了订阅服务器几个小时,在出现此错误后,RetryError:调用时超过了600.0s的截止日期,最后一个异常:503无法连接到所有地址“,消息开始每隔10-12秒重新发送一次。也许这导致ack截止日期重置为默认值?谢谢您的回答!有一件事我仍然感到困惑,那就是为什么当我运行从不确认或nack的订阅服务器时,
    max\u lease\u duration
    并不总是被点击。重新发送间隔似乎是随机的,任何持续时间在10秒到2小时之间。这些值都不能保证消息不会在该时间范围内重新发送。由于网络或服务器故障,邮件可能在
    max\u lease\u duration
    之前重新发送。