出站TCP连接问题导致正在从Azure功能向事件中心和数据湖发送数据

时间:2018-10-09 18:34:47

标签: azure azure-functions azure-data-lake azure-eventhub

我正在使用http POST触发器开发Azure函数,一旦客户端调用它并发布json数据,我会将其发送到事件中心并保存到数据湖。 一旦受到高流量(每小时20k)的影响,Azure functino将生成高出站TCP连接,这将超出计划的限制(1920)。

  1. 高出站TCP连接是否是通过写入事件中心,数据湖或两者而引起的?
  2. 有没有办法减少它,所以我不必花更多钱来升级我们的计划?
  3. 如何调试它以解决问题?

这是将数据发送到事件中心的代码:

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;
}

谢谢

1 个答案:

答案 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