Flawless - Rust के लिए durable execution engine
(flawless.dev)- Flawless एक durable computation execution engine है, जो विफलता होने पर भी कोड को अंत तक चलाने में मदद करता है
- वर्कफ़्लो सामान्य Rust functions के रूप में लिखे जाते हैं, लेकिन native code के बजाय WebAssembly में compile होकर deterministic environment में चलते हैं
- HTTP request या random number generation जैसी बाहरी दुनिया से जुड़ने वाली जगहों पर ही non-deterministic side effects पैदा होते हैं, और Flawless इन्हें log के रूप में सहेजता है
- execution रुक जाने पर यह सहेजे गए logs का उपयोग करके उसी state तक फिर से पहुँचता है, और पहले से किए गए side effects को दोहराता नहीं है
- डेवलपर को database में हर state को सीधे model करने की जरूरत नहीं होती; वे code और local variables से persistent state को व्यक्त कर सकते हैं, जिससे server restart के बाद भी रुके हुए बिंदु से execution जारी रह सकता है
कोड से persistent state व्यक्त करने वाला execution model
- Flawless एक durable computation engine है, जो hardware या software failure होने पर भी code के पूरा होने तक execution जारी रखने के लिए बनाया गया है
- जटिल user experience के लिए जटिल UI और state की जरूरत होती है, लेकिन हर state को database के भीतर सीधे model करना कठिन होता है
- अगर उपयोगकर्ता गलती से page refresh कर दे तब भी प्रगति न खोने के लिए आधुनिक applications में persistent storage की जरूरत होती है
- Flawless का लक्ष्य persistent state को code और local variables के रूप में model करने देना है, ताकि application के जटिल behavior को अधिक आसानी से व्यक्त किया जा सके
WebAssembly आधारित execution और failure recovery
- वर्कफ़्लो सामान्य Rust functions के रूप में लिखे जाते हैं और इनमें किसी भी तरह का logic शामिल हो सकता है
- functions native code के बजाय WebAssembly में compile होते हैं और पूरी तरह deterministic environment में चलते हैं
- केवल तब non-determinism आता है जब external world के साथ interaction होता है, जैसे HTTP request करना या random number generation
- Flawless ऐसे non-deterministic side effect logs को सहेजता है और recovery में उनका उपयोग करता है
- वर्कफ़्लो execution रुकने पर इसे फिर से चलाकर उसी state तक पहुँचाया जाता है
- जो side effects पहले ही हो चुके हैं, उन्हें दोबारा नहीं किया जाता
- सहेजकर रखने वाले data की मात्रा न्यूनतम रखी जाती है, और बाकी को failure होने पर जरूरत के अनुसार फिर से compute किया जाता है
- यह execution model पूरे system के behavior को बेहतर ढंग से observe करने में मदद करता है
- पूरा हो चुके या चल रहे workflows के सटीक execution path का analysis किया जा सकता है
- deterministic execution environment की वजह से reproduce करने में कठिन bugs को संभालना आसान हो जाता है
- डेवलपर state persistence के बोझ को कम कर सकते हैं और business logic लिखने पर अधिक ध्यान दे सकते हैं
- maintenance के लिए server restart करना पड़े तब भी Flawless engine को फिर से शुरू करने पर workflow वहीं से आगे चलता है जहाँ वह रुका था
- 9 दिसंबर 2024 तक Flawless Beta 3 उपलब्ध है
1 टिप्पणियां
Hacker News की राय
यह जानना चाहूंगा कि workflow version management कैसे संभाला जाएगा। Temporal/Cadence जैसे सिस्टम में मुझे यह सबसे कठिन समस्या लगती है
upgrade तभी सफल होता है जब नया code मौजूदा side-effect log records को ठीक-ठीक replay कर सके। तरीका यह है कि नए code से catch up किया जाए, और catch up होने के बाद उसी तरह execution जारी रहे
अगर नया code मौजूदा records से अलग हो जाता है, तो upgrade fail हो जाता है और पुराने code पर वापस लौटता है। ऐसे में किसी इंसान को हस्तक्षेप करके देखना होगा कि क्या गलत हुआ
दूसरे approaches भी हैं, लेकिन असल में समझने और इस्तेमाल करने के लिहाज से मुझे यह तरीका सबसे सरल लगता है। development के दौरान भी मौजूदा logs का उपयोग करके test किया जा सकता है कि code diverge हो रहा है या नहीं
क्या आप कई versions को साथ-साथ maintain करना चाहते हैं, या in-progress workflows को नवीनतम workflow definition पर migrate करने का तरीका चाहिए?
लगता है हमारा क्षेत्र अब architecture या medicine के और करीब होता जा रहा है। ऐसी technologies की वजह से हम tinkering के चरण से निकलकर गंभीर engineering culture में प्रवेश कर सकते हैं
संक्षेप में पूछूं तो, ऐसे systems में DoS attack के effect का स्थायी हो जाना कैसे रोका जाता है?
architecture, regulatory constraints के भीतर subjective opinions से निपटने के ज्यादा करीब है, और medicine experiments से validate होने वाला empirical knowledge है। दोनों को engineering जैसा कहना मुश्किल है
architecture कला के एक रूप के ज्यादा करीब है, और universities में architecture departments भी आम तौर पर arts colleges में होते हैं
medicine, engineering की तरह applied science तो है, लेकिन खुद engineering field नहीं है
जानना चाहूंगा कि यह determinism floating-point calculations तक extend होता है या नहीं
multiplayer games में clients की state floating-point calculations में थोड़ा-थोड़ा drift जमा करती थी, इसलिए server state के साथ समय-समय पर फिर से sync करना पड़ता था, और historically यह काफी दर्दनाक मुद्दा रहा है
https://webassembly.org/docs/faq/#why-is-there-no-fast-math-... और https://github.com/WebAssembly/design/blob/main/Nondetermini... देखें
https://asawicki.info/news_1741_myths_about_floating-point_n...
पहले CPU results भी execution path के हिसाब से बदल सकते थे। article में tweet देखें
f64की जगह large number struct को synchronize करना भी एक option हो सकता है, या complexity और size के लिहाज से यह practical नहीं होगाside effects की state कहां store होती है? उदाहरण के लिए, अगर कोई AWS Lambda है जिसे idempotent बनाना चाहते हैं, तो Lambda के पास executions के बीच बना रहने वाला local storage नहीं होता
जब तक EBS volume जैसा कुछ mount न किया जाए, state बनी नहीं रहती, तो क्या यह मान सकते हैं कि state DB में store की जा सकती है?
core principle और काम करने का तरीका दिखाने वाली animation पसंद आई। वाकई बहुत अच्छी बनाई है
code बहुत सुंदर नहीं है, लेकिन implementation straightforward है; अगर देखना चाहें तो यहां है: https://flawless.dev/js/how-does-it-work-animation.js
दिलचस्प लगता है, लेकिन functions को side-effectful के रूप में mark करने का तरीका बिना गलतियों के बनाना आसान होगा या नहीं, यह जानना चाहूंगा
example में random number generation side effect है, ऐसा मैं मान रहा हूं क्योंकि यह flawless द्वारा दिए गए random number generator से आता है। क्या यह सामान्य Rust function से भी संभव होता?
मुझे लगता है developer के पास workflow verify करने के लिए test harness जैसा कुछ भी होगा
WebAssembly module के अंदर host calls को explicitly declare करना जरूरी करता है। अगर आप flawless द्वारा provide न किए गए किसी और host call का उपयोग करने की कोशिश करते हैं, तो module instantiate नहीं किया जा सकता
WebAssembly ecosystem में कई standardization efforts भी चल रहे हैं। उदाहरण के लिए, अगर Rust
randcrate का उपयोग करके WebAssembly में compile करें, तो random number generation के लिए WASI host function का उपयोग होता हैwasi,wasi-httpआदि के standardize होने का इंतजार करते हुए फिलहाल हम अपना interface expose कर रहे हैंबेशक, बड़ी कमी भी है। हर Rust code को WebAssembly में compile नहीं किया जा सकता। फिर भी, unintended side effects कभी न हों यह guarantee करने वाला default-deny approach मुझे बेहतर लगता है
flawlessnamespace के तहत हैं, इससे लगता है कि पूरे Rust ecosystem तक access देने के बजायstd::flawlessजैसा कुछ use कराया जाएगाharness ज्यादातर समस्याएं हल कर देगा, लेकिन कितनी functionality map की जा सकेगी यह जानना दिलचस्प होगा
अभी तक यह Rust इस्तेमाल करने वाले scripting runtime के ज्यादा करीब दिखता है
यह Temporal का Rust विकल्प जैसा दिखता है, जो runtime के रूप में WASM का उपयोग करता है। पसंद आया
मैं windmill.dev का founder हूं, और हम भी Rust में बने durable engine पर काम करते हैं। हालांकि वह बहुत कम elegant है। हम workflows को Python/TypeScript/Go/Bash के स्पष्ट steps में बांटते हैं, और incomplete step से resume करने के लिए last step से फिर शुरू करते हैं, साथ ही हर step का result Postgres DB के
jsonbमें permanently store करते हैंuse cases निश्चित रूप से अलग हैं, और flawless, जैसा site पर कहा गया है, बहुत lightweight है, इसलिए यह UI flow state को model करने और छोटे server पर millions तक scale करने के लिए भी उपयोगी दिखता है
शानदार। उम्मीद है किसी दिन Rust सभी distributed systems को चलाएगा
“किसी दूसरी language में लिखा गया पर्याप्त complex concurrent program, ad-hoc तरीके से, unofficial spec में buggy और slow Erlang का आधा-अधूरा implementation शामिल करता है” — Virding का programming का पहला नियम
यह Erlang से काफी अलग है। Erlang मुख्य रूप से तब software develop करने के लिए बनाया गया था जब आपके पास केवल prototype equipment हो जिसमें hardware समस्याएं बहुत हों
मुझे दोनों approaches बिल्कुल उलटी लगती हैं। Flawless बीच में crash होने वाले workflow को पूरा करने के लिए loop में फंस सकता है, जबकि Erlang hardware bug hit करने वाले 50% traffic को खुशी से drop कर सकता है
Erlang persistent state को practically खत्म करके समस्या हल करता है। लगभग सारी state message queues या external DB जैसी जगहों में रहती है
Flawless समस्या को filesystem journaling जैसी, लेकिन पूरी तरह वैसी नहीं, technique से हल करता लगता है। side effects perform करते समय उन्हें record करने का तरीका है
filesystem journaling crash के बाद फिर से run करने के लिए होता है, लेकिन यहां मकसद फिर से run करने की जरूरत ही न रहने देना है
यह किन domains में कितना fit बैठेगा, यह स्पष्ट नहीं है, लेकिन Erlang जिन domains में fit बैठता है उनसे overlap पूरा नहीं दिखता
बहुत बढ़िया। Ambient नाम के WASM game runtime में भी similar problem है। competing processes होते हैं और interactions को retry करना पड़ सकता है, इसलिए यहां दिखाया गया approach दिलचस्प है
लेकिन Lunatic से इसका relation जानना चाहूंगा। क्या Lunatic पर भी अभी काम जारी है, यह side project है, या पूरी तरह अलग है?
https://lunatic.solutions/
https://kolobara.com
“कल्पना करें कि आप कोई arbitrary computation शुरू करते हैं, और system guarantee करता है कि वह completion तक चलेगा और हर operation exactly once perform होगा”
यह guarantee कैसे होती है, जानना चाहूंगा। distributed systems में exactly-once delivery असंभव नहीं है क्या?
अगर system आगे बढ़ सकता है, तो message exactly once deliver होगा
अगर existence proof चाहिए, तो NFSv3 ने 1980s में ही इसे काम करा दिया था। यह पहला था या नहीं, पता नहीं