2008-11-06 11 views
15

java.net से java.nio में स्विच करना बेहतर है? .NET (माइक्रोसॉफ्ट इकाई नहीं) समझना आसान है और अधिक परिचित है, जबकि एनओओ स्केलेबल है, और कुछ अतिरिक्त निफ्टी सुविधाओं के साथ आता है।java.net बनाम java.nio

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

मुझे लगता है कि एक तीसरा विकल्प MINA का उपयोग करना है, लेकिन मुझे यकीन नहीं है कि यह एक साधारण समस्या पर बहुत अधिक फेंक रहा है या नहीं।


प्रत्येक दूरस्थ सर्वर को 8 कनेक्शन सभी एक ही ग्राहक से (सभी हार्डवेयर, और अलग TX/RX सॉकेट नियंत्रित करने के लिए) होगा,। हालांकि, एक ही ग्राहक कई सर्वरों से एक साथ कनेक्ट करना चाहता है। प्रत्येक सर्वर को विभिन्न बंदरगाहों पर डालने के बजाय, क्या क्लाइंट साइड पर चैनल चयनकर्ताओं का उपयोग करना संभव है, या क्या चीजों के क्लाइंट साइड पर बहु-थ्रेडेड io जाना बेहतर है और सर्वर को अलग-अलग कॉन्फ़िगर करना बेहतर है?


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

उत्तर

9

स्केलेबिलिटी शायद आपके पैकेज की पसंद को ड्राइव करेगी। java.net प्रति सॉकेट एक थ्रेड की आवश्यकता होगी। कोडिंग यह काफी आसान होगा। java.nio बहुत अधिक कुशल है, लेकिन चारों ओर कोड करने के लिए बालों वाली हो सकती है।

मैं आपसे पूछूंगा कि आप कितने कनेक्शन संभालने की उम्मीद करते हैं। यदि यह अपेक्षाकृत कम है (कहें, < 100), मैं java.net के साथ जाऊंगा।

+1

एक आधुनिक 64-बिट ओएस के साथ आप सैकड़ों हजार धागे प्राप्त कर सकते हैं। –

+3

निश्चित रूप से, लेकिन यह आवश्यक नहीं है कि किसी एप्लिकेशन को आर्किटेक्ट करने का सबसे स्केलेबल तरीका हो। –

+1

लेकिन एक सॉकेट एक धागे की तुलना में अधिक संसाधन गहन है ... – Zombies

0

जिन कनेक्शनों के बारे में आप बात कर रहे हैं, उनमें से मुझे बताता है कि आपको java.net का उपयोग करना चाहिए। असल में, आपके कार्य को गैर-अवरुद्ध I/O के साथ जटिल बनाने का कोई कारण नहीं है। (जब तक आपके रिमोट सिस्टम को कम नहीं किया जाता है, लेकिन फिर आप उन पर जावा का उपयोग क्यों कर रहे हैं?)

Apache's XML-RPC पैकेज पर एक नज़र डालें। इसका उपयोग करना आसान है, आपके द्वारा नेटवर्क सामग्री को पूरी तरह छुपाता है, और अच्छे ओल 'HTTP पर काम करता है। प्रोटोकॉल मुद्दों के बारे में चिंता करने की कोई ज़रूरत नहीं है ... यह सब दोनों सिरों पर आपको विधि कॉल की तरह दिखेगा।

+0

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

+0

यह एक सादा पुस्तकालय है और एसई और ईई में काम करना चाहिए। उल्लेख किया गया एक और टिप्पणीकार की तरह, इसमें इसकी स्केलेबिलिटी समस्याएं हैं। लेकिन 98% मामले के लिए, मुझे लगता है कि यह काफी ठोस है। –

0

शामिल कनेक्शनों की छोटी संख्या को देखते हुए, java.net सही समाधान की तरह लगता है।

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

कम मात्रा नियंत्रण अनुप्रयोगों के लिए एक्सएमएल-आरपीसी की सादगी प्रदर्शन लागत से अधिक होनी चाहिए। उच्च मात्रा डेटा संचार के लिए एक अधिक कुशल तार प्रोटोकॉल का उपयोग करना बेहतर हो सकता है।

11

एनआईओ से बचें जब तक कि आपके पास इसका उपयोग करने का कोई अच्छा कारण न हो। It's not much fun and may not be as beneficial as you would think।एक बार जब आप हजारों कनेक्शन से निपट रहे हों तो आपको बेहतर स्केलेबिलिटी मिल सकती है, लेकिन कम संख्या में आपको शायद आईओ अवरुद्ध करने के साथ बेहतर थ्रूपुट मिलेगा। हमेशा के रूप में, कुछ ऐसा करने से पहले अपने आप को मापें जो आपको पछतावा हो सकता है।

कुछ और विचार करना है कि यदि आप एसएसएल का उपयोग करना चाहते हैं, तो एनआईओ इसे बेहद दर्दनाक बनाता है।

+1

एसएसएल के बारे में टिप्पणी के लिए धन्यवाद, यह शायद मेरे निर्णय को ड्राइव करेगा। –

+0

अच्छा चल रहा है, क्योंकि मुझे यकीन है कि आप फरवरी 2012 में जावा 1.4 पर चल रहे थे – sloven

1

इस प्रकार के नेटवर्किंग कोड को स्क्रैच से लिखने का लगभग कोई कारण नहीं है। netty.io जैसे पैकेज हमेशा हाथ से तैयार समाधान की तुलना में कोड की कम लाइनों के साथ आपको अधिक विश्वसनीय और लचीला कोड प्राप्त करेंगे। इसके अलावा, नेटटी के साथ, आप अपने कार्यान्वयन को जटिल बनाते हुए एसएसएल समर्थन w/o प्राप्त कर सकते हैं। नेटटी जैसे पुस्तकालय भी "एसिंक बनाम धागे" प्रश्न को पूरी तरह से रोकते हैं, आपको अच्छा प्रदर्शन देता है, और फिर भी आपको थ्रेडिंग मॉडल को आवश्यकतानुसार ट्विक करने देता है।