使用设备客户端向 IoT 中心发送数据的响应缓慢

Slow response sending data to IoT Hub using Device Client

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

这是将数据发送到 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 连接”警告,导致整个应用程序开始急剧变慢。

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

谢谢!

这可能是因为达到最大出站 TCP 连接数。限制是:

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

Source(此post还展示了如何查看随时间变化的 TCP 连接数)

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

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