Python 成功确认后,发布/订阅消息仍然无法传递

Python 成功确认后,发布/订阅消息仍然无法传递,python,gcloud,google-cloud-pubsub,Python,Gcloud,Google Cloud Pubsub,我很困惑为什么我的gcloud发布/订阅队列在同步确认消息后没有收缩。我有一个小队列(不超过几百条消息),我使用的代码与gcloud文档中的代码非常相似: from google.cloud import pubsub_v1 as pubsub NUM_MESSAGES = 1 PROJECT = 'my_project' SUBSCRIPTION = 'my_sub' subscriber = pubsub.SubscriberClient() subscription_path = su

我很困惑为什么我的gcloud发布/订阅队列在同步确认消息后没有收缩。我有一个小队列(不超过几百条消息),我使用的代码与gcloud文档中的代码非常相似:

from google.cloud import pubsub_v1 as pubsub

NUM_MESSAGES = 1
PROJECT = 'my_project'
SUBSCRIPTION = 'my_sub'

subscriber = pubsub.SubscriberClient()
subscription_path = subscriber.subscription_path(PROJECT, SUBSCRIPTION)

with subscriber:
    response = subscriber.pull(
        request={"subscription": subscription_path, "max_messages": NUM_MESSAGES}
    )

    todo = []
    for received_message in response.received_messages:
        todo += [received_message.message.data]
        subscriber.acknowledge(
            request={"subscription": subscription_path, "ack_ids": [received_message.ack_id]}
        )
我知道消息已成功确认,因为我可以在监视中看到:

然而,队列仍然保持完全相同的大小:


这是怎么回事?有没有关于我做错了什么的想法?

您没有订阅您的PUBSUB,示例中有类似的内容

response = subscriber.subscribe(subscription_path, callback=callback)

仅仅因为您成功地完成了一些确认,并不一定意味着您的整个发布/订阅积压工作都被清除了。以下是一些需要检查的内容,以便更好地了解发生了什么:

  • 度量值是多少?它在增加吗?如果是这样,这意味着您的待办事项列表中至少有一条消息永远不会得到确认
  • 您能检查一下您的订户确认消息需要多长时间吗?(这通常可以通过登录订阅作业来实现。)如果确认时间长于订阅的确认截止日期,则PubSub将尝试重新传递消息。(请参阅:)这些重复消息可能会累积在积压工作中,需要自行提取和确认
  • 最后,根据:

    “请注意,要实现低消息传递延迟,请使用同步 拉力,重要的是要有多个同时出色的拉力 请求


    一次只能提取一条消息(在示例中,
    NUM\u MESSAGES=1
    ),因此,尤其重要的是始终保持开放式拉取(至少在清除积压工作之前),以便发布/订阅在消息准备就绪时始终有机会传递消息。

    我建议延长消息的租约,这样它们的确认截止日期就不会过期(当前可能有一些ack截止日期到期,导致邮件重新传递)


    确保您没有对消息进行nacking,同时增加发送的拉取请求量。最佳做法是在任何给定时间打开大量重叠的拉取,以获得更好的订户吞吐量。

    这是异步订阅的解决方案。我正在尝试实现同步拉取,如下所示:谢谢。针对您的问题,1)最早的未确认消息肯定在稳步增加。2)您可以看到这些是成功的确认,因此问题不是在截止日期后尝试确认消息。以及re 3)您是说,如果我没有向其他订阅者发出拉取请求,那么以前确认的消息将不会被清除?我应该补充一点,没有新消息被删除发布到主题,因此订阅者根本不可能没有跟上。Re:3,是的,如果您希望清除积压工作,您需要继续拉动订阅(通过此订阅作业或其他订阅作业),直到num_undelivered_messages为0。我不跟随。我不能一次拉动和确认一条消息?