Flawless - Mesin eksekusi tahan gangguan untuk Rust
(flawless.dev)- Flawless adalah mesin eksekusi komputasi tahan lama yang membantu kode tetap berjalan sampai selesai meskipun terjadi gangguan
- Workflow ditulis sebagai fungsi Rust biasa, tetapi dikompilasi ke WebAssembly alih-alih kode native dan dijalankan dalam lingkungan deterministik
- Efek samping nondeterministik hanya muncul di titik yang berinteraksi dengan dunia luar, seperti permintaan HTTP atau pembuatan bilangan acak, dan Flawless menyimpannya sebagai log
- Jika eksekusi terputus, Flawless menggunakan log yang tersimpan untuk mengejar kembali hingga status yang sama, dan tidak mengulangi efek samping yang sudah dijalankan
- Pengembang dapat merepresentasikan status persisten dengan kode dan variabel lokal tanpa harus memodelkan seluruh status langsung di database, sehingga dapat melanjutkan dari titik terhenti bahkan setelah server dimulai ulang
Model eksekusi yang merepresentasikan status persisten dengan kode
- Flawless adalah mesin komputasi tahan lama yang memastikan kode terus dieksekusi sampai selesai meskipun terjadi kegagalan perangkat keras atau perangkat lunak
- Pengalaman pengguna yang kompleks membutuhkan UI dan status yang kompleks, tetapi sulit untuk memodelkan seluruh status langsung di dalam database
- Agar kemajuan pengguna tidak hilang meskipun halaman tidak sengaja dimuat ulang, aplikasi modern memerlukan penyimpanan persisten
- Flawless bertujuan memudahkan ekspresi perilaku aplikasi yang kompleks dengan memungkinkan status persisten dimodelkan melalui kode dan variabel lokal
Eksekusi berbasis WebAssembly dan pemulihan dari gangguan
- Workflow ditulis sebagai fungsi Rust biasa dan dapat memuat logika apa pun
- Fungsi dikompilasi ke WebAssembly alih-alih kode native, lalu dijalankan dalam lingkungan yang sepenuhnya deterministik
- Nondeterminisme hanya diperkenalkan saat berinteraksi dengan dunia luar, seperti menjalankan permintaan HTTP atau membuat bilangan acak
- Flawless menyimpan log efek samping nondeterministik ini untuk digunakan saat pemulihan
- Jika eksekusi workflow terhenti, workflow dijalankan kembali untuk mengejar hingga status yang sama
- Efek samping yang sudah dijalankan tidak akan dijalankan lagi
- Jumlah data yang perlu disimpan diminimalkan, dan sisanya dihitung ulang sesuai kebutuhan saat terjadi gangguan
- Model eksekusi ini memungkinkan perilaku seluruh sistem diamati dengan lebih baik
- Jalur eksekusi yang tepat dari workflow yang sudah selesai maupun yang sedang berjalan dapat dianalisis
- Berkat lingkungan eksekusi yang deterministik, bug yang sulit direproduksi menjadi lebih mudah ditangani
- Pengembang dapat mengurangi beban penyimpanan status dan lebih fokus menulis logika bisnis
- Bahkan jika server harus dimulai ulang untuk pemeliharaan, workflow akan melanjutkan eksekusi dari titik berhenti saat mesin Flawless dijalankan kembali
- Per 9 Desember 2024, Flawless Beta 3 tersedia
1 komentar
Komentar Hacker News
Saya penasaran bagaimana manajemen versi workflow akan ditangani. Menurut saya ini masalah tersulit di sistem seperti Temporal/Cadence
Upgrade hanya berhasil jika kode baru bisa memutar ulang catatan log efek samping yang sudah ada secara persis. Caranya, kode baru mengejar ketertinggalan, lalu setelah tersusul, eksekusi dilanjutkan begitu saja
Jika kode baru menyimpang dari catatan yang ada, upgrade gagal dan kembali ke kode sebelumnya. Dalam kasus ini, manusia perlu turun tangan untuk memeriksa apa yang salah
Ada pendekatan lain, tetapi menurut saya cara ini yang paling sederhana untuk benar-benar dipahami dan digunakan. Saat pengembangan pun, log yang ada bisa dipakai untuk menguji apakah kode bercabang
Saya juga penasaran apakah tujuannya mempertahankan beberapa versi sekaligus, atau perlu cara memigrasikan yang sedang berjalan ke definisi workflow terbaru
Saya merasa bidang kita sekarang makin mendekati arsitektur atau kedokteran. Berkat teknologi seperti ini, kita bisa keluar dari tahap coba-coba dan masuk ke budaya rekayasa yang serius
Singkatnya, saya penasaran bagaimana mencegah efek serangan DoS menjadi persisten dalam sistem seperti ini
Arsitektur lebih dekat ke penanganan opini subjektif di dalam batasan regulasi, sedangkan kedokteran adalah pengetahuan empiris yang diverifikasi lewat eksperimen. Keduanya sulit dibilang mirip dengan rekayasa
Arsitektur lebih dekat ke salah satu bentuk seni, dan jurusan arsitektur di universitas biasanya juga berada di fakultas seni
Kedokteran memang ilmu terapan seperti rekayasa, tetapi bukan bidang rekayasa itu sendiri
Saya penasaran apakah determinisme ini juga mencakup komputasi floating-point
Di game multiplayer, state klien menumpuk drift sedikit demi sedikit dari komputasi floating-point, sehingga harus disinkronkan ulang secara berkala dengan state server, dan secara historis ini titik yang cukup menyakitkan
Lihat https://webassembly.org/docs/faq/#why-is-there-no-fast-math-... dan https://github.com/WebAssembly/design/blob/main/Nondetermini...
https://asawicki.info/news_1741_myths_about_floating-point_n...
Dulu, hasil CPU pun bisa berbeda tergantung jalur eksekusi. Lihat tweet di dalam artikel
f64juga bisa menjadi opsi, atau apakah itu tidak realistis dari sisi kompleksitas dan ukuranSaya penasaran di mana state efek samping disimpan. Misalnya ada AWS Lambda yang ingin dibuat idempoten; Lambda tidak punya penyimpanan lokal yang bertahan antar-eksekusi
Karena state tidak bertahan kecuali memasang sesuatu seperti volume EBS, apakah bisa diasumsikan state disimpan di DB?
Saya suka animasi yang menunjukkan prinsip inti dan cara kerjanya. Dibuat dengan sangat baik
Kodenya tidak terlalu cantik, tetapi implementasinya intuitif; kalau ingin melihat, ada di sini: https://flawless.dev/js/how-does-it-work-animation.js
Terlihat menarik, tetapi saya penasaran apakah cara menandai fungsi sebagai memiliki efek samping akan mudah dibuat tanpa kesalahan
Dalam contoh, saya berasumsi pembuatan angka acak dianggap efek samping karena berasal dari generator angka acak yang disediakan flawless. Apakah itu juga mungkin dengan fungsi Rust biasa?
Saya kira juga ada semacam test harness agar developer bisa memeriksa workflow
WebAssembly mengharuskan pemanggilan host dideklarasikan secara eksplisit di dalam modul. Jika mencoba memakai pemanggilan host lain yang tidak disediakan flawless, modul tidak bisa diinstansiasi
Di ekosistem WebAssembly juga sedang berjalan beberapa upaya standardisasi. Misalnya, jika memakai crate Rust
randdan mengompilasinya ke WebAssembly, ia memakai fungsi host WASI untuk pembuatan angka acakSambil menunggu
wasi,wasi-http, dan lain-lain distandardisasi, untuk sementara kami mengekspos antarmuka sendiriTentu ada kelemahan besar juga. Tidak semua kode Rust bisa dikompilasi ke WebAssembly. Meski begitu, menurut saya pendekatan deny-by-default yang menjamin efek samping tak disengaja sama sekali tidak terjadi lebih baik
flawless, sepertinya alih-alih memberi akses ke seluruh ekosistem Rust, pengguna akan memakai sesuatu sepertistd::flawlessHarness akan menyelesaikan sebagian besar masalah, tetapi saya penasaran seberapa banyak fitur yang bisa dipetakan
Sejauh ini, ini lebih terlihat seperti runtime scripting yang memakai Rust
Terlihat seperti alternatif Rust untuk Temporal yang memakai WASM sebagai runtime. Saya suka
Saya pendiri windmill.dev, dan kami juga menangani durable engine yang dibuat dengan Rust. Hanya saja jauh kurang elegan. Kami membagi workflow menjadi langkah-langkah eksplisit dalam Python/TypeScript/Go/Bash, lalu untuk melanjutkan dari langkah yang belum selesai, kami memulai lagi dari langkah terakhir dan menyimpan hasil tiap langkah secara permanen di
jsonbpada DB PostgresKasus penggunaannya jelas berbeda, dan flawless tampaknya sangat ringan seperti yang dikatakan di situsnya, sehingga bisa dipakai untuk memodelkan status alur UI dan menskalakan hingga jutaan di server kecil
Fantastis. Semoga suatu hari Rust menggerakkan semua sistem terdistribusi
“Program konkurensi yang cukup kompleks yang ditulis dalam bahasa lain akan berisi, sebagai solusi tambal-sulam, implementasi setengah Erlang yang bug-nya banyak, lambat, dan spesifikasinya tidak resmi” — Hukum Pemrograman Pertama Virding
Ini cukup berbeda dari Erlang. Erlang terutama dibuat untuk mengembangkan perangkat lunak bahkan ketika yang tersedia hanya perangkat prototipe dengan banyak masalah hardware
Bagi saya, kedua pendekatan ini tampak berlawanan. Flawless bisa terjebak dalam loop untuk menyelesaikan workflow yang crash di tengah jalan, sedangkan Erlang bisa dengan rela membuang 50% traffic yang mengenai bug hardware
Erlang menyelesaikannya dengan pada dasarnya meniadakan status persisten. Hampir semua status berada di tempat seperti antrean pesan atau DB eksternal
Flawless tampaknya memecahkan masalah dengan teknik yang mirip journaling filesystem, tetapi tidak sepenuhnya sama. Caranya adalah mencatat saat melakukan efek samping
Journaling filesystem ditujukan untuk dijalankan ulang setelah crash, tetapi di sini tujuannya agar tidak perlu dijalankan ulang
Belum jelas seberapa cocok di domain mana, tetapi tumpang tindihnya dengan domain yang cocok untuk Erlang tampaknya tidak penuh
Sangat keren. Di runtime game WASM bernama Ambient juga ada masalah serupa. Ada proses-proses yang saling bersaing dan interaksinya mungkin perlu dicoba ulang, jadi pendekatan yang ditunjukkan di sini menarik
Namun saya penasaran hubungan dengan Lunatic. Apakah Lunatic juga masih dikerjakan, apakah ini proyek sampingan, atau benar-benar terpisah?
https://lunatic.solutions/
https://kolobara.com
“Bayangkan jika Anda memulai komputasi arbitrer, sistem menjamin bahwa komputasi itu berjalan hingga selesai dan semua operasi dilakukan tepat satu kali”
Saya penasaran bagaimana ini dijamin. Bukankah exactly-once delivery mustahil dalam sistem terdistribusi?
Jika sistem bisa terus berjalan, pesan akan dikirim tepat satu kali
Kalau butuh bukti keberadaan, NFSv3 sudah membuat ini berjalan pada 1980-an. Saya tidak tahu apakah itu yang pertama