पृष्ठभूमि
मैं r2d2 के माध्यम से डीज़ल का उपयोग करके एक एक्टिक्स-वेब एप्लिकेशन पर काम कर रहा हूं और यह सुनिश्चित करने के लिए अनिश्चित हूं कि कैसे अतुल्यकालिक प्रश्नों को बनाया जाए। मुझे तीन विकल्प मिले हैं जो उचित प्रतीत होते हैं, लेकिन मैं अनिश्चित हूं कि कौन सबसे अच्छा है।
संभावित समाधान
सिंक एक्टर
एक के लिए मैं एक्टिक्स उदाहरण का उपयोग कर सकता था , लेकिन यह काफी जटिल है और इसे बनाने के लिए बॉयलरप्लेट के उचित सौदे की आवश्यकता है। मुझे आशा है कि एक और अधिक उचित समाधान मौजूद है।
Actix_web::web::block
एक अन्य विकल्प के रूप में मैं actix_web::web::block
अपने क्वेरी फ़ंक्शंस को भविष्य में लपेटने के लिए उपयोग कर सकता हूं, लेकिन मैं इसके प्रदर्शन निहितार्थ के बारे में अनिश्चित हूं।
क्या क्वेरी फिर उसी Tokio सिस्टम में चल रही है? जो मुझे स्रोत में मिल सकता है, उससे यह अंतर्निहित एक्टिक्स-वेब थ्रेडपूल में एक धागा बनाता है । क्या यही समस्या है?
यदि मैं कोड को सही से पढ़ता हूं, तो कनेक्शन प्राप्त करते समय r2d2 अपने धागे को ब्लॉक करता है, जो कोर एक्टिक्स-वेब पूल के हिस्से को ब्लॉक करेगा। डेटाबेस प्रश्नों के साथ भी। यदि मैं उस कुंड में धागे रखता हूं तो इससे अधिक प्रश्न करने पर यह सभी एक्टिक्स-वेब को ब्लॉक कर देगा? यदि हां, तो बड़ी समस्या।
फ्यूचर्स-cpupool
अंत में, सुरक्षित शर्त जिसमें कुछ अनावश्यक ओवरहेड हो सकते हैं, वायदा-सीपूल है । मुख्य मुद्दा यह है कि इसका मतलब मेरी परियोजना में एक और टोकरा जोड़ना है, हालांकि मुझे अपने आवेदन में अनावश्यक रूप से तैरने वाले कई सीपीयू-पूल के विचार पसंद नहीं हैं।
चूँकि दोनों r2d2 और डीज़ल को ब्लॉक कर देंगे, इसलिए यहाँ पर आश्चर्यजनक चीजें हैं।
सबसे महत्वपूर्ण बात, इस rpupool को समान r2d2 पूल का उपयोग न करने वाली किसी भी चीज़ के साथ साझा न करें (जैसा कि सभी थ्रेड्स बस r2d2 कनेक्शन के इंतजार में ब्लॉक कर सकते हैं, काम होने पर पूरे पूल को बंद कर सकते हैं)।
दूसरे (थोड़ा और स्पष्ट रूप से), इस प्रकार आपके पास पूल में थ्रेड्स की तुलना में अधिक r2d2 कनेक्शन नहीं होना चाहिए और इसके विपरीत बड़ा होगा क्योंकि संसाधनों को बर्बाद करना होगा (कनेक्शन अप्रयुक्त / थ्रेड लगातार अवरुद्ध) (शायद एक और धागा, शायद जल्दी के लिए। कनेक्शन को cpupool अनुसूचक के बजाय OS अनुसूचक द्वारा सौंप दिया गया)।
अंत में, ध्यान रखें कि आप किस डेटाबेस का उपयोग कर रहे हैं और आपके पास जो प्रदर्शन है। एकल कनेक्शन r2d2 और पूल में एक एकल थ्रेड चलाना एक भारी हेवी साइक्लाइट एप्लिकेशन में सबसे अच्छा हो सकता है (हालांकि मैं इस तरह के लिए एक उचित डेटाबेस की सिफारिश करूंगा)।
पुराने उत्तर
पुराने समाधान जो काम कर सकते हैं
https://www.reddit.com/r/rust/comments/axy0hp/patterns_to_scale_actixweb_and_diesel/
संक्षेप में, फ़्यूचर्स-सीपूल की सिफारिश करता है।
भविष्य के rs में अवरुद्ध I / O को रोकने के लिए सबसे अच्छा तरीका क्या है?
सामान्य मामलों के लिए फ़्यूचर्स-सीपूल की सिफारिश करता है।
पुराने समाधान जो काम नहीं करते हैं
https://www.reddit.com/r/rust/comments/9fe1ye/noob_here_can_we_talk_about_async_and_databases/
एक पुराने एक्टिक्स-वेब संस्करण के लिए एक बहुत अच्छा फिक्स। जिन चीज़ों से मुझे अनुरोध मिल सकते हैं, उनमें अब कोई सीपीयू-पूल नहीं है।
futures-cpupool
है किasync
डीजल में समर्थन की कमी के लिए अनुशंसित समाधान है ।