【问题标题】:Slow response sending data to IoT Hub using Device Client使用设备客户端向 IoT 中心发送数据的响应缓慢
【发布时间】:2021-10-28 02:05:21
【问题描述】:

我正在使用 .NET Web 应用程序作为 IoT 设备和 IoT 中心之间的缓冲区。 IoT 设备将数据发送到 Web 应用程序,然后将该数据路由到 Azure IoT 中心。我正在使用设备客户端来执行此操作。在我们投入生产后请求数量开始增长之前,它一直运行良好。

这是向 IoT 中心发送数据的代码。

public async Task SendDataToIoTHub(Message eventMessage, string deviceId, string deviceKey)
{
    string connectionString = $"HostName=" + IoTHubHostname + ";DeviceId=" + deviceId + ";SharedAccessKey=" + deviceKey;
    using (DeviceClient deviceClient = DeviceClient.CreateFromConnectionString(connectionString))
    {
        if (deviceClient == null)
        {
            return;
        }

        await deviceClient.SendEventAsync(eventMessage);
    }               
        
} 

我每分钟大约有 3k-4k 个请求,并且每个请求都会调用上面的代码。自从请求率达到这个数量以来,它真的开始变得不可靠了。在短时间内出现“TCP 连接过多”警告,导致整个应用程序开始显着减速。

我想知道设备客户端的这种初始化是否正确,或者是否有更好的方法。

谢谢!

【问题讨论】:

    标签: c# asp.net api azure-iot-hub


    【解决方案1】:

    这可能是由于达到了最大出站 TCP 连接数。限制是:

    • 每个 B1/S1/P1 实例 1,920 个连接
    • 每个 B2/S2/P2 实例 3,968 个连接
    • 每个 B3/S3/P3 实例 8,064 个连接
    • 每个 I1/I2/I3 实例 16,000 个连接

    Source(这篇文章还展示了如何查看一段时间内的 TCP 连接数)

    每次创建新的 DeviceClient 时,您都会打开一个新连接,因此使用这些速率,您会遇到一些限制。您可以扩展您的实例,但也许您应该考虑为每台设备保留一个 DeviceClient(如果您没有数千台设备)。

    您称它为“网络应用程序作为缓冲区”可能是有原因的,如果您想继续使用它,您可以考虑改用REST API to send your device events。如果您只发送一个事件,则不需要 AMQP 连接。

    【讨论】:

    • 非常感谢!我们开始测试 REST API 来发送设备事件,到目前为止它运行良好。
    猜你喜欢
    • 1970-01-01
    • 2017-08-11
    • 2013-09-14
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多