小编tra*_*ark的帖子

Lambda SQL Server RDS 连接泄漏

问题

mssql我在频繁调用的 Lambda 中使用v6.2.0(在标准负载下始终有约 25 个并发调用)。

我似乎在连接池或其他方面遇到了问题,因为我一直有大量打开的数据库连接,这些连接淹没了我的数据库(RDS 上的 SQL Server),导致 Lambda 在等待查询结果时超时。

我已经阅读了文档、各种类似的问题、Github 问题等,但对这个特定问题没有任何作用。

我已经学到的东西

  • 我确实了解到,由于处理程序函数外部的变量在同一容器中的调用之间共享,因此跨调用可以进行池化。这让我觉得我应该只看到运行 Lambda 的每个容器的几个连接,但我不知道有多少连接,因此很难验证。最重要的是,池应该阻止我拥有大量的开放连接,因此有些东西无法正常工作。
  • 有几种不同的使用方法mssql,我已经尝试了其中几种。值得注意的是,我尝试使用大值和小值指定最大池大小,但得到了相同的结果。
  • AWS 建议您在尝试创建新池之前检查是否已有池。我尝试过,但没有成功。这就像pool = pool || await createPool()
  • 我知道 RDS Proxy 的存在是为了帮助解决此类情况,但目前似乎尚未为 SQL Server 实例提供它。
  • 我确实有能力稍微减慢我的数据速度,但这对整个产品的性能有轻微影响,所以我不想这样做只是为了避免解决数据库连接问题。
  • 如果不加以检查,我会同时看到多达 700 个与数据库的连接,这让我认为存在某种泄漏,这可能不仅仅是高使用率的合理结果。
  • 我没有找到一种方法来缩短 SQL Server 端连接的 TTL,正如 re:Invent 幻灯片所建议的那样。也许这就是答案的一部分? 在此输入图像描述

代码

'use strict';

/* Dependencies */
const sql = require('mssql');
const fs = require('fs').promises;
const path = require('path');
const AWS = require('aws-sdk');
const GeoJSON = require('geojson');

AWS.config.update({ region: 'us-east-1' });
var iotdata …
Run Code Online (Sandbox Code Playgroud)

concurrency amazon-rds aws-lambda

5
推荐指数
1
解决办法
1290
查看次数

为什么不能在 C# 中加入空合并赋值运算符?

空合并运算符

我最喜欢的 C# 特性之一是空合并运算符,我已经使用了很长时间:

// Simple fallback
var foo = specifiedValue ?? fallbackValue;

// Fetch if not present
foo = foo ?? getAFoo();

// Parameter validation
foo = foo ?? throw new ArgumentNullException(nameof(foo));

// Combination of the two previous examples
foo = foo ?? getAFoo() ?? throw new Exception("Couldn't track down a foo :( ");
Run Code Online (Sandbox Code Playgroud)

空合并赋值运算符

我也喜欢新的 C# 8 运算符,它缩短了“如果不存在则获取”用例:

foo = foo ?? getAFoo(); // null-coalescing
foo ??= getAFoo(); // null-coalescing assignment
Run Code Online (Sandbox Code Playgroud)

我曾希望也许我也可以在参数验证用例中使用空合并赋值运算符,但似乎不允许这样做。这就是我想做的:

foo = foo ?? throw …
Run Code Online (Sandbox Code Playgroud)

c#-8.0

5
推荐指数
1
解决办法
77
查看次数

标签 统计

amazon-rds ×1

aws-lambda ×1

c#-8.0 ×1

concurrency ×1