Selama seminggu terakhir, saya telah menjelajah ke pengembangan perangkat lunak dengan meneliti konsep aktor virtual. Saya akhirnya melihat dua kerangka kerja yang berbeda: Dapr dan Orleans.
Keduanya adalah proyek yang sangat ringkas dengan banyak kasus penggunaan yang menarik. Keduanya menggunakan ide aktor "virtual". Aktor virtual adalah unit status dan logika yang:
- Itu dapat diidentifikasi secara unik dengan ID
- Ini berulir tunggal
- Dapat dalam memori atau persisten - siklus hidupnya dikelola oleh kerangka kerja
Saya sangat menyukai ide aktor virtual dan merasa mereka sangat membantu dalam eksplorasi saya dalam membangun alat yang dapat diskalakan dan andal untuk menangani alur kerja tugas yang kompleks. Jika setiap tugas adalah peserta virtual berutas tunggal, masalah kondisi balapan akan hilang.
Karena Orleans dan Dapr sama-sama proyek Microsoft, saya membayangkan hari dalam pertarungan gaya Western Story di kafetaria Microsoft.
Orleans
Saya mulai dengan Orleans karena sudah ada di radar saya untuk sementara waktu setelah melihat beberapa video tentangnya di YouTube. Awalnya sangat buruk karena saya pikir saya akan menggunakan versi 4.x dari semua paket NuGet mereka. Namun, sama sekali tidak ada dokumentasi mereka yang berfungsi dengan paket 4.x. Saya akhirnya menggunakan versi 3.6.2.
Biji-bijian / Negara Bagian / Pengatur Waktu
Membuat butir yang melacak keadaannya sendiri dan melakukan tindakan sangat sederhana. Saya bahkan dapat mengikuti dokumentasi untuk persistensi biji-bijian dan membuat implementasi CosmosDB (SQL API) IHAADE saya sendiri.
Pengingat
Pengingat juga mudah diatur. Sampai saya mencoba mengonfigurasi ketekunan dunia nyata untuk mereka. Pada titik ini dalam penelitian saya, saya mencoba menjaga semuanya tetap rapi dan menyimpan semuanya di ComsosDB. Sayangnya, saya tidak bisa membuat paket ketekunan pengingat Orleans berfungsi sama sekali. Saya akhirnya harus beralih ke paket AzureStorage. Jadi sekarang data saya setengah di akun SQL API dan setengah di akun API tabel.
Sungai
Di situlah saya tidak berjalan dengan baik. Di Orleans, alur diidentifikasi oleh GUID dan namespace opsional. Saya yakin ada alasan bagus mengapa aliran harus diidentifikasi oleh GUID, tetapi wow, itu tidak praktis.
Saya sangat frustrasi dengan streaming karena saya dapat membuatnya dengan mudah, tetapi begitu saya berhenti dan memulai ulang proyek saya dan memicu peristiwa baru, semuanya macet.
Ini diikuti oleh informasi yang sangat berharga, karena saya membutuhkan waktu 8 jam untuk merekayasa balik kode Orleans untuk mengetahuinya:
Saat butir adalah pelanggan aliran, butir harus memanggil ResumeAsync pada handel langganan dalam metode OnActivateAsync-nya, atau Anda akan mengalami error yang tidak dikenali.
Saya juga memiliki masalah langganan yang sama yang diduplikasi, jadi saya menggunakan kode untuk menghapus semua langganan butir dan kemudian membuatnya ulang:
Orleans Gotchas / Tips Lainnya
Aliran berfungsi dengan baik dengan Azure Event Hubs (melalui AddEventHubStreams).
Jangan gunakan / atau karakter khusus lainnya dalam nama Grain dari CosmosDB SQL API!
Kesimpulan Orleans
Saya suka Orleans dan saya pikir itu memiliki potensi. Namun, ia memiliki kurva belajar yang sangat curam. Karena perjuangan panjang saya dengan streaming, saya tidak punya waktu untuk mempelajari cara kerja kluster/penyebaran.
Dapr
Saya menemukan Dapr dengan mencari alternatif untuk Orleans. Agak aneh bahwa ini juga merupakan proyek yang disponsori Microsoft. Mungkin mereka di sini untuk mengambil pendekatan bertahan hidup yang terkuat. Jika ya, saya pikir Dapr akan menjadi penyintas.
Pertama, desain berbasis REST/gRPC DPR memungkinkan aktor untuk diimplementasikan menggunakan bahasa pemrograman apa pun. Saya juga merasa sepele untuk menjalankan semuanya (peserta, status, timer, pengingat, acara) pada satu instance Redis. Selain itu, saya hanya membutuhkan sekitar sepertiga dari waktu untuk mulai menggunakan Dapr. Waktu startup yang begitu cepat adalah karena dokumentasi Dapr yang sangat baik.
Aktor / Pengatur Waktu / Pengingat
Apakah saya baru saja mengatakan bahwa dokumentasi Dapr bagus? Yah, itu ada di mana-mana, kecuali untuk contoh JavaScript. Saya menghabiskan sebagian besar waktu saya di Dapr, mencoba mencari cara memanggil metode pada aktor. Kode untuk sampel Dapr Javascript adalah sebagai berikut:
Ini jelas ketinggalan zaman. Saya harus menghabiskan banyak waktu untuk membujuk ketiga baris ini melalui eksplorasi kode uji/sampel Dapr
Contoh kode untuk mendapatkan/mengatur status memiliki masalah serupa, jadi saya membuat masalah GitHub untuk mereka.
Kecuali untuk masalah kecil itu, menyiapkan aktor adalah sepotong kue.
Mengatur pengatur waktu dan pengingat untuk pemeran saya juga sangat mudah.
Negara
Saya dapat mengonfigurasi Dapr untuk bertahan dengan Postgres dengan sangat mudah.
Satu hal yang saya perhatikan adalah bahwa mungkin ada masalah skalabilitas dengan cara pengingat disimpan. Dapr menyimpan semua pemberitahuan untuk jenis peserta tertentu dalam satu array JSON. Apa yang terjadi jika seseorang memiliki banyak pengingat?
Dapr Gotchas / Tips Lainnya
Satu hal yang saya perhatikan saat menelusuri kode untuk JavaScript SDK adalah tidak banyak komentar di basis kode sama sekali. Ini membuatnya hampir tidak mungkin untuk mengetahui sesuatu. Misalnya, dalam metode addOrUpdateState manajer status, ada parameter ketiga yang disebut updateValueFactory. Jika tidak ada komentar dalam kode, hampir tidak mungkin untuk mengetahui untuk apa panggilan balik tersebut.
Saya juga tidak yakin seberapa besar saya menyukai perintah "dapr init" yang mencoba mengatur dan menjalankan kontainer redis untuk saya. Bagaimana jika saya sudah memiliki wadah redis? Bagaimana jika saya ingin menggunakan postgres sebagai gantinya? Saya tidak dapat menemukan dokumentasi yang menjelaskan cara mengubah fitur dapr init.
Catatan untuk siapa saja yang mengalami kesulitan menggunakan pubsub. Anda harus menggunakan "dapr run" untuk menjalankan penerbit dan subscriber Anda:
Untuk aktor dan pubsub, perhatikan bahwa penting untuk menggunakan parameter --app-port untuk memberi tahu dapr port mana yang dijalankan layanan Anda. pubsub event dan actor call dikirim ke layanan Anda dari sidecar Dapr melalui panggilan http, jadi perlu tahu ke mana harus mengirimkannya:
Saya menguji "cluster" kecil yang dihosting sendiri oleh Dapr dengan meluncurkan instance pelanggan pubsub saya di dua mesin berbeda di jaringan rumah saya. Itu hanya berhasil!
Kesimpulan Dapr
Jika Anda ingin mengetahui lebih banyak ide tentang aplikasi terdistribusi atau aktor virtual, saya sarankan Anda mulai dengan Dapr. Orleans adalah perintis asli, sedangkan Dapr adalah reboot yang membawa segalanya ke tingkat berikutnya.
Tautan asli:Login hyperlink terlihat.
|