2016-04-25 21 views
11

प्ले फ्रेमवर्क एक उचित आकार थ्रेड पूल के आईओ अवरुद्ध रिले करने, के रूप में सलाह देता है के लिए व्यवहार:प्ले फ्रेमवर्क और Node.js गैर अवरुद्ध रिलेशनल डेटाबेस

https://www.playframework.com/documentation/2.5.x/ThreadPools

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

मैं वर्तमान में नोड.जेएस के बारे में सीख रहा हूं और मुझे पता नहीं लगा कि यह नोड में कैसे संभाला जाता है। मुझे नोड में थ्रेड पूल के बारे में सोचने के लिए कोड की आवश्यकता नहीं थी।

तो, क्या नोड-जेड में गैर-अवरुद्ध आईओ करने में सक्षम रिलेशनल डेटाबेस ड्राइवर हैं? या क्या इन गणनाओं को दृश्यों के पीछे किसी प्रकार के कार्यकर्ता धागे से रिले किया जा रहा है?

व्यापक अर्थ पर: एक नोड.जेएस ऐप को कोड करने का सही तरीका क्या है जो बहुत डीबी (रिलेशनल) गहन है?

+0

उस बारे में एक लेख है जिसे आप [आनंद ले सकते हैं] (https: //engineering.linkedin।कॉम/प्ले/प्ले-फ्रेमवर्क-एसिंक-आईओ-बिना थ्रेड-पूल-एंड-कॉलबैक-नरक) –

+0

इस प्रश्न पर एक नज़र डालें, यह आपकी समझ को स्पष्ट करने में मदद कर सकता है कि कैसे नोड हुड के नीचे काम करता है, लेकिन उत्तर देने के लिए आपका प्रश्न, सभी नोड डीबी ड्राइवर जिन्हें मैं गैर-अवरुद्ध आईओ इंटरफेस/libuv async इवेंट लूप का उपयोग करने के बारे में जानता हूं ... आपको आवेदन स्तर पर इसे लागू करने के बारे में चिंता करने की ज़रूरत नहीं है: http://stackoverflow.com/questions/14795145/कैसे-एकल-थ्रेडेड-गैर-अवरुद्ध-io-model-works-in-node-js – photoionized

उत्तर

2

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

व्यापक सवाल का जवाब है:

वहाँ कैसे आप डीबी NodeJS या जावा में गहन क्षुधा कोड, के रूप में संभवत: अपने टोंटी मंच की परवाह किए बिना अपने डीबी के पीछे लगातार भंडारण हो जाएगा के बीच ज्यादा अंतर नहीं है। लेकिन अतुल्यकालिक आर्किटेक्चर में:

  1. यह एक ऐसी प्रणाली है कि एक DB मंदी के मामले में बहुत ज्यादा लोड

  2. के साथ अपने डीबी पराजित नहीं है डिजाइन करने के लिए और अधिक प्राकृतिक है, आवेदन ही आमतौर पर मांग नहीं करेंगे अधिक सिस्टम संसाधन

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

3

नोड एकल थ्रेडेड है इसलिए कोई उपयोगकर्ता थ्रेड पूल [1] नहीं है। इसके बजाय आपको अधिक नोड सर्वर के साथ क्षैतिज पैमाने पर स्केल करने की आवश्यकता है। और आप इसे नोड ऐप के भीतर कर सकते हैं: https://devcenter.heroku.com/articles/node-concurrency

और एक और नोट पर, मुझे एसिंक-जेडीबीसी-आईएसएच postgresql-async ड्राइवर के साथ अच्छी सफलता मिली है। मैंने इसे jdub-async और scalikejdbc के साथ उपयोग किया है। (लेकिन आप वेब श्रमिकों का उपयोग कर सकते धागे के लिए) लेकिन libuv मल्टी-थ्रेडेड है https://www.jamesward.com/2015/04/07/reactive-postgres-with-play-framework-scalikejdbc


[1] उपयोगकर्ता कोड एकल थ्रेड चलाता है: यहाँ एक ब्लॉग मैं scalikejdbc साथ यह प्रयोग पर लिखा है। और पढ़ें: How the single threaded non blocking IO model works in Node.js

+0

ns.js के लिए mysql मॉड्यूल https://www.npmjs.com/package के अनुसार कनेक्शन पूल का उपयोग कर सकता है/mysql # पूलिंग-कनेक्शन शायद node.js इसके लिए आंतरिक थ्रेड पूल का उपयोग करता है? – Renan

+0

यहां एक और पूरक संदर्भ है जिसमें कहा गया है कि node.js बहु-थ्रेडेड है (आपका कोड, हालांकि, एक थ्रेड में चलता है): http://rickgaribay.net/archive/2012/01/28/node-is-not- एकल-threaded.aspx – Renan

+0

हाँ, libuv में एक थ्रेड पूल है इसलिए नेटवर्क IO समरूपता हो सकती है। लेकिन भले ही आपके पास कनेक्शन पूल हो, लेकिन इसका मतलब यह नहीं है कि आपको प्रति कनेक्शन धागा मिलता है। जांचें: https://www.future-processing.pl/blog/on-problems-with-threads-in-node-js/ –

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