我将Azure上的应用程序作为连续的WebJob托管。该程序经常(大约每秒一次)通过创建DocumentClient实例来调用CosmosDB数据库(我在结果IEnumber上使用DocumentClient函数CreateDocumentQuery和Linq Query来从数据库中检索对象)。当我在本地运行程序时,它的行为符合预期,没有任何问题。当我将程序发布为Azure WebJob并运行它时,我的日志表明正在抛出HttpRequestException,并显示以下消息:“发送请求时发生错误。”另外,我得到以下堆栈跟踪:
at 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() 在System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable`1源)处 在... 我的呼叫代码...
仅当我频繁使用DocumentClient且仅在WebJob一侧时,才出现此问题。在本地运行等效负载不会使我的应用程序崩溃。为什么在我的WebJob中发生此异常?可能值得注意的是,S1和P1V2 App Service层均会出现此问题。
答案 0 :(得分:0)
DocumentClient不应基于每个请求使用,而是应在应用程序中将其用作单例实例。按请求创建客户端会增加很多延迟开销。
因此,我将Client属性声明为“静态”,然后在Service的构造函数中对其进行初始化。您可以在Connect方法中调用await Client.OpenAsync(
)来“预热”客户端,并且在每个公共方法中,都可以直接使用Client实例来调用DocumentDB API。
使用服务的Dispose方法处置客户端。
这些客户端被设计为可重复使用,因此建议您有一个静态实例,以在所有功能中重复使用。 在这里,您可以找到有关性能问题的提示:
https://docs.microsoft.com/en-us/azure/cosmos-db/performance-tips#sdk-usage
希望有帮助!