2016-05-05 9 views
0

Мы используем метод SendBatch() сервисной шины Azure SDK 3.1.7 для отправки данных в концентратор событий Azure. Ниже приводится фрагмент кода:Превышает предел (262144 байт), который в настоящее время разрешен по ссылке Исключение в методе SendBatch() служебной шины Azure

foreach (var packet in transformedPackets) 
     { 
      EventData eventData = new EventData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(packet, settings)));; 
      try 
      { 
       eventData.Properties.Add(AppConstants.TenantDeploymentUniqueIdKey, tenantDeploymentUniqueId); 
       eventData.Properties.Add(AppConstants.DataTypeKey, DataTypeKey); 
       byteCount += eventData.SerializedSizeInBytes;     
       if (byteCount > MaxBatchSize) 
       { 
        sender.SendBatch(transformedMessages); 
        transformedMessages.Clear(); 
        byteCount = eventData.SerializedSizeInBytes; 
       } 
       transformedMessages.Add(eventData); 
      } 
      catch (System.Exception) 
      { 
       eventData.Dispose(); 
       throw; 
      } 

     } 

Event после проверки свойства SerializedSizeInBytes перед добавлением данных о событиях в шихту (Максимально допустимый предел: 256 Кб), мы получаем следующее исключение:

Полученное сообщение (идентификатор доставки: 0, размер: 262279 байт) превышает предел (262144 байт), который в настоящее время разрешен по ссылке. в Microsoft.ServiceBus.Common.ExceptionDispatcher.Throw (исключение) Исключение в Microsoft.ServiceBus.Common.AsyncResult.End [TAsyncResult] (IAsyncResult результат) на Microsoft.ServiceBus.Common.AsyncResult 1.End(IAsyncResult asyncResult) at Microsoft.ServiceBus.Messaging.MessageSender.RetrySenderEventDataAsyncResult.End(IAsyncResult r) at Microsoft.ServiceBus.Messaging.MessageSender.EndSendEventData(IAsyncResult result) at Microsoft.ServiceBus.Messaging.EventHubSender.SendBatch(IEnumerable 1 eventDataList)

ответ

1

Когда события переводятся в один AmqpMessage, в заголовок партии добавляется дополнительная информация.

Убедитесь, что общий размер всех EventData опускается ниже 250 тыс.

Здесь вы можете найти подробную информацию по этому вопросу: How to use client-side event batching functionality while Sending to Microsoft Azure EventHubs

0

Я тоже обращенный тот же вопрос на хаб события. Но умный способ справиться с этой функцией - использовать рекурсивный вызов. Здесь, проводя пример кода, который отлично работает для меня.

Метод 1: Процесс нормального SendBatchAsync операции

public async Task SendBatchToEHAsync(IEnumerable<string> inputContent) // Taking List of String to process (50000 Lines Approx) 
{ 
    try 
    { 
     var batch = new List<EventData>(); 
     foreach (var item in inputContent) // Add it to Batch 
      { 
       var bind = new EventData(Encoding.UTF8.GetBytes(item)); 
       batch.Add(bind); 
      } 
      try 
      { 
       await eventHubClient.SendBatchAsync(batch); 

      } 
      catch (MessageSizeExceededException) 
      { 
       await ReprocessQuotaExceededBatch(batch); 
      } 
    } 
    catch (Exception ex) 
    { 

     throw; 
    } 
} 

Способ 2: Ручка и правая рекурсивная функция для обработки "MessageSizeExceededException"

public async Task ReprocessQuotaExceededBatch(List<EventData> batch) 
{ 
    try 
    { 
     var noOfCalls = 2; 
     var noOfRecordsPerSplitBatch = (int)Math.Ceiling((double)batch.Count/noOfCalls); 
     var counter = 0; 
     while (counter < noOfCalls) 
     { 
      var insertSubList = GetSubListForEventDataBatch(batch, counter); 
      try 
      { 
       await eventHubClient.SendBatchAsync(insertSubList); 

      } 
      catch (MessageSizeExceededException) 
      { 
       await ReprocessQuotaExceededBatch(insertSubList); 
       // Perform SPlit processing in case of this exception occures 
      } 
      counter++; 
     } 
    } 
    catch (Exception ex) 
    { 

     throw; 
    } 
} 

Способ 3: вспомогательный метод, чтобы сделать расщепление для предметов

private static List<EventData> GetSubListForEventDataBatch(List<EventData> list, int count) 
{ 

    var sList = list.Skip(count * noOfRecordsPerSplitBatch).Take(noOfRecordsPerSplitBatch); 
    List<EventData> subList = new List<EventData>(); 
    subList.AddRange(sList); 
    return subList; 
} 

Надеюсь, что это решит проблему для других s. Пожалуйста, запишите свои улучшения для этого кода, если таковые имеются.