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 请求

firebase 云功能-发布/订阅触发器-要执行的发布和订阅者功能之间的延迟是多少

Firebase:如何停止收听快照

Firebase 消息 - 无法接收来自订阅的通知

我们如何在通过 EventARc 触发器创建的云发布订阅中启用排序?