Firebase 云 pubsub 订阅停止监听消息
Firebase cloud pubsub subscriptions stops listening for messages
我正在尝试将我的 firebase 云函数项目连接到第三方 pub/sub(一个单独的项目)。根据这个,这是不可能的,所以没有传统的方法可以做到这一点。但是,我尝试在我的 firebase 云功能上使用 @google-cloud/pubsub
客户端手动订阅某些主题。我需要对 pub/sub 消息和 write/update 某些文档做出反应。
示例(最小):
我在 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 项目中需要一个“有状态”模块。这可能吗?或者我应该在另一台服务器上管理它?
谢谢!
您在此处尝试执行的操作(通过 Cloud Functions 中的代码 运行 订阅 pubsub 主题)将无法工作,原因有二:
- Cloud Functions 服务器实例自动扩展和缩减。您的触发器可能同时存在 0 个实例或 1000 个实例 运行,具体取决于当前负载。
- Cloud Functions 在函数终止时关闭 运行 代码,任何函数调用的最大超时时间为 9 分钟。
因此,即使您设法订阅了某个主题,该订阅也没有保证的持续时间。它最终会被销毁,你会丢失消息。
如果您想在“项目 A”中使用 Cloud Functions 处理消息,但消息来自“项目 B”,您应该考虑将它们从 A 发送到 B,或许可以在 B 中使用不执行任何操作的 pubsub 函数其他将每条消息发布到 A 中的主题。然后您可以编写另一个函数来处理 A 中的它们。
我正在尝试将我的 firebase 云函数项目连接到第三方 pub/sub(一个单独的项目)。根据这个@google-cloud/pubsub
客户端手动订阅某些主题。我需要对 pub/sub 消息和 write/update 某些文档做出反应。
示例(最小):
我在 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 项目中需要一个“有状态”模块。这可能吗?或者我应该在另一台服务器上管理它?
谢谢!
您在此处尝试执行的操作(通过 Cloud Functions 中的代码 运行 订阅 pubsub 主题)将无法工作,原因有二:
- Cloud Functions 服务器实例自动扩展和缩减。您的触发器可能同时存在 0 个实例或 1000 个实例 运行,具体取决于当前负载。
- Cloud Functions 在函数终止时关闭 运行 代码,任何函数调用的最大超时时间为 9 分钟。
因此,即使您设法订阅了某个主题,该订阅也没有保证的持续时间。它最终会被销毁,你会丢失消息。
如果您想在“项目 A”中使用 Cloud Functions 处理消息,但消息来自“项目 B”,您应该考虑将它们从 A 发送到 B,或许可以在 B 中使用不执行任何操作的 pubsub 函数其他将每条消息发布到 A 中的主题。然后您可以编写另一个函数来处理 A 中的它们。