Osvědčené postupy pro nasazení zařízení IoT ve velkém měřítku

Škálování řešení IoT na miliony zařízení může být náročné. Rozsáhlá řešení je často potřeba navrhnout v souladu s limity služeb a předplatných. Když zákazníci používají službu Azure IoT Device Provisioning, používají ji v kombinaci s dalšími službami a komponentami platformy Azure IoT, jako jsou Sady SDK pro zařízení IoT a IoT. Tento článek popisuje osvědčené postupy, vzory a vzorový kód, které můžete začlenit do návrhu, abyste využili výhod těchto služeb a umožnili nasazení škálovat na více instancí. Díky těmto vzorům a postupům, které začínají fází návrhu projektu, můžete maximalizovat výkon zařízení IoT.

Zřízení nových zařízení

Prvním zřizováním je proces při prvním zprovoznění zařízení jako součást řešení IoT. Při práci s nasazeními ve velkém měřítku je důležité naplánovat proces zřizování, aby se zabránilo přetíženým situacím způsobeným všemi zařízeními, která se pokouší připojit najednou.

Použití rozloženého plánu zřizování

V případě nasazení zařízení ve velkém měřítku milionů může registrace všech zařízení najednou způsobit zahlcení instance DPS kvůli omezování (kód 429, Too Many Requestsodpovědi HTTP) a selhání registrace zařízení. Pokud chcete těmto omezením zabránit, použijte pro zařízení rozložený plán registrace. Nakonfigurujte velikosti dávek registrace zařízení v souladu s kvótami a limity DPS. Pokud je například registrační sazba 200 zařízení za minutu, velikost dávky pro onboarding by byla 200 zařízení na dávku.

Operace opakování

Pokud dojde k přechodným chybám kvůli zaneprázdněné službě, logika opakování umožňuje zařízením úspěšně se připojit ke cloudu IoT. Velký počet opakovaných pokusů ale může dále snížit zaneprázdněnou službu, která běží blízko své kapacity nebo v její kapacitě. Stejně jako u jakékoli služby Azure byste měli implementovat inteligentní mechanismus opakování s exponenciálním zpochybováním. Další informace o různých vzorech opakování najdete v vzoru návrhu opakování a zpracování přechodných chyb.

Místo okamžitého opakování nasazení při omezování počkejte na dobu uvedenou v retry-after hlavičce. Pokud ve službě není k dispozici žádná hlavička opakování, může tento algoritmus pomoct dosáhnout plynulejšího prostředí při onboardingu zařízení:

min_retry_delay_msec = 1000
max_retry_delay_msec = (1.0 / <load>) * <T> * 1000
max_random_jitter_msec = max_retry_delay_msec

S touto logikou zařízení zpožděním opětovného připojování po určitou dobu mezi min_retry_delay_msec a max_retry_delay_msec. Maximální zpoždění opakování se vypočítá s následujícími proměnnými:

  • <load> je konfigurovatelný faktor s hodnotami > 0, což značí, že zatížení se provede v průměru času zatížení vynásobené počtem připojení za sekundu.
  • <T> je absolutní minimální doba pro studené spouštění zařízení (vypočítaná jako T = N / cpsN celkový počet zařízení a cps jedná se o limit služby pro počet připojení za sekundu).

Další informace o načasování operací opakování najdete v tématu Časování opakování.

Opětovné zřizování zařízení

Opětovné zřízení je proces, kdy je potřeba zřídit zařízení v IoT Hubu po úspěšném připojení dříve. V důsledku toho může být potřeba zařízení znovu připojit ke službě IoT Hub, například:

  • Zařízení se může restartovat kvůli výpadku napájení, ztrátě připojení k síti, geografickému přemístění, aktualizacím firmwaru, obnovení továrního nastavení nebo obměně klíčů certifikátů.
  • Instance IoT Hubu může být nedostupná kvůli neplánovanému výpadku služby IoT Hub.

Při každém restartování zařízení byste neměli procházet procesem zřizování. Většina zařízení, která jsou znovu zřízených, skončí připojená ke stejnému centru IoT. Místo toho by se zařízení mělo pokusit připojit ke svému centru IoT přímo pomocí informací uložených v mezipaměti z předchozího úspěšného připojení.

Zařízení, která můžou ukládat připojovací řetězec

Zařízení, která mají možnost ukládat své připojovací řetězec po počátečním zřizování, by se měla po restartování znovu připojit přímo ke službě IoT Hub. Tento model snižuje latenci úspěšného připojení k příslušné službě IoT Hub. Existují dva možné případy:

  • IoT Hub pro připojení při restartování zařízení je stejný jako dříve připojený IoT Hub.

    Připojovací řetězec načtené z mezipaměti by měly fungovat správně a zařízení se může znovu připojit ke stejnému koncovému bodu. Pro proces zřizování není potřeba začít znovu.

  • IoT Hub pro připojení při restartování zařízení se liší od dříve připojeného IoT Hubu.

    Připojovací řetězec uložená v paměti je nepřesná. Pokus o připojení ke stejnému koncovému bodu nebude úspěšný, a proto se aktivuje mechanismus opakování připojení ke službě IoT Hub. Jakmile dojde k dosažení prahové hodnoty selhání připojení ke službě IoT Hub, mechanismus opakování automaticky aktivuje nový začátek procesu zřizování.

Zařízení, která nemůžou ukládat připojovací řetězec

Některá zařízení nemají dostatek paměti nebo nároky na ukládání do mezipaměti připojovací řetězec z předchozího úspěšného připojení ioT Hubu. Po restartování se tato zařízení musí znovu zřazit prostřednictvím DPS. K opětovné registraci použijte rozhraní API pro registraci SLUŽBY DPS. Mějte na paměti, že počet opětovných registrací za minutu je omezený na základě limitu registrace zařízení DPS.

Ukázka opětovného zřízení

Příklady kódu v této části ukazují třídu pro čtení a zápis z mezipaměti zařízení, za kterým následuje kód, který se pokusí znovu připojit zařízení ke službě IoT Hub, pokud se najde připojovací řetězec a znovu vytvoří prostřednictvím DPS, pokud není.

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace ProvisioningCache
{
  public class ProvisioningDetailsFileStorage : IProvisioningDetailCache
  {
    private string dataDirectory = null;

    public ProvisioningDetailsFileStorage()
    {
      dataDirectory = Environment.GetEnvironmentVariable("ProvisioningDetailsDataDirectory");
    }

    public ProvisioningResponse GetProvisioningDetailResponseFromCache(string registrationId)
    {
      try
        {
          var provisioningResponseFile = File.ReadAllText(Path.Combine(dataDirectory, registrationId));

          ProvisioningResponse response = JsonConvert.DeserializeObject<ProvisioningResponse>(provisioningResponseFile);

          return response;
        }
      catch (Exception ex)
      {
        return null;
      }
    }

    public void SetProvisioningDetailResponse(string registrationId, ProvisioningResponse provisioningDetails)
    {
      var provisioningDetailsJson = JsonConvert.SerializeObject(provisioningDetails);

      File.WriteAllText(Path.Combine(dataDirectory, registrationId), provisioningDetailsJson);
    }
  }
}

Kód podobný následujícímu byste mohli použít k určení postupu při opětovném připojení zařízení po určení, jestli jsou v mezipaměti informace o připojení:

IProvisioningDetailCache provisioningDetailCache = new ProvisioningDetailsFileStorage();

var provisioningDetails = provisioningDetailCache.GetProvisioningDetailResponseFromCache(registrationId);

// If no info is available in cache, go through DPS for provisioning
if(provisioningDetails == null)
{
  logger.LogInformation($"Initializing the device provisioning client...");
  using var transport = new ProvisioningTransportHandlerAmqp();
  ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(dpsEndpoint, dpsScopeId, security, transport);
  logger.LogInformation($"Initialized for registration Id {security.GetRegistrationID()}.");
  logger.LogInformation("Registering with the device provisioning service... ");

  // This method will attempt to retry in case of a transient fault
  DeviceRegistrationResult result = await registerDevice(provClient);
  provisioningDetails = new ProvisioningResponse() { iotHubHostName = result.AssignedHub, deviceId = result.DeviceId };
  provisioningDetailCache.SetProvisioningDetailResponse(registrationId, provisioningDetails);
}

// If there was IoT Hub info from previous provisioning in the cache, try connecting to the IoT Hub directly
// If trying to connect to the IoT Hub returns status 429, make sure to retry operation honoring
//   the retry-after header
// If trying to connect to the IoT Hub returns a 500-series server error, have an exponential backoff with
//   at least 5 seconds of wait-time
// For all response codes 429 and 5xx, reprovision through DPS
// Ideally, you should also support a method to manually trigger provisioning on demand
if (provisioningDetails != null)
{
  logger.LogInformation($"Device {provisioningDetails.deviceId} registered to {provisioningDetails.iotHubHostName}.");
  logger.LogInformation("Creating TPM authentication for IoT Hub...");
  IAuthenticationMethod auth = new DeviceAuthenticationWithTpm(provisioningDetails.deviceId, security);
  logger.LogInformation($"Testing the provisioned device with IoT Hub...");
  DeviceClient iotClient = DeviceClient.Create(provisioningDetails.iotHubHostName, auth, TransportType.Amqp);
  logger.LogInformation($"Registering the Method Call back for Reprovisioning...");
  await iotClient.SetMethodHandlerAsync("Reprovision",reprovisionDirectMethodCallback, iotClient);

  // Now you should start a thread into this method and do your business while the DeviceClient is still connected
  await startBackgroundWork(iotClient);
  logger.LogInformation("Wait until closed...");

  // Wait until the app unloads or is cancelled
  var cts = new CancellationTokenSource();
  AssemblyLoadContext.Default.Unloading += (ctx) => cts.Cancel();
  Console.CancelKeyPress += (sender, cpe) => cts.Cancel();

  await WhenCancelled(cts.Token);
  await iotClient.CloseAsync();
  Console.WriteLine("Finished.");
}

Důležité informace o připojení ke službě IoT Hub

Jakékoli jedno centrum IoT je omezené na 1 milion zařízení a moduly. Pokud plánujete mít více než milion zařízení, zastavte limit počtu zařízení na 1 milion na centrum a podle potřeby přidejte rozbočovače při zvýšení škálování nasazení. Další informace najdete v tématu Kvóty služby IoT Hub. Pokud máte plány na více než milion zařízení a potřebujete je podporovat v konkrétní oblasti (například v oblasti EU pro požadavky na rezidenci dat), můžete nás kontaktovat a ujistit se, že oblast, do které nasazujete, má kapacitu pro podporu vašeho aktuálního a budoucího škálování.

Při připojování ke službě IoT Hub přes DPS by zařízení měla při připojování používat následující logiku v reakci na kódy chyb:

  • Při příjmu jakékoli z 500 řad odpovědí na chyby serveru zkuste připojení zopakovat pomocí přihlašovacích údajů uložených v mezipaměti nebo výsledků volání rozhraní API pro vyhledávání stavu registrace zařízení.
  • Při příjmu 401, Unauthorized nebo 403, Forbidden provedení 404, Not Foundúplné opětovné registrace voláním rozhraní API pro registraci DPS.

Zařízení by měla být kdykoli schopná reagovat na příkaz opětovného zřízení iniciovaného uživatelem.

Pokud se zařízení od ioT Hubu odpojí, měla by se zařízení po dobu 15 až 30 minut pokusit se znovu připojit ke stejné službě IoT Hub po dobu 15 až 30 minut.

Další scénáře IoT Hubu při použití DPS:

  • Převzetí služeb při selhání ioT Hubu: Zařízení by měla dál fungovat, protože by se neměly měnit informace o připojení a logika se má opakovat, jakmile bude centrum znovu dostupné.
  • Změna služby IoT Hub: Přiřazení zařízení k jiné službě IoT Hub by se mělo provádět pomocí vlastních zásad přidělování.
  • Zkuste znovu připojení ioT Hubu: Neměli byste používat agresivní strategii opakování. Místo toho před opakováním povolte mezeru nejméně minutu.
  • Oddíly ioT Hubu: Pokud se vaše strategie zařízení hodně přikláněla k telemetrii, měli byste zvýšit počet oddílů typu zařízení-cloud.

Monitorování zařízení

Důležitou součástí celkového nasazení je monitorování celého řešení, aby se zajistilo, že systém funguje správně. Existuje několik způsobů, jak monitorovat stav služby pro rozsáhlé nasazení zařízení IoT. Při monitorování služby se osvědčily následující vzory:

  • Vytvořte aplikaci pro dotazování na každou skupinu registrací v instanci DPS, získejte celková zařízení zaregistrovaná v této skupině a pak agregujte čísla z různých skupin registrací. Toto číslo poskytuje přesný počet zařízení, která jsou aktuálně zaregistrovaná přes DPS, a lze ji použít k monitorování stavu služby.
  • Monitorujte registrace zařízení v určitém období. Monitorujte například registrační sazby pro instanci DPS za posledních pět dnů. Všimněte si, že tento přístup poskytuje pouze přibližnou hodnotu a je také omezen na časové období.

Další kroky