【问题标题】:Inserting 40/50 records to Azure table storage sometimes taking more than 30 seconds, hence throwing timeout exception将 40/50 条记录插入 Azure 表存储有时需要超过 30 秒,因此会引发超时异常
【发布时间】:2020-06-15 20:13:18
【问题描述】:

我有一个长时间运行的应用程序,其任务是每 2/3 秒插入一次数据。大多数时候它工作正常。但有时我会遇到超时异常。每次插入大约 50 条记录时,我都会进行检查。我检查了超过 2000 行的更多负载。它完美地工作。一天只有几次它抛出超时异常。

来源:Microsoft.WindowsAzure.Storage 目标站点:T EndExecuteAsyncT StackTrace:在 Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync[T](IAsyncResult 结果) 在 Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.c__DisplayClass2`1.b__0(IAsyncResult ar) --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.GetResult() 在 smi.Server.Shared.VehicleHistoryLibrary.ATVehicleHistoryContext.d__4.MoveNext()

这是我的代码

ThreadPool.SetMinThreads(1024, 256);
ServicePointManager.DefaultConnectionLimit = 256;
ServicePointManager.UseNagleAlgorithm = false;
ServicePointManager.Expect100Continue = false;
client.DefaultRequestOptions = new TableRequestOptions
            {
                MaximumExecutionTime = TimeSpan.FromSeconds(30), //Timeout requests after 30 seconds
                RetryPolicy = new ExponentialRetry(TimeSpan.FromSeconds(3), 4),
                LocationMode = LocationMode.PrimaryThenSecondary
            };  
var tableEntityGroups = histories.Select(h => new TrackHistoryTableEntity(h)).GroupBy(e => e.PartitionKey).ToDictionary(g => g.Key, g => g.ToList());
            List<Task> tasks = new List<Task>();
            foreach (var kvp in tableEntityGroups)
            {
                //Merge Track history records with the same FixTaken second into one, taking the average 
                var mergedHistories = kvp.Value.GroupBy(v => v.RowKey).Select(g => new TrackHistoryTableEntity()
                {
                    PartitionKey = g.First().PartitionKey,
                    RowKey = g.First().RowKey,
                    A = g.Select(v => v.A).Average(),
                    N = g.Select(v => v.N).Average(),
                    V = g.Select(v => v.V).Average(),
                    B = g.Select(v => v.B).Average(),
                    D = g.Select(v => v.D).Sum()
                });
                TableBatchOperation batchOperation = new TableBatchOperation();
                foreach (var v in mergedHistories)
                {
                    batchOperation.Add(TableOperation.InsertOrReplace(v));
                    if (batchOperation.Count >= 100)
                    {
                        tasks.Add(TrackHistoryTable.ExecuteBatchAsync(batchOperation));
                        batchOperation = new TableBatchOperation();
                    }
                }
                if (batchOperation.Count > 0)
                {
                    tasks.Add(TrackHistoryTable.ExecuteBatchAsync(batchOperation));
                }

                var splitKey = kvp.Value[0].PartitionKey.Split('_');
                tasks.Add(TrackHistoryTracksTable.ExecuteAsync(TableOperation.InsertOrReplace(new TableEntity(splitKey[0], Int32.Parse(splitKey[1]).ToString()))));

                if (trackPartitionUpdates)
                    tasks.Add(TrackHistoryPartitionUpdatesTable.ExecuteAsync(TableOperation.InsertOrReplace(new TableEntity(TrackHistoryTableEntity.GetHourTimestamp(DateTime.UtcNow).ToString(), kvp.Value[0].PartitionKey))));
            }
            await Task.WhenAll(tasks.ToArray());

【问题讨论】:

    标签: c# azure azure-table-storage


    【解决方案1】:

    这里有几个注意事项:

    1. [注意] 批处理表操作最大处理时间时间 SLA 为 30 秒,而不是 2 秒 用于单一实体操作。更多详情请访问https://azure.microsoft.com/en-us/support/legal/sla/storage/v1_5/
    2. [最佳实践] 实施重试策略(例如,最好采用指数重试批处理用例并考虑您的 SLA)。更多详情请访问https://docs.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific#azure-storage

    希望有帮助!

    【讨论】:

    • 感谢您的回答。重试策略已到位。它工作正常,除了它在一天内抛出 1 或 2 次超时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2010-11-15
    • 2021-06-15
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多