Firebase 云发布订阅订阅停止侦听消息
Posted
技术标签:
【中文标题】Firebase 云发布订阅订阅停止侦听消息【英文标题】:Firebase cloud pubsub subscriptions stops listening for messages 【发布时间】:2021-02-27 04:37:17 【问题描述】:我正在尝试将我的 firebase 云功能项目连接到第三方 pub/sub(一个单独的项目)。根据这个thread,这是不可能的,所以没有传统的方法可以做到这一点。但是,我尝试在我的 firebase 云功能上使用 @google-cloud/pubsub
客户端手动订阅某些主题。我需要对发布/订阅消息做出反应并编写/更新某些文档。
示例(最小):
我在 sub.ts 上有一个 pubsub 订阅:
const pubSubClient = new PubSub(
projectId: config.project_id,
credentials:
client_email: config.client_email,
private_key: config.private_key
);
我订阅某个主题做一些业务逻辑
const 订阅 = pubSubClient.subscription('my-subscription');
this.subscription.on('message', async (message) =>
try
message.ack();
const event = parseData(message.data);
await admin.firestore().collection('my-collection').add(event);
catch (e)
console.error(e);
);
然后这个文件被导入到我声明大多数 CF 函数的 index.js 中。
import * as admin from 'firebase-admin';
admin.initializeApp();
import './sub';
export myFunction from './modules/my-module';
export myOtherFunction from './modules/other-module';
我的订阅似乎会在一段时间后消失,并且消息不会通过。如果我重新部署我的功能,它似乎可以工作一段时间,但随后它会停止收听消息。我读过 Firebase 云函数是无状态的,所以在这种情况下,我需要在我的 firebase 项目中使用“有状态”模块。这可能吗?还是我应该在另一台服务器上管理它?
谢谢!
【问题讨论】:
我很难想象您的系统是如何工作的以及问题是什么。请编辑问题以更详细地解释问题所在,并显示任何有助于说明的相关代码。 谢谢@DougStevenson 我改变了一点,你不明白什么?我需要能够在我的 firebase 函数中订阅 google-pub/sub 项目并收听消息,然后进行一些写入/更新操作。 您的问题表明您尝试编写代码,但我猜它不起作用?我说不出来。请编辑问题以共享代码并进行更多说明。在 Stack Overflow 上,预计问题会提供 complete, minimal example。 好的 @DougStevenson 感谢您的反馈。我改进了我的问题。 【参考方案1】:您在此处尝试执行的操作(从 Cloud Functions 中运行的代码订阅 pubsub 主题)将无法正常工作,原因有两个:
Cloud Functions 服务器实例自动扩展和缩减。可能有 0 个实例或 1000 个实例同时运行您的触发器,具体取决于当前负载。 Cloud Functions 会在函数终止时关闭正在运行的代码,并且任何函数调用的最大超时时间为 9 分钟。因此,即使您设法订阅了某个主题,该订阅也没有保证的持续时间。它最终会被销毁,你会丢失消息。
如果您想在“项目 A”中使用 Cloud Functions 处理消息,但消息来自“项目 B”,则应考虑将它们从 A 发送到 B,或许可以通过使用 B 中的 pubsub 函数来执行此操作将每条消息发布到 A 中的主题。然后您可以编写另一个函数在 A 中处理它们。
【讨论】:
以上是关于Firebase 云发布订阅订阅停止侦听消息的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 云消息传递为已取消订阅的令牌返回 200 OK
使用 Firebase 云消息传递从服务器端管理主题订阅的示例 GET 请求