【问题标题】:Rate limiting via RunBulkEnrollmentOperationAsync with Azure IoT Device Provisioning Service通过 RunBulkEnrollmentOperationAsync 和 Azure IoT 设备预配服务进行速率限制
【发布时间】:2019-08-27 13:33:23
【问题描述】:

我需要配置更多 20,000 台设备,但出现以下错误:

太多了 请求:{"errorCode":429001,"trackingId":"0bf62c41-dc10-42e0-b292-e95776396a31","message":"操作 为此受到限制 租户。","timestampUtc":"2019-08-09T13:37:09.5244497Z"}

如何提高请求率或解决问题?

下面是使用的代码:

 private static async Task<IEnumerable<IndividualEnrollment>> BulkCreateIndividualEnrollmentsAsync(IEnumerable<Device> activeDevicesToAdd)
        {
            Console.WriteLine(DateTime.Now.ToString("hh:mm:ss.fff"));                   
            var individualEnrollments = new List<IndividualEnrollment>();
            foreach (var activeDeviceToAdd in activeDevicesToAdd)
            {
                var symmetricKey = _symmetricKeyGenerator.GenerateSymmetricKey(activeDeviceToAdd.RegistrationId);
                var symmetricKeyAttestation = new SymmetricKeyAttestation(symmetricKey, symmetricKey);
                var individualEnrollment = new IndividualEnrollment(activeDeviceToAdd.RegistrationId, symmetricKeyAttestation);
                individualEnrollment.ProvisioningStatus = activeDeviceToAdd.Status = ProvisioningStatus.Enabled                                 
                individualEnrollments.Add(individualEnrollment);
            }

            if (individualEnrollments.Any())
            {
                int batchSzie = BATCH_Size;

                for (int i = 0; i < individualEnrollments.Count;)
                {
                    if (i + BATCH_Size > individualEnrollments.Count)
                        batchSzie = individualEnrollments.Count - i;

                        var bulkEnrollmentOperationResult = await _provisioningServiceClient.RunBulkEnrollmentOperationAsync(BulkOperationMode.Create, individualEnrollments.GetRange(i, batchSzie));
                    if (!bulkEnrollmentOperationResult.IsSuccessful)
                        throw new Exception("Error: " + bulkEnrollmentOperationResult.ToString());
                    i += BATCH_Size;
                }

            }

            return individualEnrollments;
        }

更新

下面的示例:

https://github.com/Azure-Samples/azure-iot-samples-csharp/blob/master/provisioning/Samples/service/BulkOperationSample/BulkOperationSample.cs

NugetMicrosoft.Azure.Devices.Provisioning.Service

结果BulkEnrollmentOperationResult

结果中没有 RetryAfter。

【问题讨论】:

    标签: azure azure-iot-hub


    【解决方案1】:

    我想知道您是使用 SDK 进行这些调用,还是这是您自己的客户端进行调用。在任何情况下,您都可以简单地重试请求。响应在标头中包含 retry-after 值。该值表示重试前要等待的秒数。

    有关重试后的更多信息:https://www.rfc-editor.org/rfc/rfc7231#page-69

    编辑: 抱歉回复晚了。不确定 SDK 是否不会自动重试,但这是在我们的批处理操作中执行此操作的代码

    // batching loop
     
    try
    {           
        // client operation
    }
    catch (ProvisioningServiceClientHttpException ex) when (ex.IsTransient)
    { // retry the request
        if (ex.Fields.ContainsKey("retry-after") && int.TryParse(ex.Fields["retry-after"], out int waitTimeInSeconds))
        {
            await Task.Delay(TimeSpan.FromSeconds(waitTimeInSeconds));
        }
    }
    

    【讨论】:

    • 请看我的更新。你能详细说明retry-after。因为它不在结果中。
    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多