每项服务一个 DynamoDB 客户端或所有服务一个 DynamoDB 客户端

One DynamoDB client per service or one DynamoDB client for all services

我有一个 .NET Core Web API,它从我的 DynamoDB 中的多个 table 中聚合数据。

有 5 个服务是从相关 table 读取的(思考客户服务,从客户读取 table)。每个服务都有自己的 DynamoDB 客户端,并且这些服务会同时执行。

我在负载下遇到了一些问题。基本上,服务有时会花费更长的时间来完成其 dynamo 请求。通常每个请求 < 50 毫秒,但在并发负载下,某些请求最多可能需要 1 秒。

我正在通过 45 秒(每秒约 44 个请求)的 2000 个请求的负载测试重现此内容。

我的问题是,在查询多个 table 时,这是正确的设计吗?还是应该只有一个 DynamoDB 客户端执行所有查询?我知道 DynamoDB 客户端在后台使用 HttpClient。这会是瓶颈吗?

附带说明一下,SLA 通常 < 100 毫秒。

简答

在对 DynamoDb 进行任何调用之前尝试使用 ThreadPool.SetMinThreads(100, 100)。在你的情况下,每项服务一个客户是可以的。

长答案

仅当您的服务访问不同的 table 时,才可以使用多个客户端。每次第一次调用新的 table 都需要同步 DescribeTable 调用来填充缓存,因此您不希望同一个 table 发生多次。总的来说,为所有服务使用一个客户端更安全。

但是,用于 .net 的官方 DynamoDB SDK 在性能和线程管理方面非常差,这很可能会给您带来问题。除了 DescribeTable 之外,还有一些锁和同步操作在某些情况下可能会导致线程饥饿。您可以尝试通过设置 ThreadPool.SetMinThreads(100, 100) 来“修复”它(您可能想使用另一个相当大的值而不是 100)。有关 this issue on github

的更多详细信息