C# Azure IoT Hub:如果超出每日消息限制,则发送数据时会发生什么情况?

C# Azure IoT Hub:如果超出每日消息限制,则发送数据时会发生什么情况?,c#,azure-iot-hub,C#,Azure Iot Hub,我们正在使用Azure的物联网中心作为物联网解决方案的后端。我们注意到,在一天中,我们的消息量意外增加,超过了每日40万条消息的限制 从客户端应用程序的日志中,我们找不到任何异常情况:根据日志,尽管超出了每日限制,客户端似乎仍在发送数据 所以我的问题是:当客户端应用程序使用DeviceClient.SendEventBatchAsync发送数据时,当已经超过每日消息限制时会发生什么?尽管没有例外,这些信息是冷血的吗?还是发生了我没能抓住的事情?我们正在使用C#.NETMicrosoft.Azur

我们正在使用Azure的物联网中心作为物联网解决方案的后端。我们注意到,在一天中,我们的消息量意外增加,超过了每日40万条消息的限制

从客户端应用程序的日志中,我们找不到任何异常情况:根据日志,尽管超出了每日限制,客户端似乎仍在发送数据

所以我的问题是:当客户端应用程序使用
DeviceClient.SendEventBatchAsync
发送数据时,当已经超过每日消息限制时会发生什么?尽管没有例外,这些信息是冷血的吗?还是发生了我没能抓住的事情?我们正在使用C#.NET
Microsoft.Azure.Devices.Client
1.19.0版,并使用MQTT协议发送数据

为了适应突发流量,物联网中心接受请求 超过油门一段时间。这些请求中的前几个 立即进行处理。但是,如果请求的数量 继续违反限制,IoT集线器开始将请求放入 以限制速率处理的队列。这种效应称为流量效应 塑造。此外,此队列的大小是有限的。如果 油门违规继续,最终队列填满,IoT 集线器开始拒绝请求,出现429 ThrottlingException

例如,您使用模拟设备向云发送200个设备 每秒发送到S1物联网中心的消息(限制为100/秒 D2C发送)。在最初的一两分钟内,这些消息会被处理 马上。但是,由于设备继续发送更多消息 超过限制,物联网集线器开始仅处理100条消息 每秒,并将其余的放入队列中。你开始注意到 延迟最终,您将得到429 ThrottlingException作为 队列已满,IoT集线器中的“油门错误数” 指标开始增加


所以是的,它得到批处理,直到队列满时开始抛出异常。您应该减少消息的数量,并考虑在出现突发数据的情况下选择支持客户端批处理的MQTT库。p> 您的MQTT设备应断开连接,并且此集线器的发送和接收操作将被阻止,直到下一个UTC日

在使用https协议的情况下,Azure IOT Hub将发送以下响应:

{
  "Message": "{\"errorCode\":403002,\"trackingId\":\"c41eb2a0f7764132aa31a7f3ff97a1ce-G:3-TimeStamp:06/20/2019 12:36:43\",\"message\":\"Total number of messages on IotHub 'xxxxxxxxx' exceeded the allocated quota. Max allowed message count : '8000', current message count : '8448'. Send and Receive operations are blocked for this hub until the next UTC day. Consider increasing the units for this hub to increase the quota.\",\"timestampUtc\":\"2019-06-20T12:36:43.5570129Z\"}",
  "ExceptionMessage": ""
}

这适用于F1缩放层,当超过每日分配的发送/接收消息操作时,任何缩放层的行为都应该相同

谢谢你的回答!然而,我们的问题显然只是设备+数据量的增加,而不是突发数据。批处理消息在这里没有任何好处,因为它们仍然是根据每日消息限制计算的。我查看了更多日志文件,发现我们的一些设备在尝试发送更多数据时收到了
TimeoutException
,而IoT Hub消息限制在当天达到。奇怪的是,很明显,这并没有影响我们所有的设备,因为它们能够持续发送数据。我已经测试了F1规模层的这种行为,并直接使用MQTT协议来查看Azure IoT集线器的反应。在我的测试中,MQTT设备为自动重新连接而关闭,因此当达到发送/接收每日限制时,设备已被Azure IoT Hub断开连接。在此之后,我通过https协议发送了一条d2c消息,以获取详细的响应错误消息。