Rust के लिए Chaos-इंजीनियरिंग: एप्लिकेशन को अजेय कैसे बनाएं

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

आपका Rust सर्वर आदर्श है? आइए इसे जांचें

\n\n

आपने Rust में एक सर्वर लिखा है जो प्रति सेकंड हजारों अनुरोधों को संसाधित करता है। कंपाइलर संतुष्ट है, clippy चुप है, परीक्षण पास हो रहे हैं। लेकिन क्या होगा यदि अचानक डेटाबेस बंद हो जाए? या नेटवर्क कार्ड खराब होने लगे? या डिस्क भर जाए?

\n\n

पारंपरिक परीक्षण में, हम जांचते हैं कि कोड जैसा सोचा गया था वैसा काम करता है। Chaos engineering कुछ और है: हम जांचते हैं कि सिस्टम सब कुछ के बावजूद जीवित रहता है। और Rust, विश्वसनीयता और प्रदर्शन पर अपने जोर के साथ, ऐसे प्रयोगों के लिए एक आदर्श मंच है।

\n\n

यह लेख दस्तावेज़ीकरण का उबाऊ पुनर्कथन नहीं है। हम सिद्धांत से अभ्यास तक का सफर तय करेंगे: मैं दिखाऊंगा कि वास्तविक उपकरणों और कोड की मदद से Rust एप्लिकेशन के लिए chaos engineering को कैसे लागू किया जाए।

\n\n

Chaos Engineering क्या है और Rust डेवलपर को इसकी आवश्यकता क्यों है?

\n\n

Chaos engineering एक वितरित प्रणाली पर प्रयोगों का अनुशासन है, जिसका उद्देश्य production में प्रकट होने से पहले इसकी कमजोरियों की पहचान करना है। Netflix, जिसे इस दृष्टिकोण का अग्रणी माना जाता है, सर्वर को बेतरतीब ढंग से बंद करने के लिए Chaos Monkey टूल का उपयोग करता है।

\n\n

यह विशेष रूप से Rust के लिए क्यों महत्वपूर्ण है? क्योंकि Rust को अक्सर महत्वपूर्ण प्रणालियों के लिए चुना जाता है:

\n
    \n
  • नेटवर्क सेवाएं (प्रॉक्सी, लोड बैलेंसर, API गेटवे)
  • \n
  • एम्बेडेड सिस्टम (IoT, ऑटोमोबाइल)
  • \n
  • ब्लॉकचेन नोड्स और वित्तीय प्रणालियां
  • \n
  • डेटा की स्ट्रीम प्रोसेसिंग
  • \n
\n\n

इन सभी मामलों में, गलती की कीमत अधिक होती है। Chaos engineering यह सुनिश्चित करने में मदद करता है कि आपका Rust एप्लिकेशन न केवल सामान्य लोड बल्कि वास्तविक दुनिया की अराजकता से भी बचेगा।

\n\n

Rust इकोसिस्टम में Chaos Engineering के लिए उपकरण

\n\n

हालांकि Rust इकोसिस्टम Java या Go से छोटा है, हमारे पास पहले से ही अराजकता को लागू करने के लिए कई परिपक्व लाइब्रेरी हैं।

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
उपकरणउद्देश्यस्थिति
tokio-rs/bytesनेटवर्क विलंब का अनुकरणसक्रिय
fault-injectionपैनिक और त्रुटियों का इंजेक्शनस्थिर
simulationडिस्क/नेटवर्क विफलता का अनुकरणप्रायोगिक
chaostoolkitअराजकता परिदृश्यों के लिए फ्रेमवर्कHTTP API के माध्यम से समर्थन
\n\n

हम fault-injection और नेटवर्क समस्याओं के अनुकरण का उपयोग करके एक व्यावहारिक उदाहरण पर ध्यान केंद्रित करेंगे।

\n\n

व्यावहारिक उदाहरण: Rust सेवा में "आग बुझाएं"

\n\n

मान लीजिए, हमारे पास axum पर एक सरल HTTP सर्वर है जो कुछ करता है (उदाहरण के लिए, बाहरी API से संपर्क करता है)। हम जांचना चाहते हैं कि यह कैसा व्यवहार करेगा यदि बाहरी सेवा अनुपलब्ध हो जाती है या देरी से जवाब देना शुरू कर देती है।

\n\n

चरण 1: "छेद" वाला बुनियादी सर्वर

\n\n

आइए एक सर्वर लिखें जो httpbin.org (बाहरी सेवा का अनुकरण) पर अनुरोध करता है:

\n\n
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                

ब्लॉग

पुस्तक अनुशंसाएँ