DeviceClient произошел тайм-аут, но сообщение было отправлено на IotHub - PullRequest
2 голосов
/ 15 апреля 2019

У меня вопрос по методу SendEventAsync().

Я тестировал вставку и удаление LAN кабель

_sendDeviceClient.SetRetryPolicy(no);
_sendDeviceClient.OperationTimeoutInMillisecounds = xxx;

Не пытайтесь повторить. В ожидании ххх миллисекунды.

foreach() //Message1 Message2......
{  
  try
  {           
     await _sendDeviceClient.SendEventAsync(message);

     //Message send. Do success process
  }
  catch(Exception e)
  {
     //Message failed. Do failed process 
  }
}

Мой журнал "Сообщение отправлено", но в сообщении IotHub не было получено сообщение. Иногда «Сообщение не удалось», но Iothub получил сообщение.

Я не знаю, почему это произошло.

В любом случае, это проблема для реализации с try & catch?

1 Ответ

0 голосов
/ 28 апреля 2019

В этом сценарии я предполагаю, что вы не хотите прерывать цикл до тех пор, пока все ваши сообщения не будут отправлены в соответствующий пункт назначения. Я бы предложил вам использовать исключение Aggregate, которое может рассказать вам об общем сообщении и его статусе:

В конце вашего цикла, вы можете передать List его конструктору и выбросить его.

В конце цикла выполните:

AggregateException aggregateEx = new AggregateException(errors);
throw aggregateEx;

Приложение, которое запускается на устройстве, должно управлять механизмами подключения, повторного подключения и логикой повторных попыток отправки и получения сообщений. Кроме того, требования стратегии повтора сильно зависят от сценария IoT, контекста, возможностей устройства.

SDK устройств Azure IoT Hub предназначены для упрощения подключения и обмена данными между облаком и устройством и облаком. Эти SDK обеспечивают надежный способ подключения к Azure IoT Hub и полный набор параметров для отправки и получения сообщений.

Скорее всего, жест доставки сообщения не выполнен из-за сбоя соединения, что может происходить на многих уровнях.

1) Сетевые ошибки: отключение сокета и ошибки разрешения имен

2) Ошибки уровня протокола для транспорта HTTP, AMQP и MQTT: отдельные ссылки или сеансы с истекшим сроком действия

3) Ошибки уровня приложения, возникающие из-за локальных ошибок: неверные учетные данные или поведение службы (например, превышение квоты или регулирование)

SDK устройства обнаруживают ошибки на всех трех уровнях. Ошибки, связанные с ОС и аппаратные ошибки не обнаруживаются и обрабатываются SDK устройства. Дизайн SDK основан на Руководстве по обработке переходных сбоев от Центра архитектуры Azure.

Я вижу, что вы выбрали не политику повторных попыток, что означает, что у вас проблемы с пропускной способностью или стоимостью.

В идеале нужно реализовать правильную логику Retry, чтобы обеспечить доставку. Здесь вы можете посмотреть полный образец для IOT HUb

Вы можете узнать больше о RetryGuidance здесь

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...