क्या डीजल को सिंक एक्टर, एक्टिक्स_वेब :: वेब :: ब्लॉक या फ्यूचर-सीपूल का उपयोग करके चलाया जाना चाहिए?


10

पृष्ठभूमि

मैं 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डीजल में समर्थन की कमी के लिए अनुशंसित समाधान है ।
JMB

यह एक सामान्य समाधान का अधिक है। मैं ऐसी चीज की आशा करता हूं जो एक्टिक्स प्रणाली का लाभ उठाएगा। कोई भी कम नहीं, मैं मुद्दों की तलाश के लिए अब वायदा-सीपीयूपी में खुदाई करूंगा।
13

ढेर अतिप्रवाह में आपका स्वागत है! ऐसा लगता है कि आपके प्रश्न का उत्तर भविष्य के rs में अवरोध I / O को अवरुद्ध करने के लिए सबसे अच्छा तरीका क्या है, के उत्तर से हो सकता है ? । यदि नहीं, तो मतभेदों को समझाने के लिए कृपया अपने प्रश्न को संपादित करें। अन्यथा, हम पहले से ही उत्तर के रूप में इस प्रश्न को चिह्नित कर सकते हैं।
शेमपस्टर

चूँकि cpupool r2d2 में अवरोधक कनेक्शन पूल के साथ इंटरैक्ट करता है, इसलिए मैं इस बात को लेकर अनिश्चित हूं कि इसे कैसे हल किया जाए। मैं अब खुद इसे देख रहा हूं और जल्द ही इसके साथ अपडेट करूंगा।
लॉगिना

जवाबों:


3

मैं वायदा-सीपपूल के साथ जा रहा हूं। यह मेरी बातचीत की अवरुद्ध प्रकृति के कारण सबसे अच्छा समाधान है।

Actix_web :: web :: block का उपयोग करना काफी अच्छा है, लेकिन actix में एक साझा थ्रेड-पूल का उपयोग करेगा (और अवरुद्ध कॉल के कारण मैं इसका उपयोग पूरे थ्रेड पूल को ब्लॉक कर सकता हूं और actix_web को दिए गए अन्य कार्यों में हस्तक्षेप कर सकता हूं)।

केवल डेटाबेस इंटरैक्शन के लिए प्रति डेटाबेस एक अलग थ्रेडपुल बनाने के लिए फ्यूचर्स-सीपीपूल का उपयोग करना बेहतर है। इस तरह आप एक पूल में एक दूसरे के लिए प्रतीक्षा करने की आवश्यकता वाले सभी कार्यों (जब कनेक्शन से अधिक कार्य होते हैं) को किसी भी अन्य कार्यों को अवरुद्ध करने से रोकते हैं, जो कनेक्शन की आवश्यकता नहीं है और संभावित रूप से थ्रेड्स की संख्या को सीमित करते हैं। कनेक्शनों की संख्या (ताकि कार्य केवल तब ही शेड्यूल किया जाएगा जब उसे ब्लॉक नहीं किया जाएगा)।

उस स्थिति में जहां आप केवल एक डेटाबेस कनेक्शन (या बहुत कम) का उपयोग करना चाहते हैं, सिंक अभिनेता एक बहुत अच्छा विकल्प है। यह एक धागे के साथ वायदा-कूपपूल की तरह काम करेगा, यह सुनिश्चित करेगा कि सभी कार्य एक समय में एक ही चलाए जा रहे हैं, सिवाय इसके कि यह एक अलग के बजाय एक्टिक्स-वेब के अंतर्निहित थ्रेड्स में से एक का उपयोग करेगा (इसलिए, केवल बहुत कम कनेक्शन के लिए अच्छा है) । मैं बॉयलरप्लेट को इसके लायक होने के लिए बहुत बड़ा पाता हूं, हालांकि।


6
ऊपर मेरी निष्कर्ष पढ़ने के लिए प्रासंगिक कृपया पुट जानकारी - जवाब में जवाब , नहीं प्रश्न।
शेमपस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.