Я пытаюсь вставить 100K записей из хранилища больших двоичных объектов (файл с разделителями табуляции) в табличное хранилище azure с помощью функции Azure. Вставка этих записей очень ненадежны. Иногда он вставляет все 100K, а иногда и 7500 записей. Я изо всех сил пытаюсь понять причину, по которой он не может вставить остальные записи. Я не вижу никакого исключения. Вот код, который я использую. Я не уверен, что я делаю что-то не так здесь. Этого не происходит, когда я запускаю его локально, а только когда публикуется функция
[FunctionName("LargeFileProcessor")]
public async Task Run([BlobTrigger("%InputContainer%/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("AzureCloudSettings.StorageConnectionString"));
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("adeptra");
CloudBlockBlob cbb = container.GetBlockBlobReference(name);
using (var memoryStream = new MemoryStream())
{
await cbb.DownloadToStreamAsync(memoryStream);
string[] result = Encoding.
ASCII.
GetString(memoryStream.ToArray()).
Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
var largeFiles = new List<LargeFile>();
foreach (var str in result)
{
if (string.IsNullOrWhiteSpace(str.Trim())) continue;
var largeFile = MapFlatFile(str);
largeFiles.Add(largeFile);
}
//Delete the blob
await cbb.DeleteAsync();
for (int i = 0; i < largeFiles.Count; i += 100)
{
var items = largeFiles.Skip(i).Take(100);
var success = await _service.BulkInsertLargeFileAsync(items);
if(!string.IsNullOrWhiteSpace(success))
{
throw new Exception("$Failed at loop i:{i} for reason :{success}");
}
}
}
}
public async Task<string> BulkInsertLargeFileAsync(IEnumerable<LargeFile> rows)
{
try
{
var largeFileEntity = _mapper.Map<IEnumerable<LargeFileEntity>>(rows);
var result = await _largeFileDataProvider.BulkAddCommsTemplateAsync(largeFileEntity);
return null;
}
catch (Exception exception)
{
return $"Exception at BulkInsertLargeFileAsync {exception.Message}";
}
}
public async Task<IList<TableResult>> BulkAddCommsTemplateAsync(IEnumerable<LargeFileEntity> templates)
{
return await _largeRepository.BatchInsertAsync(templates);
}
public async Task<IList<TableResult>> BatchInsertAsync(IEnumerable<TEntity> rows)
{
TableBatchOperation batchOperation = new TableBatchOperation();
foreach (var entity in rows)
{
batchOperation.InsertOrMerge(entity);
}
var result = await _table.ExecuteBatchAsync(batchOperation);
return result;
}
-Alan-
РЕДАКТИРОВАТЬ:
Если я отключите опцию «elasti c scale out» в функции azure (минимальный экземпляр = 1, максимальный пакет = 1), тогда я могу видеть, что результаты согласуются (записи 100K вставляются все время).