不等待在云运行容器中进行log.write()承诺就可以了吗?

cbdeveloper

我正在使用Cloud Run@google-cloud/logging从我的express应用程序注销一些内容

像这样的东西:

routeHandler.ts

import { Logging } from "@google-cloud/logging";

const logging = new Logging({ projectId: process.env.PROJECT_ID });
const logName = LOG_NAME; 
const log = logging.log(logName);

const resource = {
  type: "cloud_run_revision",
  labels: { ... }
};

export const routeHandler: RequestHandler = (req,res,next) => {
  try {
    // EXAMPLE: LOG A WARNING
    const metadata = { resource, severity: "WARNING" };
    const entry = log.entry(metadata,"SOME WARNING MSG");
    await log.write(entry);
    return res.sendStatus(200);
  }
  catch(err) {
    // EXAMPLE: LOG AN ERROR
    const metadata = { resource, severity: "ERROR" };
    const entry = log.entry(metadata,"SOME ERROR MSG");
    await log.write(entry);
    return res.sendStatus(500);
  }
};

您可以看到的log.write(entry)是异步的。因此,从理论上讲,建议您等待它。但是,这里的文档@google-cloud/logging说的是:

在此处输入图片说明

文件连结

我对此没有任何问题。在我的真实情况下,即使log.write()失败,它也位于a内try-catch,任何错误都将得到很好的处理。

我的问题是,它与Cloud Run文档有点冲突:

在此处输入图片说明

文件连结

Note: If I don't wait for the log.write() call, I'll end the request cycle by responding to the request

And Cloud Run does behave like that. A couple weeks back, I tried to respond immediately to the request and fire some long background job. And the process kind of halted for a while, and I think it restarted once it got another request. Completely unpredictable. And when I ran this test I'm mentioning here, I even had a MIN_INSTANCE=1 set on my cloud run service container. Even that didn't allow my background job to run smoothly. Therefore, I don't think it's fine to leave the process doing background stuff when I've finished handling a request (by doing the "fire and forget" approach).

So, what should I do here?

Rafael Lemos

根据评论中@Karl-JorhanSjögren的正确假设,将此答案发布为社区Wiki。

对于在Cloud Run中运行的应用程序进行Log调用,确实建议您采用即弃即用的方法,因为您实际上并不需要强制同步。

如评论中提到的那样,在您完成请求后,您将对CPU禁用感到担忧,CPU将首先受到限制,以便在长时间不活动后可以快速恢复实例并完全禁用该实例。因此,触发小型日志记录调用(大多数情况下将在几毫秒内完成)应该不是问题。

文档中提到的内容针对的是运行时间较长的流程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

让Jenkins无需永远运行就可以开始批处理?

不继承就可以进行多态吗?

有没有一种方法可以运行带有Ruby绑定测试套件的Selenium Webdriver,一旦运行完成,就可以在irb中继续编写测试了吗?

不使用令牌就可以在Gradle中进行资源过滤吗?

我如何在constraintlayout创建一个容器,这样我就可以设置背景?

无论如何,没有服务就可以启动Docker容器吗?

Qt IDE运行错误:无法打开.so文件,但从终端运行就可以了

无法将应用程序作为服务启动,但是作为独立进程运行就可以了

该线程一旦结束就可以运行,该怎么办?

Maven:为什么不使用pom.xml配置就可以运行mvn checkstyle:checkstyle?

不使用辅助功能就可以进行回文回传吗?

不必要时无需重复就可以进行排列

为什么在定义函数表达式之前就可以对其进行调用?

为什么不先生成ssh公钥/私钥就可以进行ssh连接?

是否可以以无线方式调试应用程序,或者不以XCODE连接USB电缆就可以进行调试吗?

代码在到达交换功能后停止,如果我将其注释掉,它就可以完美运行

UseQuery graphql -> useState with useEffect 这样我就可以运行第二个 useEffect 来设置更多状态

如何制作它,以便仅通过在控制台中键入其名称就可以运行特定程序?

是否有无需选择就可以运行当前代码块的快捷方式?

我如何通过/复制相同的选择?这样我就可以通过单击在同一选择上运行多个宏。

将数据从Python程序保存到“工作区”,这样我就可以绘图而不必再次运行该程序

在Applescript的文件路径中获取所有文件夹-这样我就可以对其进行标记

为什么不使用“ -a”参数就可以在MacOS上进行展开操作来更改内部空间?

完成更新后,如果选择了“稍后重新启动”选项,则仅关闭就可以了吗?

无法读取早先读取的excel文件就可以了吗?

为什么.then()在JavaScript中没有承诺就可以工作?

如果我的应用程序从一开始就可以运行在较低级别,为什么还要使用chroot进行沙箱安全保护?

直接在Eclipse中运行的源代码就可以了。为什么Jar文件将停止运行,并在控制台也不例外说明了什么?

为什么std range算法返回rd参数而不是std :: ranges :: dangling而不是...好了,就可以了吗?