टीसीपी / आईपी अनुप्रयोगों की तुलना HTTP अनुप्रयोगों बनाम [बंद]


13

मैं एक बड़े पैमाने पर उपयोगकर्ता-सामना करने वाली वेबसाइट विकसित करने में रुचि रखता हूं जो जावा में लिखा गया है।

डिजाइन के लिए, मैं स्वतंत्र, मॉड्यूलर सेवाओं को विकसित करने के बारे में सोच रहा हूं जो मेरे मुख्य वेब एप्लिकेशन के लिए डेटा प्रदाताओं के रूप में कार्य कर सकते हैं।

इन मॉड्यूलर सेवाओं (डेटा प्रदाताओं) को लिखने के लिए, मैं स्प्रिंग की तरह मौजूदा ढांचे का लाभ उठा सकता हूं और इन सेवाओं को Restful डिजाइन पैटर्न के बाद विकसित कर सकता हूं, और JSON जैसे संदेश प्रारूप के साथ HTTP के माध्यम से संसाधनों को उजागर कर सकता हूं ... या मैं मौजूदा नेटवर्क का लाभ उठा सकता हूं Netty ( http://netty.io/ ) और क्रमांकन प्रारूप जैसे Protobufs ( https://developers.google.com/protocol-buffers/docs/overview ) की तरह और एक टीसीपी सर्वर विकसित करता है जो आगे और आगे क्रमबद्ध प्रोटूफ़्यूफ़ को भेजता है पेलोड।

आपको कब एक का चयन करना चाहिए? क्या प्रोटोबॉफ़्स जैसे धारावाहिक प्रारूप का उपयोग करने और तार पर बाइट्स की धारा भेजने का कोई लाभ होगा? क्या JSON के उपयोग से ओवरहेड होगा? टीसीपी / आईपी का उपयोग करने और HTTP का उपयोग करने के बीच कितना ओवरहेड है? आपको ऐसी सेवा का निर्माण करने के लिए स्प्रिंग का उपयोग कब करना चाहिए?


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

3
मुझे नहीं लगता कि ओपी हमें उसके लिए एक विकल्प बनाने के लिए कह रहा है। वह केवल उच्च-स्तरीय प्रश्न पूछ रहा है कि इस तरह के विकल्प कैसे बनाए जाते हैं और किन कारकों पर विचार किया जाता है। लगता है कि वहाँ एक उच्च स्तरीय उत्तर प्रदान करने के लिए कुछ भी गलत नहीं है .... और मैंने किया।
DXM

जब तक आपको वास्तव में नहीं करना है, मैं आमतौर पर द्विआधारी प्रारूपों का उपयोग करने का विरोध करता हूं। कोई द्विआधारी फ़ाइल प्रारूप, कोई बाइनरी धारावाहिकों आदि, उदाहरण के लिए, जावा में, द्विआधारी क्रमबद्धता जावा संस्करणों और आपके स्वयं के सॉफ़्टवेयर के संस्करणों के बीच असंगति का कारण नहीं बनती है, लेकिन मेरा मानना ​​है कि XML लगभग उतना नहीं है। मुझे लगता है कि निम्नलिखित टीसीपी / आईपी> एचटीटीपी> एक्सएमएल निश्चित रूप से, यह इस बात पर निर्भर करेगा कि आप क्या कर रहे हैं। मुझे लगता है कि JSON XML का एक विकल्प है। मुझे स्प्रिंग या नेट्टी के बारे में ज्यादा जानकारी नहीं है, हालांकि मैं पढ़ता हूं कि लोग स्प्रिंग का इस्तेमाल कर रहे हैं।
कायडेल

+1 DXM, मैं इस तरह के निर्णय लेने के बारे में सोचते समय विचार के लिए भोजन के रूप में उच्च-स्तरीय प्रश्न पूछ रहा हूं।
HiChews123

जवाबों:


21

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

पहली नज़र में अगर कोई चीज़ किसी चीज़ की तुलना में 10-100 गुना धीमी है, तो आपको घुटने में झटका लग सकता है और "तेज़ बात" हो सकती है। हालांकि, यह गति अंतर केवल प्रोटोकॉल में ही है। यदि सर्वर की तरफ डेटाबेस / फ़ाइल का उपयोग होता है, तो यह ट्रांसफर लेयर की आपकी पसंद से प्रभावित नहीं होगा। कुछ मामलों में, यह आपकी स्थानांतरण परत की गति को बहुत कम महत्वपूर्ण बना सकता है।

HTTP REST और JSON कई कारणों से अच्छे हैं:

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

टीसीपी / आईपी पर प्रोटॉफ्यूज़:

  • वे तेज हैं

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

जहाँ तक नेट्टी बनाम स्प्रिंग जाता है। मैंने सीधे नेट्टी का उपयोग नहीं किया है, लेकिन मेरा मानना ​​है कि यह सिर्फ एक हल्के वजन वाला वेब सर्वर है, जहां स्प्रिंग एक ऐसा ढांचा है जो आपके लिए बहुत कुछ प्रदान करता है। इसमें डेटा एक्सेस लेयर, बैकग्राउंड जॉब शेड्यूलिंग और (मुझे लगता है) MVC मॉडल है, इसलिए यह बहुत अधिक हैवीवेट है। कौन सा चुनना है? यदि आपने HTTP रास्ता तय किया है, तो अगला सवाल संभव है कि आपका ऐप कितना मानक है? यदि आप कुछ पागल कस्टम तर्क लिखने वाले हैं जो मानक मोल्ड में फिट नहीं होते हैं और आपको केवल एक HTTP सर्वर परत की आवश्यकता है, तो Netty के साथ जाएं।

हालाँकि, मुझे संदेह है कि ऐप आपके लिए विशेष नहीं है और यह संभवतः बहुत सी चीजों से लाभान्वित हो सकता है जो स्प्रिंग को प्रदान करना है। लेकिन इसका मतलब है कि आपको अपने ऐप को स्प्रिंग के ढांचे के आसपास बनाना चाहिए और उन चीजों को करना चाहिए जो वे आपसे करने की उम्मीद करते हैं, जिसका मतलब होगा कि आपके उत्पाद में गोता लगाने से पहले स्प्रिंग के बारे में अधिक सीखना। सामान्य तौर पर फ्रेमवर्क बहुत अच्छे होते हैं क्योंकि फिर से वे आपको तेजी से जमीन से दूर कर देते हैं, लेकिन नकारात्मक पक्ष यह है कि आपको अपना डिज़ाइन करने के बजाय उनके सांचे में फिट होना होगा और फिर फ्रेमवर्क को बस काम करने की उम्मीद करनी चाहिए।

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


1
+1, विशेष रूप से "यह गति अंतर केवल प्रोटोकॉल में ही है। यदि सर्वर / साइड पर डेटाबेस / फ़ाइल एक्सेस है, तो यह ट्रांसफर लेयर की आपकी पसंद से प्रभावित नहीं होगा"। 99% यह ठीक है कि यह कैसे होगा, और समय से पहले अनुकूलन (गलत जगह पर) इसके साथ बिल्कुल भी मदद नहीं करेगा।
शिवन ड्रैगन

दोनों की तुलना पर आपकी लंबी प्रतिक्रिया और गहन विश्लेषण के लिए धन्यवाद। मैं Restful एप्लिकेशन के निर्माण के लाभों को समझता हूं क्योंकि यह सार्वजनिक ग्राहकों द्वारा आसानी से उपभोग योग्य है। इस मामले में, हालांकि मैं सब कुछ घर में रखना चाहता हूं और सेवा को उजागर नहीं करना चाहता (मैं क्रमांकन / विचलन का ख्याल रखता हूं), मैं यह नहीं देख सकता कि कस्टम बाइनरी प्रोटोकॉल का उपयोग क्यों नहीं पहली पिक होगी। हां, आप मौजूदा रूपरेखाओं के साथ तेजी से जमीन से बाहर निकल सकते हैं, लेकिन उनके एपीआई और कम महीन दाने वाले नियंत्रण में बंद होने की कीमत पर।
HiChews123

REST सभी ग्राहकों द्वारा उपभोग करना आसान है, न केवल सार्वजनिक रूप से, बल्कि वे निश्चित रूप से शामिल हैं। मेरी कंपनी का एक उत्पाद है जिसे हम अब लगभग एक साल से बना रहे हैं। हमारे पास "स्वामित्व" प्रोटोकॉल था जो कि बाकी था। हमने इसे दूसरों के लिए खोल दिया। एक चीज जो वे आपको बिजनेस स्कूल में पढ़ाते हैं, वह है "विकल्प सोच", निर्णय लेने के लिए आपको अधिक से अधिक विकल्प छोड़ना चाहिए ताकि आप बाद की तारीख में निर्णय ले सकें। तो सभी सेट समान दिए गए, मैं REST नहीं चुनूंगा क्योंकि मेरे पास आज JS क्लाइंट या API एक्सेस है, लेकिन अगर मुझे इसकी आवश्यकता है तो भविष्य में मेरे पास इसका विकल्प होगा। फिर से, यदि ...
DXM

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

@DXM, शानदार प्रतिक्रियाएं, ब्रावो!
HiChews123

0

यह वास्तविक एक गैर प्रश्न है। इंटरनेट प्रोटोकॉल के अनुसार सूट tcp ट्रांसपोर्ट लेयर में एक प्रोटोकॉल है और http एक एप्लीकेशन लेयर में प्रोटोकॉल है। आप एक दूसरे के साथ पूरी तरह से अलग चीजों की तुलना कर रहे हैं। (यहां और देखें: http://en.wikipedia.org/wiki/Internet_protocol_suite )

वास्तव में, अधिकांश http tcp / ip पर है। तो अपने प्रश्न का उत्तर देने के लिए, हाँ आपको tcp / ip का उपयोग करना चाहिए। फिर आप उस (जैसे http) और फिर एक डेटा प्रारूप (जैसे json, xml, html) पर एक एप्लीकेशन लेयर प्रोटोकॉल जोड़ना चाहते हैं। Netty आपको http और protobuff का उपयोग करने देती है, यह json, xml, html के बराबर है।

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

डेटा प्रतिनिधित्व प्रारूप (json, xml, html, protobuff, आदि) चुनने के लिए यह आपके बैंडविड्थ, पठनीयता, भाषा / उपकरण समर्थन आदि पर निर्भर करता है।

आप HTTP की तुलना tcp से नहीं कर सकते।

याद रखें कि गति ही सब कुछ नहीं है। यदि आप खुद को समझदार तरीके से व्यक्त नहीं कर सकते तो गति का कोई फायदा नहीं है।


5
उनके सवाल में ऐसा कुछ नहीं है जो बताता है कि उन्हें नेटवर्किंग स्टैक की परतों के बीच का अंतर नहीं पता है। उन्होंने पूछा कि क्या उन्हें HTTP (तथ्य यह है कि HTTP टीसीपी / आईपी के ऊपर एक परत है) का उपयोग करना चाहिए या अपने स्वयं के कस्टम प्रोटोकॉल के साथ टीसीपी / आईपी का उपयोग करना चाहिए। उनके सवाल में कुछ भी गलत नहीं है।
माइकल

मैं निश्चित रूप से असहमत हूं। यही नहीं मैंने उसे कैसे समझा
iveqy

1
हां, मैं समझता हूं कि HTTP टीसीपी / आईपी से ऊपर एक परत पर है, मेरा प्रश्न वास्तव में ट्रेडऑफ के संदर्भ में निर्णय लेने के बारे में सोचने के बारे में है - विलंबता, विकास की गति, आदि। मेरे बारे में सोचने के लिए प्रश्न प्रस्तुत करने के लिए धन्यवाद!
HiChews123

2
@ acspd7 मैं अपना स्वयं का प्रोटोकोल बनाने से बचूँगा, वहाँ पहले से ही सिद्ध प्रोटोकोल बहुत हैं और जब तक आपका प्रोटोकोल ऐसा कुछ नहीं है जो आपको अपने प्रतिद्वंद्वियों पर लाभ देगा, आप शायद एक मानक प्रोटोकोल के साथ बेहतर हैं। मैंने एक कस्टम प्रोटोकोल लागू किया है, यह बहुत मज़ेदार था! हालाँकि एन्क्रिप्शन, होल पंचिंग, अलाइव्स, हैंडशेकिंग (अलग-अलग नेटवर्क के लिए अलग-अलग फ्रेमलैम की आवश्यकता होती है) आदि। यह चीजों को अच्छा करने के लिए बहुत काम की चीज है। सभी दस्तावेजों का उल्लेख करने की आवश्यकता नहीं है। कुछ कस्टम करने से पहले सोचें कि आपको वास्तव में सुविधाओं में क्या चाहिए।
iveqy

1
GPB अच्छी तरह से प्रलेखित है, कई अन्य लोगों द्वारा उपयोग किया जाता है इसलिए मैं वास्तव में इसका उपयोग करने के साथ कोई समस्या नहीं देख सकता हूं। XML और JSON की तुलना में अधिक सुरीली होना बहुत अच्छा होना चाहिए! (आप मानव पठनीयता में कमी हो सकती है, लेकिन अगर यह आवश्यकता नहीं है ...)। हालाँकि, क्या आपको एक परत याद नहीं है? आमतौर पर आप tcp और xml, json, protobuff के बीच एक परत रखते हैं। Http, ssh, आदि जैसे कुछ
iveqy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.