आपका Rust सर्वर आदर्श है? आइए इसे जांचें
\n\nआपने Rust में एक सर्वर लिखा है जो प्रति सेकंड हजारों अनुरोधों को संसाधित करता है। कंपाइलर संतुष्ट है, clippy चुप है, परीक्षण पास हो रहे हैं। लेकिन क्या होगा यदि अचानक डेटाबेस बंद हो जाए? या नेटवर्क कार्ड खराब होने लगे? या डिस्क भर जाए?
\n\nपारंपरिक परीक्षण में, हम जांचते हैं कि कोड जैसा सोचा गया था वैसा काम करता है। Chaos engineering कुछ और है: हम जांचते हैं कि सिस्टम सब कुछ के बावजूद जीवित रहता है। और Rust, विश्वसनीयता और प्रदर्शन पर अपने जोर के साथ, ऐसे प्रयोगों के लिए एक आदर्श मंच है।
\n\nयह लेख दस्तावेज़ीकरण का उबाऊ पुनर्कथन नहीं है। हम सिद्धांत से अभ्यास तक का सफर तय करेंगे: मैं दिखाऊंगा कि वास्तविक उपकरणों और कोड की मदद से Rust एप्लिकेशन के लिए chaos engineering को कैसे लागू किया जाए।
\n\nChaos Engineering क्या है और Rust डेवलपर को इसकी आवश्यकता क्यों है?
\n\nChaos engineering एक वितरित प्रणाली पर प्रयोगों का अनुशासन है, जिसका उद्देश्य production में प्रकट होने से पहले इसकी कमजोरियों की पहचान करना है। Netflix, जिसे इस दृष्टिकोण का अग्रणी माना जाता है, सर्वर को बेतरतीब ढंग से बंद करने के लिए Chaos Monkey टूल का उपयोग करता है।
यह विशेष रूप से Rust के लिए क्यों महत्वपूर्ण है? क्योंकि Rust को अक्सर महत्वपूर्ण प्रणालियों के लिए चुना जाता है:
\n- \n
- नेटवर्क सेवाएं (प्रॉक्सी, लोड बैलेंसर, API गेटवे) \n
- एम्बेडेड सिस्टम (IoT, ऑटोमोबाइल) \n
- ब्लॉकचेन नोड्स और वित्तीय प्रणालियां \n
- डेटा की स्ट्रीम प्रोसेसिंग \n
इन सभी मामलों में, गलती की कीमत अधिक होती है। Chaos engineering यह सुनिश्चित करने में मदद करता है कि आपका Rust एप्लिकेशन न केवल सामान्य लोड बल्कि वास्तविक दुनिया की अराजकता से भी बचेगा।
\n\nRust इकोसिस्टम में Chaos Engineering के लिए उपकरण
\n\nहालांकि Rust इकोसिस्टम Java या Go से छोटा है, हमारे पास पहले से ही अराजकता को लागू करने के लिए कई परिपक्व लाइब्रेरी हैं।
\n\n| उपकरण | \nउद्देश्य | \nस्थिति | \n
|---|---|---|
tokio-rs/bytes | \n नेटवर्क विलंब का अनुकरण | \nसक्रिय | \n
fault-injection | \n पैनिक और त्रुटियों का इंजेक्शन | \nस्थिर | \n
simulation | \n डिस्क/नेटवर्क विफलता का अनुकरण | \nप्रायोगिक | \n
chaostoolkit | \n अराजकता परिदृश्यों के लिए फ्रेमवर्क | \nHTTP API के माध्यम से समर्थन | \n
हम fault-injection और नेटवर्क समस्याओं के अनुकरण का उपयोग करके एक व्यावहारिक उदाहरण पर ध्यान केंद्रित करेंगे।
व्यावहारिक उदाहरण: Rust सेवा में "आग बुझाएं"
\n\nमान लीजिए, हमारे पास axum पर एक सरल HTTP सर्वर है जो कुछ करता है (उदाहरण के लिए, बाहरी API से संपर्क करता है)। हम जांचना चाहते हैं कि यह कैसा व्यवहार करेगा यदि बाहरी सेवा अनुपलब्ध हो जाती है या देरी से जवाब देना शुरू कर देती है।
चरण 1: "छेद" वाला बुनियादी सर्वर
\n\nआइए एक सर्वर लिखें जो httpbin.org (बाहरी सेवा का अनुकरण) पर अनुरोध करता है:
use axum::{Router, routing::get, response::Json};\nuse reqwest::Client;\nuse std::sync::Arc;\nuse serde_json::Value;\n\n#[tokio::main]\nasync fn main() {\n let client = Arc::new(Client::new());\n\n let app = Router::new()\n .route("/fetch", get(handler))\n .with_state(client);\n\n axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())\n .serve(app.into_make_service())\n .await\n .unwrap();\n}\n\nasync fn handler(client: Arc<Client>) -> Result<Json<Value>, (StatusCode, String)> {\n let resp = client.get("https://httpbin.org/uuid")\n .timeout(std::time::Duration::from_secs(5))\n .send()\n .await\n .map_err(|e| (StatusCode::SERVICE_UNAVAILABLE, e.to_stri