Internet of Things di Yandex.Cloud: Bagaimana Layanan Yandex IoT Core dan Yandex Cloud Functions Diatur



Pada Oktober tahun lalu, konferensi awan Yandex Yandex Scale pertama diadakan. Ia mengumumkan peluncuran banyak layanan baru, termasuk Yandex IoT Core, yang memungkinkan Anda untuk bertukar data dengan jutaan perangkat IoT.

Dalam artikel ini, saya akan berbicara tentang mengapa Yandex IoT Core diperlukan dan cara kerjanya, serta bagaimana ia dapat berinteraksi dengan layanan Yandex.Cloud lainnya. Anda akan belajar tentang arsitektur, seluk-beluk interaksi komponen dan fitur penerapan fungsi - semua ini akan membantu Anda mengoptimalkan penggunaan layanan ini.

Pertama, mari kita ingat keunggulan utama cloud publik dan PaaS - mengurangi waktu dan biaya pengembangan, serta biaya dukungan dan infrastruktur, yang juga relevan untuk proyek IoT. Tetapi ada beberapa fitur berguna yang kurang jelas yang bisa Anda dapatkan di cloud. Penskalaan dan toleransi kesalahan yang efektif ini merupakan aspek penting ketika bekerja dengan perangkat, terutama dalam proyek-proyek untuk infrastruktur informasi penting.

Penskalaan efektif adalah kemampuan untuk secara bebas menambah atau mengurangi jumlah perangkat tanpa mengalami masalah teknis dan melihat perubahan yang dapat diprediksi dalam biaya sistem setelah perubahan.

Toleransi kesalahan adalah kepercayaan bahwa layanan dirancang dan digunakan sedemikian rupa untuk memastikan kinerja setinggi mungkin bahkan dalam hal terjadi kegagalan beberapa sumber daya.

Sekarang mari kita masuk ke detailnya.

Arsitektur Script IoT


Pertama, mari kita lihat seperti apa keseluruhan arsitektur skrip IoT.



Dua bagian besar dapat dibedakan di dalamnya:

  • Yang pertama adalah pengiriman data ke penyimpanan dan pengiriman perintah ke perangkat. Ketika Anda membangun sistem IoT, tugas ini harus diselesaikan dalam hal apa pun, apa pun proyek yang Anda lakukan.
  • Yang kedua bekerja dengan data yang diterima. Semuanya mirip dengan proyek lain berdasarkan analisis dan visualisasi set data. Anda memiliki repositori dengan larik informasi awal, yang dapat digunakan untuk mewujudkan tugas Anda.

Bagian pertama kira-kira sama di semua sistem IoT: ia dibangun berdasarkan prinsip umum dan cocok dengan skenario umum yang cocok untuk sebagian besar sistem IoT.

Bagian kedua hampir selalu unik dalam hal fungsi yang dilakukan, meskipun dibangun pada komponen standar. Pada saat yang sama, tanpa sistem yang berkualitas tinggi, toleran terhadap kesalahan, dan dapat diskalakan untuk berinteraksi dengan perangkat keras, efektivitas bagian analitis arsitektur berkurang hingga hampir nol, karena tidak ada yang perlu dianalisis.

Itulah sebabnya tim Yandex.Cloud pertama-tama memutuskan untuk berkonsentrasi membangun ekosistem layanan yang nyaman yang akan dengan cepat, efisien dan andal mengirimkan data dari perangkat ke penyimpanan, dan sebaliknya - mengirim perintah ke perangkat.



Untuk mengatasi masalah ini, kami sedang mengerjakan fungsionalitas dan integrasi Yandex IoT Core, Fungsi Yandex, dan layanan penyimpanan data di Cloud:

  • Layanan Yandex IoT Core adalah broker MQTT scalable gagal-aman multi-penyewa dengan serangkaian fungsi berguna tambahan.
  • Layanan Yandex Cloud Functions adalah perwakilan dari arah tanpa server yang menjanjikan dan memungkinkan Anda untuk menjalankan kode Anda sebagai fungsi dalam lingkungan yang aman, toleran terhadap kesalahan, dan secara otomatis dapat diskalakan tanpa membuat dan memelihara mesin virtual.
  • Penyimpanan Objek Yandex adalah penyimpanan efektif array data yang besar dan sangat cocok untuk catatan arsip "historis".
  • , , Yandex Managed Service for ClickHouse, «» . «» , , , .

Jika layanan penyimpanan dan analisis data adalah layanan "tujuan umum" yang telah banyak ditulis, maka Yandex IoT Core dan interaksinya dengan Fungsi Yandex Cloud biasanya menimbulkan banyak pertanyaan, terutama bagi orang-orang yang baru mulai memahami Internet benda dan teknologi cloud. Dan karena layanan ini memberikan toleransi kesalahan dan penskalaan pekerjaan dengan perangkat, pertama-tama kita akan melihat apa yang mereka miliki di bawah tenda.

Bagaimana Yandex IoT Core bekerja


Yandex IoT Core adalah layanan platform khusus untuk pertukaran data dua arah antara cloud dan perangkat yang menjalankan protokol MQTT. Bahkan, protokol ini telah menjadi standar untuk mentransfer data ke IoT. Ini menggunakan konsep antrian bernama (topik), di mana, di satu sisi, Anda dapat menulis data, dan di sisi lain, menerimanya secara tidak sinkron dengan berlangganan acara antrian ini.

Layanan Yandex IoT Core adalah multi-tenant, yang berarti satu entitas tunggal yang dapat diakses oleh semua pengguna. Artinya, semua perangkat dan semua pengguna berinteraksi dengan instance layanan yang sama.

Hal ini memungkinkan, di satu sisi, untuk memastikan keseragaman pekerjaan untuk semua pengguna, di sisi lain, penskalaan dan toleransi kesalahan yang efektif, untuk menjaga koneksi dengan jumlah perangkat yang tidak terbatas dan memproses data dalam jumlah yang tidak terbatas baik dalam volume maupun kecepatan.

Oleh karena itu, layanan harus memiliki mekanisme redundansi dan kemampuan untuk secara fleksibel mengelola sumber daya yang digunakan - untuk menanggapi perubahan beban.

Selain itu, multi-tenancy membutuhkan logika khusus untuk berbagi hak akses ke topik MQTT.

Mari kita lihat bagaimana ini diterapkan.

Seperti banyak layanan Yandex.Cloud lainnya, Yandex IoT Core secara logis dibagi menjadi dua bagian - Control Plane dan Data Plane:



Data Plane bertanggung jawab atas logika operasi di bawah protokol MQTT, dan Control Plane bertanggung jawab untuk membatasi hak akses ke topik tertentu dan menggunakan entitas logis Registry and Device untuk ini.



Setiap pengguna Yandex.Cloud dapat memiliki beberapa pendaftar, yang masing-masing dapat berisi subset perangkatnya sendiri.

Akses ke topik disediakan sebagai berikut:



Perangkat hanya dapat mengirim data ke topik acara dan topik acara registri:

$devices/<Device1 ID>/events
$registries/<Registry ID>/events

dan berlangganan pesan hanya dari topik perintah Anda dan topik perintah registri:

$devices/<Device1 ID>/commands
$registries/<Registry ID>/commands

Registri dapat mengirim data ke semua topik perintah perangkat dan ke topik perintah registri:

$devices/<Device1 ID>/commands
$devices/<Device2 ID>/commands
$registries/<Registry ID>/commands

dan berlangganan pesan dari semua topik acara perangkat dan topik acara registri:

$devices/<Device1 ID>/events
$devices/<Device2 ID>/events
$registries/<Registry ID>/events

Untuk bekerja dengan semua entitas yang dijelaskan di atas, Data Plane memiliki protokol gRPC dan protokol REST, berdasarkan akses yang diimplementasikan melalui konsol GUI Yandex.Cloud dan antarmuka baris perintah CLI.

Adapun Data Plane, mendukung protokol MQTT versi 3.1.1. Namun, ada beberapa fitur:

  1. Saat menghubungkan, pastikan untuk menggunakan TLS.
  2. Hanya koneksi TCP yang didukung. WebSocket belum tersedia.
  3. Otorisasi tersedia baik melalui login dan kata sandi (di mana login adalah perangkat atau ID registri, dan kata sandi ditetapkan oleh pengguna), dan menggunakan sertifikat.
  4. Bendera Pertahankan tidak didukung, saat menggunakan mana broker MQTT menyimpan pesan yang ditandai dengan bendera tersebut dan mengirimkannya saat berikutnya Anda berlangganan topik tersebut.
  5. Persistent Session tidak didukung, di mana broker MQTT menyimpan informasi tentang klien (perangkat atau registri) untuk memfasilitasi koneksi ulang.
  6. Dengan berlangganan dan menerbitkan, hanya dua tingkat layanan pertama yang didukung:
    1. QoS0 - Paling banyak sekali. Tidak ada jaminan pengiriman, tetapi tidak ada pengiriman ulang dari pesan yang sama.
    2. QoS1 - Setidaknya satu kali. Pengiriman dijamin, tetapi ada kemungkinan menerima kembali pesan yang sama.

Untuk menyederhanakan koneksi ke Yandex IoT Core, kami secara teratur menambahkan contoh baru untuk berbagai platform dan bahasa ke repositori kami di GitHub, dan juga menjelaskan skrip dalam dokumentasi.

Arsitektur layanan terlihat seperti ini:



Logika bisnis dari layanan mencakup empat bagian:

  1. Device management — . Control Plane.
  2. MQTT Broker — MQTT-. Data Plane.
  3. Triggers — Yandex Cloud Functions. Data Plane.
  4. Shards — MQTT- . Data Plane.

Semua interaksi dengan "dunia luar" melewati load balancers. Selain itu, sesuai dengan filosofi dogfooding, Yandex Load Balancer digunakan, yang tersedia untuk semua pengguna Yandex.Cloud.

Setiap bagian dari logika bisnis terdiri dari beberapa set tiga mesin virtual - satu di setiap zona ketersediaan (dalam Skema A, B, dan C). Mesin virtual persis sama dengan semua pengguna Yandex.Cloud. Ketika beban meningkat, penskalaan terjadi dengan bantuan seluruh rangkaian - tiga mesin ditambahkan sekaligus dalam kerangka satu bagian dari logika bisnis. Ini berarti bahwa jika satu set tiga mesin Broker MQTT tidak mengatasi beban, maka seperangkat tiga mesin Broker MQTT ditambahkan, sedangkan konfigurasi bagian lain dari logika bisnis tetap sama.

Dan hanya Logbroker yang tidak tersedia untuk umum. Ini adalah layanan untuk operasi gagal-aman yang efisien dengan aliran data. Ini didasarkan pada Apache Kafka, tetapi memiliki banyak fungsi berguna lainnya: ia mengimplementasikan proses pemulihan bencana (termasuk semantik sekali ketika Anda memiliki jaminan pengiriman pesan tanpa duplikasi) dan proses layanan (seperti replikasi lintas-pusat, distribusi data ke cluster perhitungan), dan juga memiliki mekanisme untuk distribusi data non-duplikat yang seragam antara pelanggan aliran - semacam penyeimbang beban.

Fitur manajemen perangkat di Control Plane dijelaskan di atas. Tetapi dengan Data Plane, semuanya jauh lebih menarik.

Setiap instance MQTT Broker bekerja secara independen dan tidak tahu apa-apa tentang instance lain. Semua data yang diterima (dipublikasikan dari pelanggan) dikirim oleh broker ke Logbroker, dari mana mereka diambil oleh Shards dan Pemicu. Dan di dalam pecahan itulah sinkronisasi terjadi di antara beberapa broker. Shards tahu tentang semua klien MQTT dan distribusi langganan mereka (berlangganan) di seluruh contoh broker MQTT dan menentukan ke mana harus mengirim data yang diterima.

Misalnya, klien MQTT A berlangganan ke topik dari broker A, dan klien MQTT B berlangganan ke topik yang sama dari broker B. Jika klien MQTT C mempublikasikan topik yang sama, tetapi ke broker C, maka shard mentransfer data dari broker C ke broker A dan B, sebagai akibatnya data akan diterima oleh klien MQTT A dan klien MQTT B.



Bagian terakhir dari logika bisnis, Pemicu, juga menerima semua data yang diterima dari klien MQTT dan, jika ini dikonfigurasikan oleh pengguna, transfer ke pemicu layanan Fungsi Cloud Yandex.

Seperti yang Anda lihat, Yandex IoT Core memiliki arsitektur dan logika kerja yang agak rumit, yang sulit untuk diulang pada instalasi lokal. Hal ini memungkinkannya untuk menahan kehilangan bahkan dua dari tiga zona ketersediaan, dan bekerja dalam jumlah koneksi yang tidak terbatas dan volume data yang tidak terbatas.

Terlebih lagi, semua logika ini disembunyikan dari pengguna “under the hood”, tetapi dari luar semuanya terlihat sangat sederhana - seolah-olah Anda bekerja dengan satu broker MQTT.

Fungsi Pemicu dan Cloud Yandex


Yandex Cloud Functions adalah perwakilan dari apa yang disebut layanan "serverless" (serverless) di Yandex.Cloud. Esensi utama dari layanan tersebut adalah bahwa pengguna tidak menghabiskan waktunya untuk mengatur, menyebarkan, dan meningkatkan skala lingkungan untuk mengeksekusi kode, tetapi hanya berurusan dengan hal yang paling berharga baginya - menulis kode itu sendiri yang melakukan tugas yang diperlukan. Dalam hal fungsi, ini disebut kode statik atom yang dapat dipicu oleh beberapa peristiwa. "Atomic" dan "stateless" berarti bahwa kode ini harus melakukan beberapa tugas yang relatif kecil tetapi tidak terpisahkan, sementara kode tersebut tidak boleh menggunakan variabel apa pun untuk menyimpan nilai di antara panggilan.

Ada beberapa cara untuk memanggil fungsi: panggilan HTTP langsung, panggilan waktu (cron), atau langganan acara. Sebagai yang terakhir, layanan sudah mendukung berlangganan antrian pesan (Antrian Pesan Yandex), peristiwa yang dihasilkan oleh layanan Penyimpanan Objek, dan (paling berharga untuk skenario IoT) berlangganan pesan di Yandex IoT Core.

Terlepas dari kenyataan bahwa Anda dapat bekerja dengan Yandex IoT Core menggunakan klien yang kompatibel dengan MQTT, Yandex Cloud Functions adalah salah satu cara paling optimal dan nyaman untuk menerima dan memproses data. Alasannya sangat sederhana. Suatu fungsi dapat dipanggil pada setiap pesan yang masuk dari perangkat apa pun, dan fungsi tersebut akan dieksekusi secara paralel satu sama lain (karena pendekatan atomitas dan stateless), dan jumlah panggilan mereka secara alami akan berubah karena jumlah pesan yang masuk dari perangkat berubah. Dengan demikian, pengguna dapat sepenuhnya mengabaikan masalah pengaturan infrastruktur dan, lebih lanjut, tidak seperti mesin virtual yang sama, pembayaran hanya akan terjadi untuk pekerjaan yang sebenarnya dilakukan.Ini akan memungkinkan Anda untuk menghemat secara signifikan pada beban rendah dan mendapatkan biaya yang jelas dan dapat diprediksi dengan pertumbuhan.

Mekanisme untuk memanggil fungsi pada acara (berlangganan acara) disebut pemicu (Pemicu). Esensinya digambarkan dalam diagram:



Layanan yang menghasilkan acara untuk fungsi panggilan menempatkan mereka dalam antrian di Logbroker. Dalam kasus Yandex IoT Core, Pemicu dari Data Plane melakukan ini. Selanjutnya, peristiwa ini diambil oleh preprocessor, yang mencari catatan dalam database untuk acara ini yang menunjukkan fungsi yang akan dipanggil. Jika entri seperti itu ditemukan, preprocessor meletakkan informasi tentang panggilan fungsi (ID fungsi dan parameter panggilan) dalam antrian dalam layanan Antrian Pesan Yandex, dari mana pawang panggilan mengambilnya. Pawang, pada gilirannya, mengirimkan permintaan HTTP untuk memanggil fungsi ke layanan Fungsi Yandex Cloud.

Pada saat yang sama, sekali lagi, sesuai dengan filosofi dogfooding, layanan Antrian Pesan Yandex, dapat diakses oleh semua pengguna, digunakan, dan fungsi-fungsinya dipanggil dengan cara yang persis sama dengan pengguna lain yang dapat memanggil fungsi mereka.

Katakanlah beberapa kata tentang Antrian Pesan Yandex. Terlepas dari kenyataan bahwa ini, seperti Logbroker, adalah layanan antrian, ada satu perbedaan signifikan di antara mereka. Saat memproses pesan dari antrian, pawang menginformasikan antrian yang telah selesai dan pesan tersebut dapat dihapus. Ini adalah mekanisme keandalan penting dalam layanan seperti itu, tetapi mempersulit logika bekerja dengan pesan.

Antrian Pesan Yandex memungkinkan Anda untuk "memparalelkan" pemrosesan setiap pesan dalam antrian. Dengan kata lain, pesan dari antrian yang sedang diproses tidak memblokir kemungkinan "utas" lain untuk mengambil acara berikutnya dari antrian untuk diproses. Ini disebut konkurensi tingkat pesan.

Dan LogBroker beroperasi pada grup pesan, dan hingga seluruh grup diproses, grup berikutnya tidak dapat diambil untuk diproses. Pendekatan ini disebut concurrency di tingkat partisi.

Dan justru penggunaan Antrian Pesan Yandex yang memungkinkan Anda memproses dengan cepat dan efisien secara paralel banyak permintaan untuk memanggil fungsi untuk acara dari layanan tertentu.

Terlepas dari kenyataan bahwa pemicu adalah unit independen yang terpisah, mereka merupakan bagian dari layanan Fungsi Yandex Cloud. Kami hanya harus mencari tahu persis bagaimana fungsi dipanggil.



Semua permintaan untuk memanggil fungsi (baik eksternal maupun internal) masuk ke load balancer, yang mendistribusikannya ke router di zona akses berbeda (AZ), beberapa bagian dikerahkan di setiap zona. Setelah menerima permintaan, router pertama-tama pergi ke layanan Identity and Access manager (IAM) untuk memastikan bahwa sumber permintaan memiliki hak untuk memanggil fungsi ini. Dia kemudian beralih ke penjadwal dan meminta pekerja mana yang menjalankan fungsi. Worker adalah mesin virtual dengan runtime yang disesuaikan dari fungsi yang terisolasi. Lebih lanjut, router, setelah menerima dari penjadwal alamat pekerja yang akan menjalankan fungsi, mengirimkan perintah kepada pekerja ini untuk memulai fungsi dengan parameter tertentu.

Dari mana asal pekerja? Di sinilah semua keajaiban tanpa server terjadi. Penjadwal, menganalisis beban (jumlah dan durasi fungsi), mengelola (memulai dan menghentikan) mesin virtual dengan runtime tertentu. NodeJS dan Python sekarang didukung. Dan di sini satu parameter sangat penting - kecepatan fungsi peluncuran. Tim pengembangan layanan telah melakukan pekerjaan dengan baik, dan sekarang mesin virtual dimulai dalam maksimum 250 ms, sambil menggunakan lingkungan yang paling aman untuk mengisolasi fungsi satu sama lain - virtualisasi QEMU, yang menjalankan semua Yandex. Pada saat yang sama, jika sudah ada pekerja yang bekerja untuk permintaan yang masuk, fungsi dimulai hampir secara instan.
Dan, sesuai dengan pendekatan dogfooding yang sama, Load Balancer menggunakan layanan publik yang dapat diakses oleh semua pengguna, dan pekerja, penjadwal dan router adalah mesin virtual biasa, sama seperti semua pengguna.

Dengan demikian, toleransi kesalahan layanan diimplementasikan pada tingkat penyeimbang beban dan redundansi komponen sistem utama (router dan penjadwal), dan penskalaan terjadi karena penyebaran atau pengurangan jumlah pekerja. Selain itu, setiap zona aksesibilitas bekerja secara independen, yang memungkinkan untuk selamat dari kehilangan bahkan dua dari tiga zona.

tautan yang bermanfaat


Sebagai kesimpulan, saya ingin memberikan beberapa tautan yang memungkinkan Anda mempelajari layanan secara lebih rinci:


All Articles