gpt4 book ai didi

node.js - 适用于 Azure Node.js Function App 的 Singleton CosmosDB 客户端

转载 作者:行者123 更新时间:2023-12-04 08:08:49 27 4
gpt4 key购买 nike

我有一个 EventGrid 触发的 Node.js Azure 函数应用程序。

它可以同时接收 100 个调用来运行。如果该过程成功或失败,它将写入 CosmosDB。

但是,CosmosDB 客户端的初始化是一个昂贵且长时间运行的过程,因此我想在函数应用程序的所有 100 个实例中将这个初始化的客户端作为单例共享。

查看 Node.js 文档,它指出如果模块导出对象,则该模块将被缓存(同一实例)。 https://nodejs.org/api/modules.html#modules_caching也就是说,如果我返回一个对象,它将充当单例。

当我在 Azure 中测试代码时,我看到它被一遍又一遍地调用。

问题:如何在所有并发“线程”中初始化我的 CosmosDB 客户端。

在下面的示例代码中,我用 5000m/s 的长时间运行操作伪造了长时间运行的 Cosmos 初始化。

我昂贵的操作模块返回一个对象。

expenseOperation.js

const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));

let value = null;

const getInstance = async (context) => {
if(value !== null) return value;
context.log("Long running process started...")
await snooze(5000);
value = 5;
return value;
}

exports.something = {
getInstance
};

index.js

const { something } = require("../expensiveOperation");

module.exports = async function (context, req) {
context.log("JavaScript HTTP trigger function processed a request.");

var first = await something.getInstance(context);
context.done();
};

最佳答案

  1. 功能为meant to be stateless .

Write functions to be stateless

Functions should be stateless and idempotent if possible. Associate any required state information with your data.

  • 如果您想共享状态,则支持此功能的官方方式是通过 Durable functions 。引用from brochure :
  • Simplify complex orchestration challenges resolution

    Serverless functions are meant to be short-lived and stateless—until you need them to solve stateful problems. Remove this limitation in a fully managed way without provisioning more resources, just by coding your workflow definition. Simplify complex, stateful coordination requirements programmatically in event-driven applications with the Durable Functions extension.

  • 耐用的功能来自 their own baggage 。所以知道你在做什么。
  • <小时/>

    您应该重新考虑您的方法/设计。

    1. 任何原因 Azure Cosmos DB output binding for Azure Functions不适合你?
    2. 假设绑定(bind)不起作用。另一种方法是添加 Q-output binding到您的函数并将结果成功/失败作为消息发布到 Q。编写另一个函数 triggered from this Q这会将其写入 Cosmos DB。尽管任务完成和数据库更新有延迟,但它会改善 UX/API 响应时间。您还可以optimize via batchSize .

    关于node.js - 适用于 Azure Node.js Function App 的 Singleton CosmosDB 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66079363/

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