Kelola konektivitas dan perpesanan yang andal dengan menggunakan SDK perangkat Azure IoT Hub

Artikel ini memberikan panduan tingkat tinggi untuk membantu Anda mendesain aplikasi perangkat yang lebih tangguh. Hal ini menunjukkan kepada Anda cara memanfaatkan konektivitas dan fitur perpesanan yang andal di SDK perangkat Azure IoT. Tujuan dari panduan ini adalah untuk membantu Anda mengelola skenario berikut:

  • Memperbaiki koneksi jaringan yang terputus

  • Beralih di antara koneksi jaringan yang berbeda

  • Menghubungkan kembali karena kesalahan koneksi sementara layanan

Detail implementasi dapat bervariasi menurut bahasa. Untuk informasi selengkapnya, lihat dokumentasi API atau SDK tertentu:

Merancang untuk ketahanan

Perangkat IoT sering mengandalkan koneksi jaringan yang tidak berkelanjutan atau tidak stabil (misalnya, GSM atau satelit). Kesalahan dapat terjadi saat perangkat berinteraksi dengan layanan berbasis cloud karena ketersediaan layanan yang terputus-putus dan tingkat infrastruktur atau kesalahan sementara. Aplikasi yang berjalan pada perangkat harus mengelola mekanisme koneksi, koneksi ulang, dan logika coba lagi untuk mengirim dan menerima pesan. Selain itu, persyaratan strategi coba ulang sangat bergantung pada skenario, konteks, dan kemampuan IoT perangkat.

SDK perangkat Azure IoT Hub bertujuan untuk menyederhanakan koneksi dan komunikasi dari cloud-to-device dan device-to-cloud. SDK ini menyediakan cara yang andal untuk terhubung ke Azure IoT Hub dan serangkaian opsi lengkap untuk mengirim dan menerima pesan. Pengembang juga dapat memodifikasi implementasi yang ada untuk menyesuaikan strategi coba lagi yang lebih baik untuk skenario tertentu.

Fitur SDK yang relevan mendukung konektivitas dan perpesanan yang andal dibahas di bagian berikut.

Koneksi dan coba lagi

Bagian ini memberikan gambaran umum tentang koneksi ulang dan pola coba lagi yang tersedia saat mengelola koneksi. Hal ini merinci panduan implementasi untuk menggunakan kebijakan coba lagi yang berbeda di aplikasi perangkat Anda dan mencantumkan API yang relevan dari SDK perangkat.

Pola kesalahan

Kegagalan koneksi dapat terjadi di berbagai tingkatan:

  • Kesalahan jaringan: soket terputus dan kesalahan resolusi nama

  • Kesalahan tingkat protokol untuk transport HTTP, AMQP, dan MQTT: tautan terlepas atau sesi kedaluwarsa

  • Kesalahan tingkat aplikasi yang disebabkan oleh kesalahan lokal: kredensial atau perilaku layanan yang tidak valid (misalnya, melebihi kuota atau pembatasan)

SDK perangkat mendeteksi kesalahan pada ketiga level. Kesalahan terkait OS dan kesalahan perangkat keras tidak terdeteksi dan ditangani oleh SDK perangkat. Desain SDK didasarkan pada Panduan Penanganan Kesalahan Sementara dari Azure Architecture Center.

Mencoba lagi pola

Langkah-langkah berikut menjelaskan proses coba lagi ketika koneksi terdeteksi:

  1. SDK mendeteksi kesalahan tersebut dan kesalahan lain yang terkait dalam jaringan, protokol, atau aplikasi.

  2. SDK menggunakan filter kesalahan untuk menentukan jenis kesalahan dan memutuskan apakah coba lagi diperlukan.

  3. Jika SDK mengidentifikasi kesalahan yang tidak dapat dipulihkan, operasi seperti koneksi, pengiriman, dan penerimaan akan dihentikan. SDK memberi tahu pengguna. Contoh kesalahan yang tidak dapat dipulihkan termasuk kesalahan autentikasi dan kesalahan titik akhir yang buruk.

  4. Jika SDK mengidentifikasi kesalahan yang dapat dipulihkan, SDK akan mencoba lagi sesuai dengan kebijakan coba lagi yang ditentukan hingga batas waktu yang ditentukan berlalu. Perhatikan bahwa SDK menggunakan kebijakan coba lagi Back-off eksponensial dengan jitter secara default.

  5. Saat batas waktu yang ditentukan berakhir, SDK berhenti mencoba menghubungkan atau mengirim. Hal ini memberi tahu pengguna.

  6. SDK memungkinkan pengguna untuk melampirkan panggilan balik untuk menerima perubahan status koneksi.

SDK menyediakan tiga kebijakan coba lagi:

  • Back-off eksponensial dengan jitter: Kebijakan coba lagi default ini cenderung agresif di awal dan melambat seiring waktu hingga mencapai penundaan maksimum. Desainnya didasarkan pada Panduan coba lagi dari Azure Architecture Center.

  • Coba ulang khusus: Untuk beberapa bahasa SDK, Anda dapat merancang kebijakan coba lagi khusus yang lebih cocok untuk skenario Anda dan kemudian memasukkannya ke dalam RetryPolicy. Coba lagi kustom tidak tersedia di C SDK, dan saat ini tidak didukung di Python SDK. Python SDK terhubung kembali sesuai kebutuhan.

  • No retry: Anda dapat menyetel kebijakan coba lagi ke "no retry", yang menonaktifkan logika coba lagi. SDK mencoba untuk terhubung sekali dan mengirim pesan sekali, dengan asumsi koneksi telah dibuat. Kebijakan ini biasanya digunakan dalam skenario dengan bandwidth atau pertimbangan biaya. Jika Anda memilih opsi ini, pesan yang gagal terkirim akan hilang dan tidak dapat dipulihkan.

API Coba lagi

SDK Metode SetRetryPolicy Implementasi Kebijakan Panduan implementasi
C/iOS IOTHUB_CLIENT_RESULT IoTHubClient_SetRetryPolicy Default: IOTHUB_CLIENT_RETRY_EXPONENTIAL_BACKOFF
Custom: Gunakan retryPolicy yang tersedia
No retry:IOTHUB_CLIENT_RETRY_NONE
Implementasi C/iOS
Java SetRetryPolicy Default: Kelas ExponentialBackoffWithJitter
Kustom: mengimplementasi tampilan RetryPolicy
No retry:NoRetry class
Implementasi Java
.NET DeviceClient.SetRetryPolicy Default: kelas ExponentialBackoff
Custom: implementasi tampilan IRetryPolicy
No retry:NoRetry class
Implementasi C#
Node setRetryPolicy Default: Kelas ExponentialBackoffWithJitter Implementasi node
Python Saat ini tidak didukung Saat ini tidak didukung Saat ini tidak didukung

Sampel kode berikut mengilustrasikan flow ini:

.NET panduan implementasi

Contoh kode berikut menunjukkan cara menentukan dan menetapkan kebijakan coba lagi default:

// define/set default retry policy
IRetryPolicy retryPolicy = new ExponentialBackoff(int.MaxValue, TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(10), TimeSpan.FromMilliseconds(100));
SetRetryPolicy(retryPolicy);

Untuk menghindari penggunaan CPU yang tinggi, coba lagi dibatasi jika kode langsung gagal. Misalnya, ketika tidak ada jaringan atau rute ke tujuan. Waktu minimum untuk melakukan coba lagi berikutnya adalah 1 detik.

Jika layanan merespons dengan kesalahan throttling, kebijakan coba lagi berbeda dan tidak dapat diubah melalui API publik:

// throttled retry policy
IRetryPolicy retryPolicy = new ExponentialBackoff(RetryCount, TimeSpan.FromSeconds(10), 
  TimeSpan.FromSeconds(60), TimeSpan.FromSeconds(5)); SetRetryPolicy(retryPolicy);

Mekanisme coba lagi berhenti setelah DefaultOperationTimeoutInMilliseconds, yang saat ini disetel pada 4 menit.

Panduan implementasi bahasa lain

Untuk contoh kode dalam bahasa lain, tinjau dokumen implementasi berikut. Repositori berisi contoh yang menunjukkan penggunaan API kebijakan coba lagi.

Langkah berikutnya