Google Cloud Pub/Sub 获取或创建订阅

Posted

技术标签:

【中文标题】Google Cloud Pub/Sub 获取或创建订阅【英文标题】:Google Cloud Pub/Sub get or create subscription 【发布时间】:2021-12-12 07:43:32 【问题描述】:

我有 2 段 WORKING 代码如下。

这将获得一个现有的订阅:

this.pubSubClient = new PubSub()
sub = this.pubSubClient.subscription(appConfig.pubSub.subscription)

创建并获取一个不存在的订阅:

this.pubSubClient = new PubSub()
this.topic = this.pubSubClient.topic(appConfig.pubSub.topic)
[sub] = await this.topic.createSubscription(appConfig.pubSub.subscription)

这一切都很好。但是,如果订阅不存在(在一个环境中),第一段代码会导致问题,如果订阅确实存在(在另一个环境中),第二段代码会导致问题。

所以我尝试过这样做:

let sub

try 
  sub = this.pubSubClient.subscription(appConfig.pubSub.subscription)
  console.log('using existing subscription')
 catch (err) 
  [sub] = await this.topic.createSubscription(appConfig.pubSub.subscription)
  console.log('using created subscription')

但上面的方法不起作用,因为第一行代码永远不会触发错误。它只是没有收到任何消息。有没有我可以使用的getOrCreateSubscription 命令获取订阅并在必要时创建它?

TIA

【问题讨论】:

【参考方案1】:

最好的方法似乎是订阅感兴趣的主题,如果它没有列出,那么它不存在,所以创建它,否则就得到它

const [subscriptions] = await this.topic.getSubscriptions()
const subs = subscriptions.map(subscription => last(subscription.name.split('/')))
const subExists = subs.includes(appConfig.pubSub.subscription)

let sub

if (subExists) 
  sub = this.pubSubClient.subscription(appConfig.pubSub.subscription)
  console.log('using existing subscription')
 else 
  [sub] = await this.topic.createSubscription(appConfig.pubSub.subscription)
  console.log('using created subscription')

FYI last 从 lodash 导入并返回数组中的最后一项

【讨论】:

以上是关于Google Cloud Pub/Sub 获取或创建订阅的主要内容,如果未能解决你的问题,请参考以下文章

从 Google Cloud Pub/Sub 而不是 base64 获取未编码的数据

无法按日期从 Google Cloud Pub/Sub 功能中的 Firebase 获取文档

如何通过 Google Cloud Monitoring JAVA 客户端库获取 Pub/Sub 订阅中未确认消息的数量

Google Cloud 上使用 Pub/Sub 的主/从模式

Google Cloud Pub/Sub API - 推送电子邮件

访问 Google Cloud Storage 触发事件“Pub/Sub”?