2012-10-31 18 views
6

मैं एक ऐसी प्रणाली को फिर से विकसित कर रहा हूं जो कई आपूर्तिकर्ताओं में से एक के लिए http के माध्यम से संदेश भेजेगा। मूल पर्ल स्क्रिप्ट है और यह संभावना है कि पुन: विकास पर्ल का भी उपयोग करेगा।कांटा या कांटा नहीं?

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

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

मेरे विचार अभी एक ऐसी स्क्रिप्ट रखने के विचार से झूठ बोलते हैं जो कितनी यातायात है, इस पर निर्भर करता है कि कितनी यातायात है, लेकिन मुझे यकीन नहीं है कि कितना सर्वोत्तम कार्यान्वित करना है ऐसा लगता है कि प्रत्येक संदेश को केवल एक बार संसाधित किया जाता है, जबकि उचित कतार बनाए रखा जाता है।

मेरा सबसे अच्छा अनुमान यह है कि मूल स्क्रिप्ट डीबी को अपडेट करती है यह इंगित करने के लिए कि कौन सी बाल प्रक्रिया को संभालना चाहिए, हालांकि मुझे चिंता है कि यह मूल विधि से कम कुशल होगा। मुझे फोर्किंग कोड लिखने का थोड़ा सा अनुभव है (पिछली बार मैंने लगभग 15 साल पहले किया था)।

संदेश कतारों को संसाधित करने के तरीके पर मार्गदर्शिकाओं के लिए कोई विचार या लिंक सराहना की!

+0

क्या आपने वहां गियरमैन या किसी अन्य नौकरी सर्वर को देखा है? – jshy

उत्तर

8

आप थ्रेड :: कतार या इस से किसी भी अन्य इस्तेमाल कर सकते हैं: Is there a multiprocessing module for Perl?

तो पुरानी व्यवस्था पर्ल में इस तरह से आप इसके बारे में सबसे अधिक भाग के पुन: उपयोग कर सकता है लिखा गया था।

बेकाम के उदाहरण:

use strict; 
use warnings; 

use threads; 
use Thread::Queue; 

my $q = Thread::Queue->new(); # A new empty queue 

# Worker thread 
my @thrs = threads->create(sub { 
          while (my $item = $q->dequeue()) { 
           # Do work on $item 
          } 
         })->detach() for 1..10;#for 10 threads 
my $dbh = ... 
while (1){ 
    #get items from db 
    my @items = get_items_from_db($dbh); 
    # Send work to the thread 
    $q->enqueue(@items); 
    print "Pending items: "$q->pending()."\n"; 
    sleep 15;#check DB in every 15 secs 
} 
6

मैं खरगोश एमक्यू जैसे संदेश कतार सर्वर का उपयोग करने का सुझाव दूंगा।

एक प्रक्रिया कतार में काम करती है, और आपके पास एकाधिक कार्यकर्ता प्रक्रियाएं कतार का उपभोग कर सकती हैं। इस दृष्टिकोण का

लाभ:

  • जब काम के लिए इंतज़ार कर (कोई व्यस्त इंतजार)
  • अधिक कार्यकर्ता प्रक्रियाओं मैन्युअल शुरू किया जा सकता है अगर जरूरत
  • कार्यकर्ता प्रक्रियाओं होने की जरूरत नहीं है श्रमिकों को ब्लॉक एक विशेष माता पिता की प्रक्रिया के एक बच्चे
  • RabbitMQ सभी मजदूरों जो काम स्वीकार
  • RabbitMQ कतार में वापस काम डाल देंगे के लिए तैयार हैं के बीच काम वितरित करेंगे अगर कार्यकर्ता हिरण sn't एक एसीके लौट
  • आप डेटाबेस
  • हर "एजेंट" (कार्यकर्ता, निर्माता, आदि में काम आवंटित करने के लिए की जरूरत नहीं है) एक स्वतंत्र प्रक्रिया आप इसे मारने या अन्य प्रक्रियाओं

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

  1. कार्यकर्ताओं स्वचालित रूप से है मर अगर वे काम के लिए समय की एक निर्धारित राशि के लिए नहीं मिलता है
  2. किसी अन्य प्रक्रिया कतार की लंबाई पर नजर रखने और अधिक श्रमिकों अंडे अगर कतार बहुत बड़ा हो रही है है
+0

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

+1

यदि आप कतार के लिए डेटाबेस का उपयोग करते हैं तो आपके कर्मचारियों को व्यस्त इंतजार करना होगा (यानी समय-समय पर डेटाबेस को मतदान करना होगा।) एक संदेश कतार सर्वर काम के वितरण को संभालेगा और श्रमिकों को ब्लॉक करने की अनुमति देगा (यानी कोई सीपीयू समय नहीं लेगा) करने के लिए काम है। – ErikR

1

मैं कतार में नौकरियों जोड़ने और उन्हें दूर करने के लिए अपने पर्ल स्क्रिप्ट में एक समर्पित काम सर्वर के लिए beanstalkd, और Beanstalk::Client का उपयोग कर की सिफारिश करेंगे।

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

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

संबंधित मुद्दे