क्या ग्राफकॉल के कोई नुकसान हैं? [बन्द है]


101

GraphQL के बारे में सभी लेख आपको बताएंगे कि यह कितना अद्भुत है, लेकिन क्या इसके कोई नुकसान या कमियां हैं? धन्यवाद।

जवाबों:


96

नुकसान:

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

लेकिन, इनकी तुलना में ये अधिक हैं:

  • GraphQL सीखना मुश्किल नहीं है
  • अतिरिक्त कोड केवल कुछ KB है
  • एक स्कीमा को परिभाषित करके, आप बाद में बहुत अधिक काम को रोकेंगे बग्स को ठीक करने और बालों के अपग्रेड को
  • वहाँ बहुत सारे लोग हैं, जो ग्राफ़िक्सल पर स्विच कर रहे हैं इसलिए एक समृद्ध पारिस्थितिकी तंत्र है उत्कृष्ट टूलींग के साथ विकसित हो रहा है
  • उत्पादन में लगातार प्रश्नों का उपयोग करते समय (बस एक आईडी और मापदंडों के साथ ग्राफक्यूएल प्रश्नों की जगह), आप वास्तव में कम बाइट भेजते हैं तुलना में
  • आने वाले प्रश्नों के लिए अतिरिक्त प्रसंस्करण नगण्य है
  • एपीआई और बैकएंड की एक स्वच्छ डिकॉउपिंग प्रदान करना बैकएंड इंप्रूवमेंट पर बहुत तेजी से चलना चाहता है

1
"परिणाम प्राप्त करने से पहले आपको स्कीमा को पहले से परिभाषित करना होगा => अतिरिक्त काम" मैं यह नहीं देखता हूं कि यह ग्राफ़िकल के बिना कैसे आवश्यक नहीं है? निश्चित रूप से कुछ भाषाओं में कुछ रूपरेखाओं के साथ इसकी आवश्यकता नहीं है, लेकिन उदाहरण के लिए जावा एपीआई के लिए आपको अभी भी अपने मॉडल में "स्कीमा" का वर्णन करना होगा।
एंटोनीबी

3
@AntoineB आप सही हैं, NodeJS में हालांकि आप समग्र स्कीमा के बारे में कभी सोचे बिना आसानी से REST API बना सकते हैं; बस चीजें वापस करो।
w00t

1
@ w00t और जैसे ही आपको REST के साथ कुछ मापदंडों की आवश्यकता होती है, आप URL की जाँच करने के लिए सहारा लेंगे कि यह जाँचने के लिए कि पैराम का प्रकार सही है, 400 फेंकने पर यदि यह नहीं है। यदि केवल हर रूट हैंडलर में मैन्युअल रूप से ऐसा करने से बचने के लिए कुछ था: D
Capaj

स्प्रिंग बूट के साथ आप बस कुछ कलाकृतियों को खींच सकते हैं graphql-spring-boot-starterऔर graphql-java-toolsआरंभ करने के लिए। अपने स्कीमा को .graphqls संसाधन में बनाएँ और रिज़ॉल्वर कक्षाएं बनाएँ और आपका काम हो गया। एक कामकाजी परीक्षा का उदाहरण पाने के लिए और दौड़ने में लगभग 10 मिनट लगे।
बेबीबर्गर

1
मैं सभी नुकसान पर सहमत नहीं, वास्तव में यह बाहर इस पोस्ट समय चेक के बहुत बचाता है xalitech.com/graphql-how-to-convince-your-boss
Shafqat Ali

59

मैंने किसी के लिए कुछ महत्वपूर्ण चिंताओं को पाया है जिसका उपयोग ग्राफकॉल पर विचार कर रहा हूं , और अब तक मुख्य बिंदु हैं:

अनिश्चितकालीन गहराई में क्वेरी : ग्राफक्लाइन अनिश्चित गहराई में क्वेरी नहीं कर सकती है, इसलिए यदि आपके पास एक पेड़ है और गहराई को जाने बिना एक शाखा वापस करना चाहते हैं, तो आपको कुछ पेजिनेशन करना होगा।

विशिष्ट प्रतिक्रिया संरचना : ग्राफक्लाइन में प्रतिक्रिया क्वेरी के आकार से मेल खाती है, इसलिए यदि आपको बहुत विशिष्ट संरचना में प्रतिक्रिया करने की आवश्यकता है, तो आपको प्रतिक्रिया को फिर से खोलने के लिए एक परिवर्तन परत जोड़ना होगा।

नेटवर्क स्तर पर कैश : आमतौर पर जिस तरह से ग्राफकॉइन का उपयोग HTTP (एक समापन बिंदु पर एक POST) में किया जाता है, उसके कारण नेटवर्क स्तर पर कैश कठिन हो जाता है। इसे हल करने का एक तरीका पर्सेंटेड क्वेरीज़ का उपयोग करना है।

फाइल अपलोडिंग को हैंडल करना: ग्राफकलाइन स्पेसिफिकेशन में फाइल अपलोड के बारे में कुछ भी नहीं है और म्यूटेशन तर्कों में फाइलों को स्वीकार नहीं करता है। इसे हल करने के लिए आप अन्य प्रकार के API (जैसे REST) ​​का उपयोग करके फ़ाइलों को अपलोड कर सकते हैं और अपलोड की गई फ़ाइल के URL को GraphQL म्यूटेशन में पास कर सकते हैं, या फ़ाइल को निष्पादन संदर्भ में इंजेक्ट कर सकते हैं, इसलिए आपके पास रिज़ॉल्वर फ़ंक्शन के अंदर फ़ाइल होगी।

अप्रत्याशित निष्पादन : ग्राफकॉल की प्रकृति यह है कि आप जो भी फ़ील्ड चाहते हैं, उसे संयोजित कर सकते हैं लेकिन, यह लचीलापन मुफ़्त में नहीं है। कुछ चिंताएँ हैं जिन्हें जानना अच्छा है जैसे प्रदर्शन और N + 1 प्रश्न।

सुपर सिंपल एपीआई : यदि आपके पास एक ऐसी सेवा है जो वास्तव में सरल एपीआई को उजागर करती है, तो ग्राफक्यूएल केवल एक अतिरिक्त जटिलता जोड़ेगा, इसलिए एक साधारण रीस्ट एपीआई बेहतर हो सकता है।


2
अनिश्चितकालीन गहराई के लिए, मैं JsonType प्रतिक्रियाओं का सहारा लेता हूं। यह दृढ़ता से टाइप नहीं किया गया है, इसलिए आपको इनपुट की जांच करने की आवश्यकता है, लेकिन यह बहुत आसान हो सकता है।
w00t

3
REST में हमेशा N + 1 क्वेरी समस्या थी। एकमात्र अंतर यह है कि डिज़ाइन द्वारा REST समस्या को हल करने के लिए बैकएंड को भी अस्वीकार कर देता है। इसके बजाय यह समस्या को सीमा पर आगे बढ़ाता है।
कैपज

40

यह सबसे बड़ी समस्या यह है कि मैं अगर तुम संबंधपरक डेटाबेस के साथ प्रयोग कर रहे हैं graphQL यानी के साथ देख के साथ है मिलती है

  1. तथ्य यह है कि आप कुछ क्षेत्रों को अनुमति / अस्वीकार कर सकते हैं, गैर-तुच्छ (सरल नहीं) में मिलती है। जिससे अतिरिक्त प्रश्न उत्पन्न होते हैं।

  2. इसके अलावा ग्राफिकल में नेस्टेड क्वेरीज सर्कुलर क्वेश्चन को लीड करती है और सर्वर को क्रैश कर सकती है । अतिरिक्त देखभाल करनी पड़ती है।

  3. कॉल को सीमित करना मुश्किल हो जाता है coz अब उपयोगकर्ता एक कॉल में कई प्रश्नों को फायर कर सकता है।

TIP : जावास्क्रिप्ट / नोड के मामले में प्रश्नों की संख्या को कम करने के लिए facebook के dataloader का उपयोग करें


1. कैसे चयनित क्षेत्रों को संचालन में शामिल होने के लिए प्रासंगिक है? 2. यदि आप डेटा लोडर का उपयोग नहीं करते हैं। 3. आप costअनुरोध करने के लिए पार्स और असाइन कर सकते हैं। यदि आप पूर्वनिर्धारित प्रश्नों का उपयोग कर रहे हैं, तो भी यह चिंता का विषय नहीं है, जहां ग्राहक केवल आईडी भेजता है।
ज़ोरान404

1
2 के साथ सहमति व्यक्त की। 3 इसके अतिरिक्त काम के साथ और अधिक महत्वपूर्ण बात यह है कि पीपीएल को जागरूक करने की आवश्यकता है।
एवेबडेवलपर

1
2. यह अब सच नहीं है क्योंकि आप अपने सर्वर की सुरक्षा के लिए बहुत सारे उपकरणों का उपयोग कर सकते हैं। उदाहरण के लिए एक लिंक: howtographql.com/advanced/4-security Timeouts, जटिलता और गहराई पर सीमा। तो यह वैसा ही है जैसा कि आप कहेंगे कि आपके रेट डीडीओएस के लिए संभव होंगे यदि आप दर सीमक का उपयोग नहीं करेंगे। चीजें बदल गईं
येवहनी हेरसिमचुक

अद्यतन बिंदु 2
aWebDeveloper

14

यह हर साल बेहतर और बेहतर होता जा रहा है, और अब के लिए, ग्राफक्यूएल का समुदाय बढ़ रहा है, और इसके परिणामस्वरूप, बहुत सारी समस्याओं का बहुत अधिक समाधान है जो पहले अन्य उत्तरों में हाइलाइट किए गए थे। लेकिन स्वीकार करने के लिए क्या अभी भी कंपनियों को पकड़ रहा है सभी संसाधनों को ग्राफक्लाइन से फेंकने के लिए मैं कुछ मुद्दों और समाधानों की सूची बनाना चाहूंगा जिनके बाद अनसुलझी हैं।

  • नेटवर्क स्तर पर कैश - जैसा कि ब्रूनो ने कहा कि यह निरंतर प्रश्न है और निश्चित रूप से आप एक ग्राहक को कैश कर सकते हैं और कोई भी आपको डेटाबेस स्तर या यहां तक ​​कि रेडिस पर कैशिंग का उपयोग करने के लिए नहीं रोकता है। लेकिन निश्चित रूप से ग्राफक्लाइन में केवल एक ही समापन बिंदु है और प्रत्येक प्रश्न अलग है - इस प्रकार के कैशिंग को REST की तुलना में करना अधिक जटिल है।
  • GraphQL में नेस्टेड क्वेरीज़ सर्कुलर क्वेरीज़ की ओर ले जाती हैं और सर्वर को क्रैश कर सकती हैं - कई प्रकार के समाधानों के साथ अब कोई समस्या नहीं है। उनमें से कुछ यहाँ सूचीबद्ध हैं
  • फ़ाइल अपलोड को संभालना हम पहले से ही - बहुत सारे के समाधान के लिए यह

लेकिन कुछ और मामले हैं जिन्हें नुकसान के रूप में गिना जा सकता है:

  • बॉयलरप्लेट की अधिकता (इससे मेरा मतलब है, उदाहरण के लिए नई क्वेरी बनाने के लिए आपको स्कीमा, रिज़ॉल्वर और रिओलवर को परिभाषित करने की आवश्यकता है, स्पष्ट रूप से कहने के लिए कि ग्राफ़कॉक कैसे अपने डेटा और फ़ील्ड को अंदर हल करने के लिए, क्लाइंट साइड पर संबंधित फ़ील्ड से संबंधित क्वेरी बनाएं। यह डेटा)
  • गलती संभालना - मुझे यह कहने की आवश्यकता है कि यह REST के साथ तुलना करने के लिए अधिक संबंधित है। यह यहाँ अपोलो के साथ संभव है, लेकिन साथ ही यह REST की तुलना में बहुत अधिक जटिल है
  • प्रमाणीकरण और प्राधिकरण - लेकिन जैसा कि मैंने कहा कि समुदाय बकाया गति के साथ बढ़ रहा है और पहले से ही कुछ जोड़े हैं समाधान इस लक्ष्य के लिए।

योग करने के लिए, ग्राफकॉल केवल विशिष्ट लक्ष्यों के लिए एक उपकरण है और निश्चित रूप से यह सभी समस्याओं के लिए एक चांदी की गोली नहीं है और निश्चित रूप से आरईएसटी के लिए एक प्रतिस्थापन नहीं है।


4

एक एकल समापन बिंदु और सभी डेटा को उजागर करना वास्तव में बहुत अच्छा है। मैं ग्राफ़िकल के लिए विचार करने के लिए नीचे दिए गए बिंदुओं को खोजता हूं:

  1. फ़ाइल डाउनलोड का कार्यान्वयन / अपलोड मुश्किल हो जाता है (स्ट्रिंग में कनवर्ट करना बड़ी फ़ाइलों के लिए सबसे अच्छा विकल्प नहीं हो सकता है)
  2. फ्रंटएंड और बैकएंड दोनों पर बहुत सारे बॉयलरप्लेट और स्कीमा कोड।
  3. ग्राफकलाइन विनिर्देशन में दिए गए पृष्ठांकन का अनुसरण और समर्थन करें।
  4. खेतों के आदेश के लिए कस्टम ऑर्डर और तर्क को प्राथमिकता दें। उदाहरण यदि हम उपयोगकर्ताओं के डेटा और संबंधित समूहों और भूमिकाओं को प्राप्त करते हैं। उपयोगकर्ता उपयोगकर्ता नाम, समूह का नाम या भूमिका नाम के आधार पर डेटा को बहु-प्रकार कर सकता है।
  5. प्रमाणीकरण और प्राधिकरण बैकएंड ढांचे पर निर्भर करेगा।
  6. बैकएंड ऑप्टिमाइज़ेशन और डेटाबेस समर्थन सुनिश्चित करें कि प्रत्येक ग्राफ़िकल कमांड के लिए एकल क्वेरी को आग लगाने के लिए मुश्किल हो।

इसके कार्यान्वयन के बाद पेशेवरों पर विचार करना चाहिए:

  1. नई वस्तुओं का समर्थन करने और मौजूदा व्यवहार को अपडेट करने के लिए बहुत लचीला।
  2. एक बार लागू होने के बाद तर्कों और कस्टम ऑर्डर का उपयोग करके शर्तों को जोड़ना आसान है

  3. बहुत सारे कस्टम फ़िल्टर का उपयोग करें और उन सभी क्रियाओं से छुटकारा पाएं, जिन्हें बनाने की आवश्यकता है उदाहरण के लिए उपयोगकर्ता के पास आईडी, नाम इत्यादि तर्क के रूप में हो सकते हैं और फ़िल्टरिंग कर सकते हैं। इसके अतिरिक्त फ़िल्टर उपयोगकर्ताओं पर समूहों में भी लागू किए जा सकते हैं।

  4. सभी ग्राफ़कॉल प्रश्नों और म्यूटेशन वाली फ़ाइलों को बनाकर एपीआई की जांच में आसानी।
  5. एक बार समझ में आने के बाद म्यूटेशन सीधा और आसान होता है।
  6. डेटा की कई गहराई लाने का शक्तिशाली तरीका।
  7. मल्लाह और ग्राफिअल यूआई या प्लेग्राउंड का समर्थन देखने और उपयोग करने में आसान बनाता है।
  8. मान्य विवरण विधियों के साथ स्कीमा को परिभाषित करते हुए प्रलेखन में आसानी।

3

मुझे लगता है कि पल के लिए ग्राफक बैकएंड आर्किटेक्चर का हिस्सा होना चाहिए, फ़ाइल अपलोड के लिए आप अभी भी एक नियमित एपीआई हिट करते हैं

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