azure-iot-device:2.14.0 azure-iot-hub:2.6.1 asyncio:3.4.3 Python 版本:3.10.12 Azure IoTHub 详细信息:层: S1
问题描述: 我使用 Azure IoT SDK 开发了一个 Python 脚本,将 670 个设备连接到 Azure IoT 中心。该脚本旨在异步连接每个设备、更新设备孪生并并行发送遥测数据。
但是,在同时为所有 670 台设备运行脚本时,我面临着连接限制: 在 337 台设备成功连接、更新其孪生设备并开始发送遥测数据后,其余设备无法建立连接。 日志指示超出初始 337 连接的设备出现新的连接错误,并包含以下详细信息:
pipeline_stages_mqtt.py:83 - MQTTTransportStage(ConnectOperation): Connection watchdog expired. Cancelling op mqtt_transport.py:441 - disconnecting MQTT client async_adapter.py:72 - Callback completed with error Transport timeout on connection operation async_adapter.py:73 - ['azure.iot.device.common.pipeline.pipeline_exceptions.OperationTimeout: Transport timeout on connection operation\n'] mqtt_transport.py:150 - Creating client for connecting using MQTT over TCP
在异常中,收到的错误消息是:Error: Could not Complete operation before timeout.
有趣的是,当我将工作负载分成两批,每批 335 个设备,并在同一 IP 地址的 Python 脚本的不同实例中运行它们时,所有连接都会成功,并且每个设备都会更新其孪生设备并按预期发送遥测数据。
根据此文档,同时连接的设备数量没有具体限制,但根据所选的层和单位,每秒允许的新连接数量有限制。
对于免费套餐和 S1,新连接数限制为每秒 100 个,或每单位每秒 12 个连接。
为了满足 670 个设备的要求,您需要 S3 层,因为它每台每秒最多可以处理 6,000 个新连接。所有层的并发连接设备流的最大数量为 50。
async def device_twin_job(job_id, device_id, execution_time):
print ( "" )
print ( "Scheduling job " + str(job_id) )
job_request = JobRequest()
job_request.job_id = job_id
job_request.type = "scheduleUpdateTwin"
job_request.start_time = datetime.datetime.utcnow().isoformat()
job_request.update_twin = Twin(etag="*", properties=TwinProperties(desired=UPDATE_PATCH))
job_request.max_execution_time_in_seconds = execution_time
job_request.query_condition = "DeviceId in ['{}']".format(device_id)
输出: