Aracılığıyla paylaş


Büyük ölçekli IoT cihaz dağıtımları için en iyi uygulamalar

IoT çözümünü milyonlarca cihaza ölçeklendirmek zor olabilir. Büyük ölçekli çözümlerin genellikle hizmet ve abonelik sınırlarına uygun olarak tasarlanması gerekir. Müşteriler Azure IoT Cihaz Sağlama Hizmeti'ni kullandığında, bunu IoT Hub ve Azure IoT cihaz SDK'ları gibi diğer Azure IoT platform hizmetleri ve bileşenleriyle birlikte kullanır. Bu makalede, bu hizmetlerden yararlanmak ve dağıtımlarınızın ölçeğini genişletmek için tasarımınıza ekleyebileceğiniz en iyi yöntemler, desenler ve örnek kod açıklanmaktadır. Projenin tasarım aşamasından başlayarak bu desenleri ve uygulamaları izleyerek IoT cihazlarınızın performansını en üst düzeye çıkarabilirsiniz.

Yeni cihazlar sağlama

İlk kez sağlama, ioT çözümünün bir parçası olarak ilk kez cihaz ekleme işlemidir. Büyük ölçekli dağıtımlarla çalışırken, aynı anda bağlanmaya çalışan tüm cihazların neden olduğu aşırı yükleme durumlarını önlemek için sağlama işlemini zamanlamak önemlidir.

Aşamalı sağlama zamanlaması kullanma

Cihazların milyonlar ölçeğinde dağıtılması için, tüm cihazların bir kerede kaydedilmesi, azaltma (HTTP yanıt kodu 429, Too Many Requests) nedeniyle DPS örneğinin aşırı yüklenmesine ve cihazlarınızın kaydedilememesine neden olabilir. Bu tür azaltmayı önlemek için cihazlar için aşamalı bir kayıt zamanlaması kullanın. Cihaz kaydı toplu iş boyutlarınızı DPS kotalarına ve sınırlarına uygun olarak yapılandırın. Örneğin, kayıt hızı dakikada 200 cihazsa, ekleme için toplu iş boyutu toplu iş başına 200 cihaz olabilir.

yeniden deneme işlemleri

Hizmetin meşgul olması nedeniyle geçici hatalar oluşursa, yeniden deneme mantığı cihazların IoT buluta başarıyla bağlanmasını sağlar. Ancak, çok sayıda yeniden deneme, kapasitesine yakın veya kapasitede çalışan meşgul bir hizmeti daha da düşürebilir. Tüm Azure hizmetlerinde olduğu gibi üstel geri alma ile akıllı bir yeniden deneme mekanizması uygulamanız gerekir. Farklı yeniden deneme desenleri hakkında daha fazla bilgi, yeniden deneme tasarım deseninde ve geçici hata işlemede bulunabilir.

Azaltıldığında dağıtımı hemen yeniden denemek yerine üst bilgide belirtilen süreye retry-after kadar bekleyin. Hizmette yeniden deneme üst bilgisi yoksa, bu algoritma daha sorunsuz bir cihaz ekleme deneyimi elde etmek için yardımcı olabilir:

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

Bu mantıkla, cihazlar ile max_retry_delay_msecarasında min_retry_delay_msec rastgele bir süre için yeniden bağlanmayı geciktiriyor. Yeniden deneme gecikmesi üst sınırı aşağıdaki değişkenlerle hesaplanır:

  • <load> 0 değerlerine > sahip yapılandırılabilir bir faktördür ve bu da yükün ortalama yük süresinde saniyedeki bağlantı sayısıyla çarpılacağını gösterir
  • <T>cihazların soğuk önyüklemesi için mutlak minimum süredir (toplam cihaz sayısı ve cps saniyedeki bağlantı sayısı için hizmet sınırı olarak T = N / cps N hesaplanır).

Yeniden deneme işlemlerinin zamanlaması hakkında daha fazla bilgi için bkz . Yeniden deneme zamanlaması.

Cihazları yeniden hazırlama

Yeniden sağlama, daha önce başarıyla bağlandıktan sonra bir cihazın IoT Hub'ına sağlanması gereken işlemdir. Bir cihazın IoT Hub'a yeniden bağlanmasına ihtiyaç duymanın birçok nedeni olabilir, örneğin:

  • Güç kesintisi, ağ bağlantısı kaybı, coğrafi konum değiştirme, üretici yazılımı güncelleştirmeleri, fabrika sıfırlaması veya sertifika anahtarı döndürme nedeniyle bir cihaz yeniden başlatılabilir.
  • Planlanmamış bir IoT Hub kesintisi nedeniyle IoT Hub örneği kullanılamıyor olabilir.

Bir cihaz her yeniden başlatıldığında sağlama işleminden geçmeniz gerekmez. Yeniden sağlanan cihazların çoğu aynı IoT hub'ına bağlanır. Bunun yerine, bir cihaz önceki başarılı bir bağlantıdan önbelleğe alınan bilgileri kullanarak ioT hub'ına doğrudan bağlanmayı denemelidir.

bağlantı dizesi depolayan cihazlar

İlk sağlamadan sonra bağlantı dizesi depolama özelliğine sahip cihazların bunu yapması ve yeniden başlatma sonrasında doğrudan IoT Hub'a yeniden bağlanmayı denemesi gerekir. Bu düzen, uygun IoT Hub'a başarıyla bağlanma gecikme süresini azaltır. Burada iki olası durum vardır:

  • Cihaz yeniden başlatıldığında bağlanacak IoT Hub, daha önce bağlı olan IoT Hub ile aynıdır.

    Önbellekten alınan bağlantı dizesi sorunsuz çalışmalıdır ve cihaz aynı uç noktaya yeniden bağlanabilir. Sağlama işlemi için yeni bir başlangıç yapmanız gerekmez.

  • Cihaz yeniden başlatıldığında bağlanacak IoT Hub, daha önce bağlı olan IoT Hub'dan farklıdır.

    Bellekte depolanan bağlantı dizesi yanlıştır. Aynı uç noktaya bağlanma girişimi başarılı olmayacak ve bu nedenle IoT Hub bağlantısı için yeniden deneme mekanizması tetikleniyor. IoT Hub bağlantı hatası eşiğine ulaşıldıktan sonra, yeniden deneme mekanizması otomatik olarak sağlama işlemine yeni bir başlangıç tetikler.

bağlantı dizesi depolayan cihazlar

Bazı cihazlarda geçmiş başarılı bir IoT Hub bağlantısından bağlantı dizesi önbelleğe alınmasını sağlamak için yeterli alan veya bellek yoktur. Bu cihazların yeniden başlatıldıktan sonra DPS aracılığıyla yeniden sağlaması gerekir. Yeniden kaydetmek için DPS kayıt API'sini kullanın. Dakika başına yeniden kayıt sayısının DPS cihaz kayıt sınırına göre sınırlı olduğunu unutmayın.

Örneği yeniden sağlama

Bu bölümdeki kod örneklerinde, cihaz önbelleğinde okuma ve yazma için bir sınıf, ardından bir bağlantı dizesi bulunursa cihazı IoT Hub'a yeniden bağlamaya çalışan ve yoksa DPS aracılığıyla yeniden sağlamayı deneyen kod gösterilir.

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);
    }
  }
}

Önbellekte bağlantı bilgisi olup olmadığını belirledikten sonra cihazı yeniden bağlama işlemine nasıl devam edilebileceğini belirlemek için aşağıdakine benzer bir kod kullanabilirsiniz:

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.");
}

IoT Hub bağlantısıyla ilgili dikkat edilmesi gerekenler

Tek bir IoT hub'ı 1 milyon cihaz ve modülle sınırlıdır. Bir milyondan fazla cihaz olmasını planlıyorsanız, dağıtımınızın ölçeğini artırırken cihaz sayısını hub başına 1 milyona ayarlayın ve gerektiğinde hub ekleyin. Daha fazla bilgi için bkz . IoT Hub kotaları. Bir milyondan fazla cihaz için planınız varsa ve bunları belirli bir bölgede (örneğin, veri yerleşimi gereksinimleri için bir AB bölgesinde) desteklemeniz gerekiyorsa, dağıttığınız bölgenin geçerli ve gelecekteki ölçeğinizi destekleyecek kapasiteye sahip olduğundan emin olmak için bizimle iletişime geçebilirsiniz.

DPS aracılığıyla IoT Hub'a bağlanırken, cihazlar bağlanırken hata kodlarına yanıt olarak aşağıdaki mantığı kullanmalıdır:

  • 500 serisi sunucu hatası yanıtlarından herhangi birini alırken, önbelleğe alınmış kimlik bilgilerini veya Cihaz Kaydı Durumu Arama API'si çağrısının sonuçlarını kullanarak bağlantıyı yeniden deneyin.
  • veya alırken401, Unauthorized, 403, Forbidden 404, Not FoundDPS kayıt API'sini çağırarak tam yeniden kayıt gerçekleştirin.

Cihazların herhangi bir zamanda kullanıcı tarafından başlatılan yeniden sağlama komutuna yanıt verebilmeleri gerekir.

Cihazların IoT Hub bağlantısı kesilirse, cihazların DPS'ye geri dönmeden önce 15-30 dakika boyunca doğrudan aynı IoT Hub'a yeniden bağlanmayı denemesi gerekir.

DPS kullanırken diğer IoT Hub senaryoları:

  • IoT Hub yük devretmesi: Bağlantı bilgilerinin değişmemesi gerektiği ve hub yeniden kullanılabilir olduğunda bağlantıyı yeniden denemek için mantık sağlandığından cihazlar çalışmaya devam etmelidir.
  • IoT Hub değişikliği: Cihazları farklı bir IoT Hub'a atama işlemi, özel ayırma ilkesi kullanılarak yapılmalıdır.
  • IoT Hub bağlantısını yeniden deneyin: Agresif bir yeniden deneme stratejisi kullanmamalısınız. Bunun yerine, yeniden denemeden en az bir dakika önce boşluğa izin verin.
  • IoT Hub bölümleri: Cihaz stratejiniz büyük ölçüde telemetriye dayalıysa cihazdan buluta bölüm sayısı artırılmalıdır.

Cihazları izleme

Genel dağıtımın önemli bir parçası, sistemin uygun şekilde performans sergilediğinden emin olmak için çözümü uçtan uca izlemektir. IoT cihazlarının büyük ölçekli dağıtımı için bir hizmetin durumunu izlemenin çeşitli yolları vardır. Aşağıdaki desenlerin hizmetin izlenmesinde etkili olduğu kanıtlanmıştır:

  • BIR DPS örneğindeki her kayıt grubunu sorgulamak, bu gruba kayıtlı toplam cihazları almak ve ardından çeşitli kayıt gruplarındaki sayıları toplamak için bir uygulama oluşturun. Bu sayı, şu anda DPS aracılığıyla kayıtlı olan cihazların tam sayısını sağlar ve hizmetin durumunu izlemek için kullanılabilir.
  • Belirli bir süre boyunca cihaz kayıtlarını izleyin. Örneğin, bir DPS örneğinin kayıt oranlarını önceki beş gün içinde izleyin. Bu yaklaşımın yalnızca yaklaşık bir rakam sağladığını ve bir zaman aralığına da eşlendiğini unutmayın.

Sonraki adımlar