2012-11-29 14 views
8

मैं वर्तमान में एक अभ्यास के रूप में एक साधारण पी 2 पी नेटवर्क विकसित कर रहा हूं। नेटवर्क में प्रत्येक नोड नेटवर्क को छोड़ने वाले नोड्स का पता लगाने में सक्षम होने के लिए अन्य नोड्स के सबसेट में दिल की धड़कन भेजता है। दिल की धड़कन पैकेट के अलावा मैं पैकेट भेजता हूं जब नए नोड्स नेटवर्क में शामिल होते हैं/छोड़ते हैं, जब वे संसाधन (छोटी टेक्स्ट फाइल) आदि का पता लगाना चाहते हैं, तो सभी पैकेट यूडीपी पैकेट हैं।कई आने वाले पैकेट को संभालने का सबसे अच्छा तरीका

जब भी मुझे एक पैकेट मिलता है तो मैं एक नया थ्रेड शुरू करता हूं जो उस विशिष्ट पैकेट को संभालता है। हालांकि मैं एक आवेदन जीवनकाल के दौरान शुरू होने वाले धागे की मात्रा से चिंतित हूं जो काफी हद तक बढ़ता है (विशेष रूप से दिल की धड़कन के कारण)। (डेडलॉक्स का खतरा भी है और जैसा कि मैं टालना चाहता हूं)।

मैंने एक कतार या कुछ ऐसा करने के बारे में सोचा जहां मैंने सभी आने वाले पैकेट रखे और एक ही थ्रेड को उस कतार (निर्माता-उपभोक्ता पैटर्न की तरह कुछ) में एक ही समय में सभी पैकेटों को संभालने के बारे में सोचा। मैं पैकेट को तेजी से संभालना चाहता हूं ताकि प्रेषक को नहीं लगता कि पैकेट गुम हो गया है।

उनमें से प्रत्येक के लिए एक नया धागा शुरू किए बिना कई अलग-अलग आने वाले पैकेट को संभालने का सबसे अच्छा तरीका क्या है? क्या मुझे अपने पास जो चाहिए, निर्माता-उपभोग करने वाला या कुछ अलग होना चाहिए?

+1

निश्चित रूप से। एक लिंक्डलिस्ट के साथ निर्माता-उपभोक्ता का प्रयोग करें। सबसे आसान तरीका मैं सोच सकता हूँ। – DankMemes

+0

आप अपने पुराने तरीके से कुछ पुराने तरीके से शुरू कर सकते हैं, कुछ बेंचमार्क करें और फिर कुछ नया प्रयास करें, जैसे "विघटनकर्ता" (http://lmax-exchange.github.com/disruptor/) और फिर कुछ और करें बेंचमार्क। –

+1

यह "कई अलग-अलग आने वाले पैकेट" को मापने में मदद कर सकता है ... अपेक्षाकृत बोलते हुए, दिल की धड़कन ज्यादा नहीं होनी चाहिए, जब एक आधुनिक प्रणाली आमतौर पर सैकड़ों से हजारों पैकेट प्रति सेकेंड को अपने एनआईसी की संख्या और प्रकार के आधार पर संभाल सकती है । मुझे संदेह है कि दर्जन प्रति मिनट सीमा में दिल की धड़कन अधिक हो सकती है ... – twalberg

उत्तर

0

एक पैकेट को संसाधित करने में आपके आवेदन में कितना समय लगता है?

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

शायद पैकेट प्रति एक थ्रेड शुरू करने से आप वास्तव में नौकरी करने की तुलना में धागे को शुरू करने और रोकने पर अधिक समय लेते हैं।

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

किसी भी मामले में थ्रेड पूल का उपयोग करें और शुरुआत में श्रमिकों को शुरू करें। यदि आप चाहते हैं कि आप पिछले मिनटों के भार के आधार पर गतिशील रूप से काम करने वाले धागे की संख्या को बढ़ा या घटा सकें।

+0

समय थोड़ा भिन्न होता है। अधिकांश पैकेटों को जल्दी से संभाला जाता है लेकिन कुछ कार्यों में नए पैकेट भेजे जाते हैं और प्रतिक्रिया की उम्मीद होती है। लेकिन मुझे लगता है कि मैं थ्रेड पूल और कतार के साथ जाऊंगा। धन्यवाद। – Wondering

0

मैं event driven architecture का उपयोग करूंगा। प्रत्येक पैकेट के लिए एक नया धागा बनाना स्केलेबल नहीं है, इसलिए यह एक निश्चित मात्रा में वर्कलोड पर काम करेगा, लेकिन एक बिंदु है जो अब और काम नहीं करेगा। आप इसकी तुलना उदाहरण से कर सकते हैं एक चैट प्रोग्राम जैसे फेसबुक चैट, जहां संदेश पैकेट हैं। एक ईवेंट संचालित आर्किटेक्चर स्केलेबल और IMHO ठीक वही होगा जो आप खोज रहे हैं। बस कुछ प्रोग्रामिंग भाषाओं के लिए पुस्तकालयों को कुछ गुगल करें, इसलिए बस अपने लिए सही चुनें (मुझे एरलांग, स्कैला, सी या पायथन में ऐसा करना पसंद है)।

संपादित करें: ठीक है, जावा टैग नहीं देखा। लेकिन भाषा कोई फर्क नहीं पड़ता।

उदाहरण के लिए इस लिंक पर एक नज़र डालें: http://www.nightmare.com/medusa/async_sockets.html

मैं इसे घटना संचालित प्रोग्रामिंग के विचार प्राप्त करने के लिए एक काफी अच्छा एक पाते हैं।

+0

लेकिन वह यूडीपी का उपयोग कर रहा है, इसलिए शायद उसके पास केवल एक फ़ाइल डिस्क्रिप्टर है। – LtWorf

+0

यह असीमित बनाने की संभावना को बाहर नहीं करता है। गैर-अवरुद्ध सॉकेट, एसिंक्रोनस i/o या यहां तक ​​कि ईवेंट संचालित सॉकेट की तलाश करें (मूल रूप से सभी समान विचारों का वर्णन करता है)। – Cravid

+0

मुझे पता है कि यह अभी भी करना संभव है, लेकिन मुझे यकीन नहीं है कि यह इस विशिष्ट स्थिति में परेशानी के लायक है। – LtWorf