Отсутствует запись при вставке записей большого объема в azure табличное хранилище - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь вставить 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 вставляются все время).

...