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

Posted

技术标签:

【中文标题】Google PubSub 中的 PubSub.Subscriptions() 和 Topic.getSubscriptions() 有啥区别?【英文标题】:What is the difference between PubSub.Subscriptions() and Topic.getSubscriptions() in Google PubSub?Google PubSub 中的 PubSub.Subscriptions() 和 Topic.getSubscriptions() 有什么区别? 【发布时间】:2021-05-01 05:36:46 【问题描述】:

我创建了一个使用 Google PubSub NodeJS SDK 处理 PubSub 消息传递的程序。 在开发这个时,我注意到 NodeJS 库和文档显示了两种在 Google PubSub 中检索活动订阅的方法:

    PubSub.subscriptions('SubscriptionName')docs PubSub.topic('TopicName).getSubscriptions()docs

我知道第二个选项可能只列出与某个主题相关的订阅,但我对幕后工作更感兴趣。

在我的第一次尝试中,我使用了第二个选项来检索我的订阅,并且在运行应用程序时有效,但是当我尝试在我的单元测试中模拟调用时遇到了超时,我无法修复它。我切换到第一种方法,它不使用 Promise,只返回一个普通的 Subscription 对象,这在我的单元测试中确实工作得很好

不使用基于承诺的调用是否有缺点,因为它可能不会产生最新的结果?如果不是,是否有两种选择,一种是基于承诺而另一种不是?

【问题讨论】:

【参考方案1】:

这两个 API 做的事情非常不同。第一个可用于接收消息的one creates a Subscription object in the client。它不会从 Cloud Pub/Sub 服务中检索任何状态。因此,没有异步工作要做,也不需要返回一个 Promise。第二个其实是goes to the Cloud Pub/Sub service, retrieves the list of subscriptions for the topic, and creates a Subscription object for each one。

如果您知道要接收消息的订阅的名称并且可以合理地确信它存在,请使用PubSub.subscriptions('SubscriptionName')。如果您尝试通过调用 subscription.on('message', messageHandler); 开始接收此订阅上的消息,但它不存在,则会发出错误。

如果您不知道订阅的名称,而是需要获取列表并从该主题的所有订阅列表中选择要从中接收消息的订阅,请使用PubSub.topic('TopicName).getSubscriptions() 调用。

要进一步了解为什么模拟 getSubscriptions() 调用不起作用,可能需要查看用于模拟它的代码。

【讨论】:

感谢您的解释,这是否意味着仅在客户端而不是 pub/sub 服务本身上创建订阅可能会有缺点? 这些 API 都不会在 Pub/Sub 服务中创建订阅。为此,您实际上需要create one。 啊,好吧,那么我应该重新表述一下,不从 Cloud Pub/Sub 服务中检索主题订阅列表是否有不利之处? 不,完全没有缺点。我想说不要从服务器检索订阅列表,除非您确实需要该列表,因为例如您不知道订阅的名称。

以上是关于Google PubSub 中的 PubSub.Subscriptions() 和 Topic.getSubscriptions() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Google PubSub / Gmail Webhook:发送电子邮件时始终从 PubSub 接收多个 POST 请求

Google Cloud IoT Core 和 Pubsub 定价?

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

在哪里可以检查或管理使用 Google Firebase 创建的 PubSub 主题?

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

在 google pubsub 中设置 gmail 的发布权限,权限被拒绝