如何解决Azure 函数异常 - 将日志写入表存储时出错:Microsoft.Azure.Cosmos.Table.StorageException
我有一个 azure 函数,它与 blob 存储通信以读取上次同步日期时间,然后基于此从 Cosmos 数据库读取数据。
很少有交互工作正常并且在某些情况下随机抛出以下异常
"将日志写入表存储时出错:
Microsoft.Azure.Cosmos.Table.StorageException:对
无法执行套接字,因为系统缺乏足够的
缓冲区空间或因为队列已满。 --->
System.Net.Http.HttpRequestException:对套接字的操作可能
由于系统缺乏足够的缓冲空间或
因为队列已满。 ---> System.Net.Sockets.SocketException
(10055): 无法对套接字执行操作,因为
系统缺少足够的缓冲区空间或因为队列已满。在
System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32端口,
CancellationToken 取消令牌) --- 内部异常堆栈结束
跟踪 --- 在 System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,
Int32 端口,CancellationToken 取消令牌)在
System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage
请求,布尔值 allowHttp2,CancellationToken 取消令牌)在
System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage
请求,CancellationToken 取消令牌)在
System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage
请求,CancellationToken 取消令牌)在
System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage
请求,布尔 doRequestAuth,CancellationToken 取消令牌)
在 System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage
请求,CancellationToken 取消令牌)在
System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage
请求,CancellationToken 取消令牌)在
System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task1 sendTask,HttpRequestMessage request,CancellationTokenSource cts,Boolean disposeCts) at Microsoft.Azure.Cosmos.Table.RestExecutor.TableCommand.Executor.ExecuteAsync[T](RESTCommand
1
cmd、IRetryPolicy 策略、OperationContext operationContext、
CancellationToken 令牌)---内部异常堆栈跟踪结束---在
Microsoft.Azure.Cosmos.Table.RestExecutor.TableCommand.Executor.ExecuteAsync[T](RESTCommand1 cmd,IRetryPolicy policy,OperationContext operationContext,CancellationToken token) at Microsoft.Azure.WebJobs.Logging.Utility.SafeExecuteAsync(CloudTable table,TableBatchOperation batch) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Logging\Internal\Utility.cs:line 178 at Microsoft.Azure.WebJobs.Logging.Utility.WriteBatchAsync[T](ILogTableProvider logTableProvider,IEnumerable
1 e1) 在
C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Logging\Internal\Utility.cs:line
268 在
Microsoft.Azure.WebJobs.Logging.LogWriter.FlushTimelineAggregateAsync(Boolean
总是)在
C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Logging\Internal\LogWriter.cs:line
265 在 Microsoft.Azure.WebJobs.Logging.LogWriter.FlushCoreAsync() 中
C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Logging\Internal\LogWriter.cs:line
316 请求信息 RequestID: RequestDate: StatusMessage:
错误代码:"
谁能告诉我如何解决它?
解决方法
由于您没有从您的函数中共享任何相关的代码,我的回答会有点笼统。这似乎是由于套接字耗尽问题。虽然有一个不确定的 similar issue in github 包含更多细节,但有一些很好的提示可以消除任何悬而未决的果实(我强烈建议您阅读):
我特别建议您在方法外的静态私有实例中确保 Cosmos(或 Table)客户端、HttpClient 等的共享连接重用。
静态客户端
为了避免保持不必要的连接,重用客户端 实例,而不是在每次函数调用时创建新实例。 我们建议您为任何语言重复使用客户端连接 可能会在其中编写您的函数。例如,.NET 客户端喜欢 HttpClient, DocumentClient, 如果您使用单个,Azure 存储客户端可以管理连接, 静态客户端。
以下是您在使用 Azure Functions 应用程序中特定于服务的客户端:
- 不要在每次函数调用时都创建一个新客户端。
- 做创建一个每个函数调用都可以使用的静态客户端。
- 考虑如果不同的函数使用相同的服务,则在共享帮助器类中创建单个静态客户端。
示例:
using Microsoft.Azure.Documents.Client;
private static Lazy<DocumentClient> lazyClient = new Lazy<DocumentClient>(InitializeDocumentClient);
private static DocumentClient documentClient => lazyClient.Value;
private static DocumentClient InitializeDocumentClient()
{
// Perform any initialization here
var uri = new Uri("example");
var authKey = "authKey";
return new DocumentClient(uri,authKey);
}
// Function
public static async Task Run(string input)
{
Uri collectionUri = UriFactory.CreateDocumentCollectionUri("database","collection");
object document = new { Data = "example" };
await documentClient.UpsertDocumentAsync(collectionUri,document);
// Rest of function
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。