我正在使用http POST触发器开发Azure函数,一旦客户端调用它并发布json数据,我会将其发送到事件中心并保存到数据湖。 一旦受到高流量(每小时20k)的影响,Azure functino将生成高出站TCP连接,这将超出计划的限制(1920)。
这是将数据发送到事件中心的代码:
EventHubClient ehc = EventHubClient.CreateFromConnectionString(cn);
try
{
log.LogInformation($"{CogniPointListener.LogPrefix}Sending {batch.Count} Events: {DateTime.UtcNow}");
await ehc.SendAsync(batch);
await ehc.CloseAsync();
}
catch (Exception exception)
{
log.LogError($"{CogniPointListener.LogPrefix}SendingMessages: {DateTime.UtcNow} > Exception: {exception.Message}");
throw;
}
这是将数据发送到数据湖:
var creds = new ClientCredential(clientId, clientSecret);
var clientCreds = ApplicationTokenProvider.LoginSilentAsync(tenantId, creds).GetAwaiter().GetResult();
// Create ADLS client object
AdlsClient client = AdlsClient.CreateClient(adlsAccountFQDN, clientCreds);
try
{
using (var stream = client.CreateFile(fileName, IfExists.Overwrite))
{
byte[] textByteArray = Encoding.UTF8.GetBytes(str);
stream.Write(textByteArray, 0, textByteArray.Length);
}
// Debug
log.LogInformation($"{CogniPointListener.LogPrefix}SaveDataLake saved ");
}
catch (System.Exception caught)
{
string err = $"{caught.Message}Environment.NewLine{caught.StackTrace}Environment.NewLine";
log.LogError(err, $"{CogniPointListener.LogPrefix}SaveDataLake");
throw;
}
谢谢
答案 0 :(得分:1)
TCP连接受到特定数量的限制,具体取决于您所使用的计划(在任何级别的B / S / P中使用或使用静态计划)。 对于高工作量,我宁愿选择
A :使用具有单独功能的队列,并通过功能批处理大小和其他设置来限制并发性
或
B :使用SemaphoreSlim来控制传出流量的并发性。 (https://docs.microsoft.com/de-de/dotnet/api/system.threading.semaphoreslim?redirectedfrom=MSDN&view=netframework-4.7.2)