Google Cloud PubSub 在异步拉取消息时抛出 504 Deadline Exceeded 错误

Posted

技术标签:

【中文标题】Google Cloud PubSub 在异步拉取消息时抛出 504 Deadline Exceeded 错误【英文标题】:Google Cloud PubSub throws 504 Deadline Exceeded error while listening for messages in asynchronous pull 【发布时间】:2020-10-29 19:07:17 【问题描述】:

我有一个订阅 PubSub 主题并使用异步拉取的服务。在闲置 10 分钟且未收到任何消息后,PubSub 会引发 504 Deadline exceeded 错误。

错误总是在大约 10 分钟后发生。我发现的每个类似问题都与同步拉取有关,而不是我使用的异步拉取。

错误信息:

INFO:google.cloud.pubsub_v1.subscriber._protocol.streaming_pull_manager:Observed non-terminating stream error 504 Deadline Exceeded                                                                                                           
INFO:google.cloud.pubsub_v1.subscriber._protocol.streaming_pull_manager:Observed recoverable stream error 504 Deadline Exceeded                                                                                                                 
INFO:google.api_core.bidi:Re-established stream                                                                         
INFO:google.cloud.pubsub_v1.subscriber._protocol.streaming_pull_manager:Observed non-terminating stream error 504 Deadline Exceeded                                                                                                             
INFO:google.cloud.pubsub_v1.subscriber._protocol.streaming_pull_manager:Observed recoverable stream error 504 Deadline Exceeded

订阅者类别:

from google.cloud import pubsub_v1
class Subscriber():

    def __init__(self):
        self.subscriber = pubsub_v1.SubscriberClient()
        self.project_id = "my-project-id"
        self.subscription_id = "SUBSCRIPTION_MAIL_RECIEVE"
        self.subscription_path = self.subscriber.subscription_path(self.project_id,
                                                                   self.subscription_id)

    def subscribe(self, callback):
        """
        Parameters:
            callback (callable): function to be called for incoming messages on given topic
        """
        streaming_pull_future = self.subscriber.subscribe(self.subscription_path,
                                                          callback=callback)
        return streaming_pull_future

收听消息:

subscriber = Subscriber()
pull_future = subscriber.subscribe(my_callback_function(message))

with subscriber.subscriber:
        try:
            print("Waiting for messages")
            pull_future.result()
        except TimeoutError:
            pull_future.cancel()

【问题讨论】:

闲置 10 分钟的意思是在此期间您没有向您的主题发送任何消息? 是的,完全正确。没有消息发布到该主题,我的服务尝试收听“空”主题。 你试过使用streaming_pull吗? googleapis.dev/python/pubsub/latest/subscriber/api/client.html 【参考方案1】:

这是正常行为,在您的流重新建立时可以忽略这些消息。如果没有重新建立流并且没有发送心跳,那么您可能需要将您的谷歌核心 API 和谷歌云 Pub/Sub 升级到最新版本。

pip install google-cloud-pubsub --upgrade

pip install google-api-core --upgrade

您还可以按照链接 https://github.com/googleapis/google-cloud-python/issues/5800 中的建议过滤这些错误消息

【讨论】:

以上是关于Google Cloud PubSub 在异步拉取消息时抛出 504 Deadline Exceeded 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从 google-cloud-platform vminstance 中的 pubsub 回调函数调用全局变量?

google.cloud.pubsub_v1 和 google.cloud.pubsub 有啥区别?

如何使用 Google PubSub 确认 (@google-cloud/pubsub)

如何在 Google.Cloud.PubSub.V1 SubscriberServiceApiClientBuilder 中配置频道选项

Google Cloud Function - ImportError:无法从“google.cloud”(未知位置)导入名称“pubsub”

使用 Google Cloud PubSub 不断收到“向 Cloud PubSub 发送测试消息时出错...”