Distributed Computing Series: Kenalan dengan Orleans

Halo Rekan Dev,

Apa kabar hari ini? Masih penuh semangat donk tentunya ;D Oke kali ini kita akan cobain bikin komputasi terdistribusi sederhana dengan Orleans, yaitu library yang bisa memungkinkan rekan-rekan membangun aplikasi terdistribusi baik di on-prem atau cloud dengan .NET.

Sederhananya, bayangin aja rekan-rekan punya proses rendering 3D yang berat terus dijalanin dengan 1 PC dan bandingkan jika proses itu dibagi ke 3 PC, akan lebih cepat mana ? Nah, selain itu coba bayangkan kalau punya aplikasi yang mengirimkan SMS yang jalan di 2 PC, ketika salah satu PC mati tentunya fungsi pengiriman SMS tidak mati seluruhnya. Nah seperti itulah keuntungan yang bisa didapatkan dengan distributed computing ini. 

Kenapa Orleans ? hmm jawaban simpelnya, Microsoft aja pake. haha, gampang ya. Game seperti Halo, Gears of War dimana banyak sekali user yang bermain bersamaan aja pake, jangan dibandingkan dengan aplikasi kita yang paling banter dipake orang cuma 1 perusahaan aja haha.

Selain itu Orleans ini dibuat oleh Microsoft Research tentunya berkualitas, konsep virtual actor tentunya bukan hal baru yang sering digunakan saat membuat aplikasi terdistribusi. Konsep yang serupa dipake erlang, yang memang dibuat khusus untuk menangani distributed computing. Nah selain itu orleans ini sudah banyak menangani bagian terkompleks dari distributed computing seperti scaling, grain (actor) life cycle, state management, cluster management, scheduler, timers, recovery, dsb. sehingga kita bisa fokus dalam membuat solusi kita saja.

Grain

Konsep dasar menggunakan Orleans ini adalah grain, bayangin aja grain ini seperti 1 entitas pekerja yang punya identitas, behaviour berisi atribut data dan fungsi-fungsi, dan juga state (data) yang dia bawa. Grain ini bisa diaktivasi dan disimpan di dalam silo (server), dan silo bisa membentuk sebuah cluster. Grain ini bisa dipanggil oleh grain lain atau aplikasi lain seperti web app/mobile app/desktop app. Grain dibuat berdasarkan contract yang direpresentasikan dalam interface di koding. Grain ini bisa menyimpan data yang bisa berubah-ubah atau tetap dalam bentuk state. Saat aktif grain di simpen dalam memory.

Grain life cycle

aktivasi grain dilakukan otomatis oleh Orleans Runtime, grain yang tidak digunakan otomatis akan dihapus dari memory sehingga resources bisa terjaga. Kita tidak perlu tahu grain ada di silo yang mana, apakah ada di memory atau tidak itu bukan urusan kamu, terima beres aja karena life cycle dari grain sudah diatur semua oleh orleans runtime. 

Fitur Orleans

Persistence

Setiap grains menyimpan state yang secara otomatis dihandle oleh orleans, state ini ditaruh di memory ketika grain di aktivasi. Grain ini bisa disimpen ke dalam persistent data object yang diberi nama, misal untuk device IoT dikasih nama “Devices” dan untuk IoT Gateway dikasih nama “Gateway”. State ini nantinya bisa disync ke storage seperti sql database, azure storage, dsb. Ketika ada perubahan state di grain maka bisa kita bisa sync ke backing store dengan fungsi “state.WriteStateAsync()” untuk menjamin konsistensi dan durability.

ACID Transactions

Grain bisa memiliki transactional state, beberapa grains dapat melakukan transaksi ACID secara bersamaan. Transaksi ini bersifat terdistribusi dan desentralisasi karena tidak ada yang berfungsi sebagai kordinator.  

Streams

Stream digunakan untuk memroses dataseri mendekati real-time. Stream ini tidak perlu dibuat atau di register sebelum grain atau client mempublish data ke stream atau melakukan subscribe ke stream. Ini membuat decoupling antara publisher dan consumer, begitu juga ke infrastruktur. Proses stream ini cukup handal karena grain dapat menyimpan checkpoint dan melakukan reset ke checkpoint yang tersimpan saat aktivasi atau kapan saja. Stream mendukung pengiriman pesan secara batch ke konsumer untuk efisiensi dan performa. Stream bisa menggunakan azure event hub, amazon kinesis atau lainnya. 

Timers & Reminders

Reminder berfungsi sebagai scheduler yang memastikan task tertentu dapat dijalankan pada waktu tertentu di masa yang akan datang terlepas dari grainnya aktif atau tidak. Timer digunakan untuk event berulang yang berfrekuensi tinggi.

Fleksibilitas Penempatan Grain 

Ketika grain di aktivasi di orleans maka runtime akan menentukan grain ini akan ditaro di silo (server) yang mana. Ini dapat dikonfigurasi developer, ada beberapa opsi OOTB seperti random, prefer-local dan load-based atau dengan logic tertentu. Ini membuat fleksibilitas dalam penempatan grain. seperti contohnya grain ditaruh deket silo dengan storage terdekat secara geografis. 

Grain Versioning & Heterogeneous Clusters

Kodingan kita khan sering berubah kalau dipake dan dikembangkan setiap waktu. Nah problemnya kalau sudah di production gimana, apalagi di stateful system. Grain di orleans bisa dikasih versi secara opsional. Cluster akan atur mapping grain yang ada dengan silo yang ada di cluster sesuai versinya. Versi ini juga digunakan juga saat strategy penempatan grain agar memudahkan routing saat grain di aktivasi. Sebagai tambahan, ini memungkinkan implementasi cluster yang heterogen maksudnya setiap silo bisa memiliki grain tertentu.

Elastic Scalability & Fault Tolerance

Orleans mendukung scaling secara elastis. artinya bisa menambah dan mengurang sesuai kebutuhan secara otomatis. Ketika silo (server) keluar dari cluster gara-gara scale-down atau kegagalan server, grain aktif yang terdapat pada silo tersebut akan di re-aktivasi di silo yang masih tersedia. Cluster orleans bisa di scale-down sampai dengan 1 silo saja. Selain kemampuan scaling, orleans juga mendukung fault tolerance, artinya cluster dapat mendeteksi kegagalan dan secara otomatis melakukan recovery.

Jalan Dimana Aja

Karena pake .NET bikinnya tentunya bisa jalan di Linux, Windows, MacOS atau di deploy ke kuberneter, VM atau server fisik, on-prem atau cloud. 

Stateless Workers

Stateless workers adalah grain yang ditandai tidak memiliki state dan bisa diaktivasi di beberapa silo sekaligus. Ini meningkatkan kemampuan proses paralel untuk fungsi yang stateless. Contoh sederhananya temen-temen bikin aplikasi buat DDOS atau ping flooder haha…

Grain Call Filters

Fungsi logic yang umum untuk semua grain dapat dikatakan sebagai Grain Call Filters. Orleans mendukung filter ini baik untuk panggilan ke dalam atau keluar. beberapa use casenya seperti authorization, logging, telemetry dan error handling.

Request Context

Metadata dan informasi lain dapat dikirim bersama dengan request dengan menggunakan request context. Request context dapat digunakan untuk menyimpan informasi tracing terdistribusi dan beberapa informasi kustom milik user.

Oke kuliahnya dah beres, sekarang saatnya ngoprek, nah berikut adalah contoh hello world yang temen-temen bisa coba.

Pastikan temen-temen udah:

  1. Download .NET (Linux, macOS, and Windows) (microsoft.com)
  2. Download Visual Studio Code – Mac, Linux, Windows

Setelah itu coba untuk projectnya dari Gravicode/DistributedFileSearchEngine: This is experimental project how to use Orleans for creating file search engine with distributed computing (github.com)

Sedikit penjelasan:

Struktur projectnya sbb:

  1. Search client : ini cuma aplikasi blazor wasm yang berfungsi sebagai frontend web app yang memanggil api dari server, berisi search page untuk mencari file berdasarkan keyword tertentu.
  2. Libs : helper library untuk dapetin info pc
  3. Orleans – client : aplikasi client orleans dalam bentuk console app, kalau misalnya kita bikin client berbentuk cronjob or semacamnya
  4. Orleans – Silo : nah ini adalah contoh single silo dan cluster orleans, dimana grains yang diaktivasi akan disimpen disini
  5. Shared : berisi grains (actor) yang diproject ini berfungsi sebagai grain pengecek informasi silo (spek computer) dan crawler, grain yang melakukan pencarian file tertentu ke folder tertentu di silo (server).

Client Web:

Client Console:

Nah, silakan diterawang kodingnya dan dipahami masing-masing sesuai dengan kemampuan masing-masing. Nah penulis menantang teman-teman coba bikin contoh bagaimana membuat solusi IoT dengan orleans. Anggaplah device IoT dan Gateway itu memiliki representasi sebagai grain disini, lalu ketika ada data dikirimkan oleh device maka state di grain tersebut berubah, dan masing-masing grain punya identitas sesuai ID devicenya. Begitu juga gateway yang menerima data dari Device, memiliki log history yang lalu diteruskan ke cloud untuk disimpan atau di visualisasikan. Monggo dimainkan kalau ga ada kerjaan hahaa…

Semoga bermanfaat, terus berkarya jangan mager.

Salam Dev ;D

Loading

You May Also Like