क्या व्यावसायिक तर्क वास्तव में सर्वर पर हैं?


10

वेब एप्लिकेशन के लिए एक विशिष्ट स्टैक एक डेटाबेस, सर्वर-साइड कोड वाला एक सर्वर, और HTML / CSS / जावास्क्रिप्ट के साथ एक ब्राउज़र वाला उपयोगकर्ता है।

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

अब जब हम एक सर्वर सर्वर स्टैटिक पेज "वेब 2.0" पर जा रहे हैं, जो स्वयं को भरने के लिए जावास्क्रिप्ट का उपयोग करते हैं और जो वे प्रस्तुत कर रहे हैं उसे बदलते हैं। जावास्क्रिप्ट में हो सकता है। जावास्क्रिप्ट अक्सर एक RESTful सेवा को लागू करता है जिसका अर्थ है कि यह डेटाबेस क्वेरी निर्दिष्ट कर रहा है।

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

तो वहाँ से, सर्वर को एक गूंगे मध्यस्थ की भूमिका के लिए फिर से आरोपित किया जाना चाहिए कि केवल कभी-कभार ऐसा कुछ होता है जैसे ईमेल भेजना या एक वेबसर्विस बंद करना? क्या व्यावसायिक तर्क सभी जावास्क्रिप्ट में रहते हैं (जब यह गुप्त नहीं है) या संग्रहीत प्रक्रियाओं में रहते हैं जब यह होता है?

क्या यह संभवत: सर्वर और डेटाबेस को मिलाएगा या सर्वर के रूप में एसएपी फ़ंक्शन जैसे ईआरपी समाधान करेगा?

जवाबों:


14

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

वास्तविक दुनिया एप्लिकेशन हैं जहां वेब सर्वर वेब सेवाओं या JSON के माध्यम से एप्लिकेशन सर्वर के एपीआई को उजागर करने के अलावा कुछ नहीं करता है।

वेब 2.0 और AJAX से पहले भी एएसपी पृष्ठों के साथ अपने व्यापार तर्क को मिलाने के लिए इसे वास्तव में सर्वश्रेष्ठ अभ्यास नहीं माना गया था। एक स्वतंत्र व्यापार तर्क और प्रस्तुति तर्क के सर्वर भाग को एएसपी, जेएसपी, या जो कुछ भी होना बेहतर माना जाता था। तो वेब 2.0 से वास्तविक परिवर्तन यह है कि प्रस्तुति परत पूरी तरह से जावास्क्रिप्ट में हो सकती है। मुझे व्यक्तिगत रूप से पसंद है।


खैर, हां, मैं मानता हूं कि व्यावसायिक तर्क एक एएसपी में नहीं होना चाहिए। यह एमवीसी की बात है।
जो

यह उत्तर लगभग दो साल पहले से है, और अब स्प्राउटकोर जैसी चीजें सभी क्रोध हैं। स्प्राउटकोर की वेबसाइट पर, वे स्पष्ट रूप से लक्ष्य को ब्राउज़र के लिए व्यावसायिक तर्क को स्थानांतरित करने के लिए कहते हैं (देखें: sproutcore.com/.com/outout )। तो ... क्या अब वेब की स्थिति बदल गई है? क्या क्लाइंट पर व्यावसायिक तर्क (विशेष रूप से ब्राउज़र में जेएस के माध्यम से) ठीक है या शायद बेहतर भी है?
जोकूल

@JoeCool स्प्राउटकोर तब मौजूद था। और ग्राहक पर व्यावसायिक तर्क रखने की सुरक्षा संबंधी सोच नहीं बदली है। लेकिन सभी अनुप्रयोगों में बहुत अधिक सुरक्षा चिंताएं नहीं हैं। इसके अलावा, "ऑल द रेज" स्प्राउटकोर के लिए बहुत ओवरस्टेटेड लगता है। लेकिन क्लाइंट पर और अधिक करने की व्यवहार्यता बढ़ गई है - मोबाइल डिवाइस को छोड़कर प्रमुखता हासिल करना जारी रखा है और वे कई अनुप्रयोगों के लिए प्रदर्शन-वार चुनौती दे रहे हैं।
psr

@psr दी गई - लेकिन आपको बस ग्राहक में व्यावसायिक तर्क का उपयोग करके पूरी तरह से ब्रश करना प्रतीत होता है, जब वास्तव में कम से कम कुछ लोकप्रिय प्रौद्योगिकियां आज उस दिशा में विशिष्ट रूप से बढ़ रही हैं।
जोकूल

6

जावास्क्रिप्ट अक्सर एक RESTful सेवा को लागू करता है जिसका अर्थ है कि यह डेटाबेस क्वेरी निर्दिष्ट कर रहा है।

यह वह जगह है जहां आपको यह गलत लगा। REST CRUD नहीं है

REST द्वारा उजागर किए गए संसाधन आपके डेटाबेस रिकॉर्ड नहीं हैं; वे पूरी तरह से प्रबंधित ऑब्जेक्ट हैं जो आपके व्यावसायिक तर्क के अनुसार व्यवहार करते हैं। जब सर्वर को एक POST या PUT प्राप्त होता है, तो इसे केवल मान्य और संग्रहीत नहीं किया जाना चाहिए। यह आवेदन के लिए उपयुक्त कुछ भी करना है।

सरल उदाहरण: एक ट्विटर जैसी ऐप किसी दिए गए कंटेनर पर POST संदेशों के रूप में ट्वीट प्राप्त करती है। सर्वर तब संदर्भ का विश्लेषण करता है ("आप कौन हैं?", "कौन सा चैनल यह है?") और सामग्री ("कोई हैशटैग?", पाठ सूचकांक, आदि) और संबंधित कतारों में यह सब संग्रहीत करता है। संभवतः अपने सभी अनुयायियों के लिए सीधे एक संदर्भ जोड़ता है।

कंटेनर में संसाधन जोड़ने से परे यह बहुत काम है, यह सब आपके व्यवसाय तर्क द्वारा परिभाषित किया गया है। और यह सर्वर पर आता है।


2

इस दृष्टिकोण के साथ मेरी चिंताएं आपके डिजाइन की गलतफहमी के कारण हो सकती हैं, इसलिए कृपया मुझे नीचे गोली मारने के लिए स्वतंत्र महसूस करें।

हालाँकि, उत्पाद की मापनीयता, रखरखाव और सुरक्षा के बारे में सोचें।

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

Webbrowswers पर चलने वाले जावास्क्रिप्ट में व्यावसायिक तर्क को बनाए रखने के बारे में सोचा, जहां अलग-अलग ब्राउज़र अलग-अलग javascriopt, ब्राउज़रों के कई संस्करणों आदि को फिर से बनाएंगे ... क्यों यह मुद्दा पहले से कहीं अधिक जटिल है?

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


ब्राउज़र संगतता समस्या को रिश्वत देने के लिए +1। इसके अलावा, जावास्क्रिप्ट में व्यापार कोड लिखने के लिए एक अतिरिक्त कौशल की आवश्यकता होती है और आपको अपने व्यावसायिक वर्गों में विधियों का उपयोग नहीं करने देता है।
NoChance

2

जबकि इस पर विचार के कई स्कूल हैं, और निश्चित रूप से कोई भी तरीका सार्वभौमिक रूप से "सही तरीका" नहीं कहा जा सकता है, जबकि अन्य सभी सार्वभौमिक रूप से "गलत तरीके" हैं, सर्वर साइड पर व्यावसायिक तर्क को अलग करने के कई कारण हैं। , और उन वस्तुओं और सेवाओं को एक RESTful सेवा के माध्यम से एक्सेस करें।

संक्षिप्त उत्तर यह है कि यह ज्यादातर जोखिम प्रबंधन, और प्रदर्शन की निगरानी और सुधार के बारे में है।

विस्तार से:

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

संख्या 2 का कारण चिंताओं का पृथक्करण है। आपके जावास्क्रिप्ट प्रोग्रामर सुरक्षा के विशेषज्ञ नहीं हो सकते हैं, और आपके सुरक्षा गुरु जावास्क्रिप्ट में बहुत अच्छे नहीं हो सकते हैं। व्यावसायिक तर्क को प्रस्तुति तर्क से अलग करने से, आप इन चिंताओं को पार करने से बचते हैं, क्योंकि जावास्क्रिप्ट को इसके अनुमति स्तरों से परे संसाधनों तक पहुंचने की अनुमति नहीं दी जाएगी, और त्रुटियां दी जाएंगी, जिनमें से संभालना स्क्रिप्ट प्रोग्रामर के नियंत्रण में है। इसी तरह, सुरक्षा आदमी जावास्क्रिप्ट को डिबगिंग नहीं करेगा यह देखने के लिए कि कैसे सुरक्षा बनाए रखी जाती है।

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

यहां एक कोरोलरी यह है कि अक्सर कई व्यावसायिक प्रक्रियाएं समान डेटा का उपयोग करेंगी, और इसलिए आप समग्र सिस्टम लोड को कम करने के लिए सर्वर साइड पर कैशिंग को लागू कर सकते हैं जो क्लाइंट साइड कोड एक्सेस देने के लिए संभव / सुरक्षित नहीं हो सकता है।

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

सर्वर साइड बिज़नेस लॉजिक ज्यादातर ACID अपडेट सुनिश्चित करने के लिए तुच्छ होता है, क्योंकि किसी भी भाषा के लिए किसी एप्लिकेशन या डेटाबेस स्तर पर लेनदेन को बनाए रखने के लिए कोई ढांचा होता है। यदि आप वेब क्लाइंट से कई अपडेट के माध्यम से ऐसा कर रहे हैं ... आप किसी बिंदु पर असंगत स्थिति प्राप्त करने जा रहे हैं, और यह संभवत: आपके एप्लिकेशन को प्रभावित करने वाला है।

हालांकि यह डेटाबेस तक पहुँचने के लिए रैस्टफुल सेवाओं के बारे में सोचने के लिए लुभावना हो सकता है, आपको इस फंदे में नहीं पड़ना चाहिए, क्योंकि यह आपदा का एक अच्छा नुस्खा है। RESTful सेवा के माध्यम से आप जिस ऑब्जेक्ट मॉडल को उजागर करते हैं, वह आपके डेटाबेस से संबंधित हो सकता है, लेकिन वास्तव में इसे CRUD इंजन के रूप में उपयोग करने के बजाय अपने व्यापार तर्क को एनकोड करना चाहिए।


कई अच्छे अंक जुटाने के लिए +1। उदाहरण के रूप में आपके द्वारा उपयोग की गई बिलिंग प्रणाली में सबसे अजीब डिजाइन है जो मैंने कभी सुना है।
NoChance

इसका सबसे अजीब नाम था जिसे मैंने भी सुना है, हालांकि मैं अभी भी इसके चारों ओर लटका हुआ संदर्भ देखता हूं। इसे HURLnet ISP व्यवस्थापक कहा जाता था, और इसे बनाए रखने के लिए काफी कड़वा था। हमारे पास एक पूर्ण स्रोत कोड लाइसेंस था, और मैंने इसका समर्थन करने से रोकने के बाद बड़े पैमाने पर इसका उपयोग किया।
SplinterReality
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.