gpt4 book ai didi

javascript - GCP Nodejs8云功能-同步PubSub发布

转载 作者:行者123 更新时间:2023-12-02 22:48:00 25 4
gpt4 key购买 nike

我正在努力使用 javascript/Nodejs8 Google Cloud Function 将有效负载发布到 Google PubSub。

因此,我有一个由 HTTP 请求触发的云函数,然后将请求正文发布到 pubsub 主题(配置为拉取模式)。

这是我的代码:

const {PubSub} = require('@google-cloud/pubsub');
const pubsub = new PubSub();
const topic = pubsub.topic('my-fancy-topic');

function formatPubSubMessage(reqObj){
// the body is pure text
return Buffer.from(reqObj.body);
};

exports.entryPoint = function validate(req, res) {

topic.publish(formatPubSubMessage(req)).then((messageId) => {
console.log("sent pubsub message with id :: " + messageId)
});

res.status(200).json({"res":"OK"});
};

我的问题是云函数在发布 pubsub 消息之前完成执行(在日志中,日志“函数执行花费了 X 毫秒,完成状态代码:200”在我的 pubsub 日志之前大约 30 或 40 秒显示.我还多次出现“忽略已完成函数中的异常”的日志,但我没有收到我的 pubsub 日志)

我不是 javascript 或 nodejs 专家,我也不掌握 javascript promise ,但我想知道是否可以使发布同步。我也在想我可能在这里做错了什么!

预先感谢您的帮助。

最佳答案

在您的逻辑中,当 HTTP 消息到达时,您的回调/事件处理函数将被调用。然后执行publish()函数。执行发布是一项异步事件。这意味着发布需要一些时间才能完成,并且由于 JavaScript(本质上)不想阻塞,因此它会立即返回一个 promise ,然后您可以使用该 promise 在异步工作完成时收到通知。执行publish()后,您的逻辑立即执行res.status(....),它发送对HTTP请求的响应,这确实是来自HTTP客户端的流请求的结束。异步发布仍在进行中,当它本身完成时,就会发生发布的回调并记录响应。

不幸的是,正如 Google 所记录的那样,这不是一个好的做法......

https://cloud.google.com/functions/docs/bestpractices/tips#do_not_start_background_activities

在最后一个故事中,您调用的函数 validate 仍将在发布完成之前结束。如果您想在publish() 执行时阻塞(有效地使其同步),您可以使用JavaScript await 关键字。松散地说,类似于:

try {
let messageId = await topic.publish(....);
console.log(...);
catch(e) {
...
}

您还需要将函数标记为异步。例如:

exports.entryPoint = async function validate(req, res) {
...

参见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

您还可以简单地从函数返回一个 Promise,并且在整个 Promise 得到解决之前,回调函数不会被视为已解决。

底线是深入研究 Promise。

关于javascript - GCP Nodejs8云功能-同步PubSub发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58305921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com