PubSub 死字

Posted

技术标签:

【中文标题】PubSub 死字【英文标题】:PubSub Dead Lettering 【发布时间】:2020-10-01 16:13:38 【问题描述】:

我正在尝试将云功能 pubsub 订阅转发到此处所述的死信主题:https://cloud.google.com/pubsub/docs/dead-letter-topics#gcloud

我试过了

$ gcloud pubsub subscriptions update gcf-worker-topic --dead-letter-topic=gcf-worker-dead-letter-topic

还尝试在控制台中修改 gcf-worker-topic 订阅。两者都给了我同样的错误:

ERROR: (gcloud.pubsub.subscriptions.update) INVALID_ARGUMENT: The supplied AppEngine URL project does not match the subscription's parent project

目标是在云功能崩溃时将消息转发到死信队列。

我做错了什么?这不支持吗?是否有未来支持的计划?

【问题讨论】:

【参考方案1】:

当您将 Cloud Function 直接插入主题时,会创建一个带有奇怪端点的自动推送订阅:

https://d4d1290519676f29baf13a7bf18a25bf-dot-jea3ef1cff72566d8-tp.appspot.com/_ah/push-handlers/pubsub/projects/PROJECT_ID/topics/test-topic?pubsub_trigger=true

您可以看到此 URL 在 appspot.com 中,这是 App Engine 的典型特征。因此,直接插入 PubSub 的 Cloud Function 会生成一个奇怪的 Hack,它在外部/google 项目中使用 AppEngine。无法更新。

解决方法是在 HTTP 触发模式下更改您的 Cloud Function,并在其上创建 PubSub 推送订阅。但是要小心,因为 PubSub 消息格式并不完全相同

推送订阅:
   
     "message": 
       "attributes": 
         "key": "value"
       ,
       "data": "SGVsbG8gQ2xvdWQgUHViL1N1YiEgSGVyZSBpcyBteSBtZXNzYWdlIQ==",
       "messageId": "136969346945"
     ,
     "subscription": "projects/myproject/subscriptions/mysubscription"
   
直接链接到云功能:https://cloud.google.com/functions/docs/calling/pubsub#event_structure

【讨论】:

【参考方案2】:

我相信您正在更新 topic id (gcf-worker-topic) 而不是 subscription id

在订阅中定义了dead-letter-topic。尝试创建一个新订阅:

gcloud pubsub subscriptions create subscription-id \
  --topic=gcf-worker-topic \
  --dead-letter-topic=gcf-worker-dead-letter-topic \
  --max-delivery-attempts=max-delivery-attempts \
  [--dead-letter-topic-project=dead-letter-topic-project]

【讨论】:

【参考方案3】:

您可能还需要--dead-letter-topic-project。请参阅dosumentation。

【讨论】:

谢谢,我尝试了同样的错误。另一个线程说云功能 pusbsub 订阅是由 Google 管理的项目创建的,因此名称不匹配。我想相信以某种方式仍然可以做到这一点。

以上是关于PubSub 死字的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 strophe.pubsub 插件为多个发布者配置 pubsub 节点或创建白名单

“处理组件 pubsub 错误:组件 pubsub 的初始化超时超过 5 秒”

Google PubSub 中的 PubSub.Subscriptions() 和 Topic.getSubscriptions() 有啥区别?

从 pubsub->bigquery 移动到 pubsub->gcs (avro)->bigquery

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