0

我在 Azure 上托管一个应用程序作为一个连续的 WebJob。该程序经常(大约每秒一次)通过创建 DocumentClient 实例来调用 CosmosDB 数据库(我使用 DocumentClient 函数 CreateDocumentQuery 和生成的 IEnumerable 上的 Linq Query 从我的数据库中检索对象)。当我在本地运行程序时,它的行为符合预期,没有任何问题。当我将程序发布为 Azure WebJob 并运行它时,我的日志表明正在抛出 HttpRequestException 和消息:

发送请求时出错。

此外,我得到以下堆栈跟踪:

在 System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 在 System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification) 在 System.Threading.Tasks.Task1.get_Result() 在 Microsoft.Azure.Documents.Linq.DocumentQuery1 .d__31.MoveNext() at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) at ...我的调用代码...

只有在我频繁使用 DocumentClient 并且仅在 WebJob 方面才会出现此问题。在本地运行等效负载不会影响我的应用程序。为什么我的 WebJob 中会出现此异常?值得注意的是,S1 和 P1V2 应用服务层都会出现此问题。

4

1 回答 1

0

DocumentClient 不应在每个请求的基础上使用,而应将其用作应用程序中的单例实例。为每个请求创建客户端将增加大量延迟开销。

因此,我将 Client 属性声明为“静态”并在 Service 的构造函数中对其进行初始化。您可以在 Connect 方法中调用await Client.OpenAsync() 来“预热”客户端,并且在每个公共方法中直接使用 Client 实例来调用 DocumentDB API。

在 Service 的 Dispose 方法中 Dispose 客户端。

这些客户端设计为可重复使用,因此建议您拥有一个可在所有功能中重复使用的静态实例。在这里您可以找到有关性能问题的提示:

https://docs.microsoft.com/en-us/azure/cosmos-db/performance-tips#sdk-usage

希望有帮助!

于 2019-03-25T09:05:57.043 回答