【问题标题】:Hitting connection limits with Azure functions and Azure SQL (node.js)使用 Azure 函数和 Azure SQL (node.js) 达到连接限制
【发布时间】:2019-05-05 08:47:12
【问题描述】:

我有一个提供 node.js API 的函数应用。我们通过繁琐的 Azure SQL 连接达到了 900 个并发连接的限制,并意识到我们应该添加连接池(当然,除非有更好的建议)。

Azure Functions + Azure SQL + Node.js and connection pooling between requests? 似乎回应了我们的祈祷,但想验证如何将单个连接池与 Azure 函数一起使用

最好的做法是把“let pool = new ConnectionPool(poolConfig, connectionConfig);”以上所有功能的mode.exports?这不是每次调用单个函数时都创建一个新池吗?

不幸的是,Microsoft 没有关于 node.js 的明确文档,因此我们将不胜感激!

【问题讨论】:

    标签: node.js azure azure-sql-database azure-functions tedious


    【解决方案1】:

    为了让整个Function app共享一个pool,我们需要把初始化部分放到一个共享模块中。 Christiaan Westerbeek 使用mssql 发布了wonderful solution,在这方面Function 应用和Web 应用没有太大区别。

    我建议使用mssql(在内部使用tediousgeneric-pool)而不是tedious-connection-pool,因为tedious-connection-pool 似乎已经有2 年没有更新了。

    将连接代码放入poolConfig.jsSharedLib文件夹下。

    const sql = require('mssql');
    const config = {
        pool:{
            max:50 // default: 10
        },
        user: '',
        password: '',
        server: '', 
        database: '',
        options: {
            encrypt: true // For Azure Sql 
        }
    };
    const poolPromise = new sql.ConnectionPool(config).connect().then(pool => {
        console.log('Connected to MSSQL');
        return pool;
      })
      .catch(err => console.log('Database Connection Failed! Bad Config: ', err));
    
    module.exports = {
      sql, poolPromise
    }
    

    并加载模块以连接到sql。我们使用 await 来获取 ConnectionPool 函数应该是异步的(默认为 v2 js 函数)。

    const { poolPromise } = require('../SharedLib/poolConfig');
    
    module.exports = async function (context, req) {
        var pool = await poolPromise;
        var result =  await pool.request().query("");
        ...
    }
    

    请注意,如果 Function app 使用多个实例进行横向扩展,也会为每个实例创建新池。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多