【发布时间】:2021-11-14 13:47:35
【问题描述】:
我有大约十几个 GCF 函数 (Python),它们每天运行一次。为了保持正确的顺序,我使用 PubSub。比如:
topic1 触发 function1 -> function1 运行 -> function1 向 topic2 写入消息 -> topic2 触发 function2 -> function2 运行 -> 等等。
这个用例是低吞吐量和一种非常简单(我认为)将 GCF 和 PubSub 一起使用以相互优势的方式。这些函数使用 Python 中的pubsub_v1 来发布消息。 IAM、权限等没有问题。代码如下:
from google.cloud import pubsub_v1
# Publish message
publisher = pubsub_v1.PublisherClient()
topic2 = publisher.topic_path('my-project-name', 'topic2_id')
publish_message = '{short json message to be published}'
print('sending message ' + publish_message)
publisher.publish(topic2, publish_message.encode("utf-8"))
我使用以下方法部署 function1 和其他功能:
gcloud functions deploy function1 --entry-point=my_python_function --runtime=python37 \
--trigger-topic=topic1 --memory=4096MB --region=us-central1 \
--source="url://source-repository-with-my-code"
但是,最近我开始看到一些非常奇怪的行为。基本上,function1 运行,日志看起来很棒,消息似乎已发布到 topic2 ......然后什么都没有。 function2 不会开始执行或在日志中显示任何内容以表明它已被触发。没有提示成功或失败的日志。所以本质上似乎是:
- 从 function1 到 topic2 的消息没有被发布,尽管 function1 以
Function execution took 24425 ms, finished with status: 'ok'结束 - 正在发布从 function1 到 topic2 的消息,但 topic2 没有触发 function2。
这是 PubSub 的预期行为吗?这些失败似乎完全是随机的。我花了几个月的时间,一切工作都非常可靠,现在突然间我不知道消息是否会被传递。似乎也很难跟踪这些 PubSub 消息的生命周期,以查看它们究竟在哪里丢失。我在文档中阅读了有关死信主题等的内容,但我真的不明白如何设置易于跟踪的内容。
- 频率极低的短消息“失败”传递是否正常?
- 是否有什么我遗漏或我应该做的事情,例如。在
publisher.publish()电话中以确保更可靠的交付? - 是否有一种透明的方式来查看正在发生的事情并查看这些消息丢失的位置?设置一个新订阅,我可以在控制台中查看并查看哪些消息正在传递,哪些消息失败,类似这样的事情?
- 如果我需要 100%(或接近)的可靠性,我应该放弃 GCF 和 PubSub 吗?什么更好?
【问题讨论】:
标签: google-cloud-platform google-cloud-functions google-cloud-pubsub