2012-09-28 17 views
7

मैं ऐसे डेटाबेस में कॉल करना चाहता हूं जिसमें बहुत सारे डेटा हैं और इसमें कुछ समय लग सकता है।डेटाबेस एक्सेस के लिए प्ले और अक्का और अवरुद्ध थ्रेड्स

मैं उस काम को Akka.future (f) पर कॉल करने की योजना बना रहा हूं और काम पूरा होने पर प्रतिक्रिया प्रस्तुत करने के लिए एक Async {} का उपयोग करता हूं।

क्या ऐसा करने के लिए यह समझ में आता है, या क्या मुझे अक्का में काम भेजने के बिना नियंत्रक में लंबे डेटाबेस कॉल करना चाहिए?

या डेटाबेस को अवरुद्ध करने के लिए कोई तरीका नहीं है?

उत्तर

1

यदि डेटाबेस कॉल के पूरा होने पर प्रतिक्रिया अवरुद्ध है, तो कॉल को चलाने के दौरान प्रतिक्रिया को इकट्ठा करने के लिए आप अन्य काम कर सकते हैं, तो यह केवल अतुल्यकालिक बनाने के लिए उपयोगी है।

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

+0

डीबी कॉल ब्लॉक और मेरे आने वाले अनुरोध के लिए मेरे पास कोई अन्य काम नहीं है। लेकिन प्ले सर्वर स्वयं ही आने वाले अनुरोध को मध्य समय में संभाल सकता है। लेकिन अगर मैं अक्का को भविष्य भेजता हूं। भविष्य (काम), तो यह उसी धागे से संभाला जाता है जो किसी भी नए आने वाले अनुरोधों को संभालेगा, इसलिए मुझे नहीं लगता कि यह अक्का को पास करके कोई फर्क नहीं पड़ता। वास्तव में यह अतिरिक्त ओवरहेड भी पैदा कर सकता है। क्या इसका कोई मतलब है? –

+1

हां, मुझे लगता है कि यह समझ में आता है। डेटाबेस कॉल पर आईओ को अवरुद्ध करने का मानना ​​है, यह पूरा होने तक एक धागा पर कब्जा करेगा। मुझे नहीं पता कि बहुत अच्छी तरह से खेलते हैं, लेकिन इसे किसी भी उचित वेब ढांचे को अतिरिक्त अनुरोधों की सेवा से नहीं रोका जाना चाहिए। किसी अन्य ऐप के साथ डीबी सर्वर से पैकेट की प्रतीक्षा करते समय अन्य थ्रेड सीपीयू पर निर्धारित किए जा सकते हैं, और प्ले में थ्रेड का पूल उपलब्ध होना चाहिए। अगर यह समझ में आता है तो जवाब स्वीकार करें। =) – spieden

2

आप Akka.future(f) का उपयोग कर सकते हैं और अपने डेटाबेस एक्सेस को संसाधित करने के लिए और अधिक थ्रेड प्राप्त करने के लिए अपनी स्वयं की एक्का कॉन्फ़िगरेशन फ़ाइल प्रदान कर सकते हैं। उदाहरण के लिए this config file देखें।

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

संपादित करें: आप कार्यकर्ता धागे संख्या को ट्यून करने के लिए "Configuring Playframework's internal Akka system" भी देख सकते हैं।

+0

मैं MySQL के साथ फंस गया हूं ..., लेकिन ऐसा लगता है कि एसिंक एपीआई भी है! क्या उस कॉन्फ़िगरेशन फ़ाइल के लिए प्रलेखन है? –

+0

चूंकि यह कॉन्फ़िगरेशन फ़ाइल वास्तव में अक्का के लिए है, इसलिए आप [अक्का कॉन्फ़िगरेशन दस्तावेज़] (http://doc.akka.io/docs/akka/2.0.3/general/configuration.html) पढ़ सकते हैं। –

+0

मैं इस [डॉक्टर] का उल्लेख करना भूल गया (http://www.playframework.org/documentation/2.0।3/अक्काकायर) भी ([प्लेफ्रेमवर्क की आंतरिक अक्का प्रणाली को कॉन्फ़िगर करना] (http://www.playframework.org/documentation/2.0.3/AkkaCore))। –

4

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

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

संबंधित मुद्दे