6

मेरे पास नोडोक पर चलने वाले नोड जेएस में लिखा गया एक वेब सर्वर है। सर्वर की एक वेब सर्वर प्रक्रिया और एक कार्यकर्ता प्रक्रिया है। वेब सर्वर सफलतापूर्वक कार्यकर्ता को एक RabbitMQ कतार के माध्यम से संदेश भेजता है; कार्यकर्ता सफलतापूर्वक संसाधित डेटा को वेब सर्वर पर वापस कर देता है। मैं संदेशों को ट्रैक करने के लिए यादृच्छिक रूप से जेनरेट किए गए यूयूड का उपयोग करता हूं और यह सुनिश्चित करता हूं कि सही संदेश सही मूल संदेश के साथ जोड़ा गया हो।संदेश कतार वास्तुकला (कार्यकर्ता और पीछे वेब सर्वर के लिए क्लाइंट)

एक अलग परियोजना में, मेरे पास क्लाइंट (वेबसाइट) वेब सर्वर के साथ सफलतापूर्वक संचार कर रहा है। अब, मुझे दोनों को एक साथ रखना होगा।

  1. ग्राहक एक HTTP POST भेजता है:

    मैं यह इतना कैसे कर सकते हैं।

  2. वेब सर्वर अनुरोध प्राप्त करता है और संदेश कतार में अनुरोध पास करता है।
  3. कर्मचारी अनुरोध करता है और वेब सर्वर पर वापस आ जाता है।
  4. वेब सर्वर क्लाइंट को सही डेटा देता है ताकि ग्राहक मूल अनुरोध के साथ प्रतिक्रिया को जोड़ सके।

चरण 4 वह जगह है जहां मैं अटक गया हूं। मुझे लगता है कि मैंने कहीं पढ़ा है कि क्लाइंट को लगातार सर्वर (HTTP POSTs?) वेब सर्वर को तब तक जारी रखना चाहिए जब तक कि डेटा तैयार न हो जाए। मुझे लगता है कि मुझे चरण 1 के बाद ग्राहक को जवाब देना होगा, इसलिए अनुरोध समय समाप्त नहीं हुआ है। किसी भी विचार/सलाह की सराहना की!

ब्लॉक आरेख: enter image description here

+0

के साथ उठने और चलाने के लिए एक पूरा पैकेज है, यह एक लंबी चल रही प्रक्रिया होगी जहां आपको स्थिति अपडेट की आवश्यकता होगी? या यह बैक-एंड से बहुत तेज प्रतिक्रिया होगी, जहां मूल HTTP अनुरोध को उस बैक-एंड सेवा से प्रतिक्रिया w/डेटा प्राप्त करना चाहिए? –

+0

मुझे लगता है कि स्थिति अद्यतन।कभी-कभी बैक-एंड 30 सेकंड + होगा। – user3320795

+1

हाँ, एक या दो से अधिक समय के लिए, स्थिति अपडेट जाने का तरीका है। मैं जल्द ही एक उत्तर पोस्ट करूंगा। –

उत्तर

5

आप क्या करने की जरूरत के लघु संस्करण दो तरह से संदेश भेजने के लिए है। आपके वेब ऐप को एक संदेश निर्माता और संदेश उपभोक्ता होना चाहिए। आपकी बैक-एंड सेवा के लिए भी यही है।

जब HTTP अनुरोध आता है, तो वेब सर्वर RabbitMQ के माध्यम से एक संदेश भेजता है। बैक एंड भविष्य में किसी बिंदु पर इसे उठाता है। इस बीच, वेब सर्वर HTTP अनुरोध के माध्यम से प्रतिक्रिया भेजता है कि कुछ हो रहा है और उपयोगकर्ता को बाद में अधिसूचित किया जाएगा। समझाया वस्तु किसी तरह किया जा रहा है एक विधि के साथ


var router = express.Router(); 
router.post("/", postJob); 

function postJob(req, res, next){ 
    req.session.inProgress = true; 

    var msg = { 
    job: "do some work" 
    }; 

    jobSender.sendJobRequest(msg, function(err){ 
    if (err) { return next(err); } 
    res.render("some-response"); 
    }); 
} 

इस कोड मान्यताओं का एक बहुत बनाता है, jobSender तरह RabbitMQ भर में एक संदेश भेजने के लिए:

आप एक्सप्रेस का उपयोग कर रहे हैं, यह कुछ इस प्रकार दिखाई देगा । मुझे यकीन है कि आप पहले से जो कहा है उसके आधार पर एक संदेश भेजने के विवरण भर सकते हैं।

महत्वपूर्ण बात यह है कि HTTP अनुरोध हैंडलर खरगोश एमक्यू में संदेश भेजता है और फिर वेब ब्राउज़र पर एक HTTP प्रतिक्रिया भेजता है।

इस बिंदु पर, ब्राउजर जो कुछ भी करने की ज़रूरत है वह कर सकता है।

बैक-एंड, जब अन्य सेवा यह काम, यह दो चीजों में से एक करने की आवश्यकता होगी है पूरा कर लिया है पर:

1) कहीं एक साझा डेटाबेस को अद्यतन, ताकि अपने वेब सर्वर जानता है क्या काम है किया गया (और एक स्थिति पढ़ सकते हैं)

या

2) संदेश वापस वेब सर्वर से भेजने के लिए, RabbitMQ

विकल्प # 1 के माध्यम से हमेशा एक अच्छा विकल्प है, विभिन्न कारणों के लिए न हो। और आपके प्रश्न से, आप वैसे भी विकल्प # 2 चाहते हैं।

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

यह स्थिति "पूर्ण" या "प्रगति" या "त्रुटि" या कुछ और जो आप फिट देखते हैं हो सकती है।

उदाहरण के लिए, यदि आपके पास "नौकरी की स्थिति" संदेश है, तो आपके पास स्टेटस संदेश प्राप्त करने के लिए "जॉबस्टैटस रिसीवर" नामक एक अमूर्तता हो सकती है।

इस तरह एक साधारण मॉड्यूल आपके कार्य स्थिति कतार से संदेश प्राप्त कर सकता है, और


var JobStatusReceiver = require("./jobStatusReceiver"); 
var someDataObject = require("someDataObject"); 

var jobStatus = { 

    listen: function(){ 
    var receiver = new JobStatusReceiver(); 
    receiver.receive(function(statusMessage){ 

     someDataObject.status = statusMessage.status; 
     someDataObject.data = statusMessage.data; 


     someDataObject.save(); 
    }); 
    } 

}; 

module.exports = jobStatus; 

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

someDataObject ऑब्जेक्ट योरू डेटाबेस से ऑब्जेक्ट होने की संभावना है, इसलिए इसे डेटाबेस में वापस सहेजा जा सकता है।

आखिरकार, जिस हिस्से को आपको पूर्ण कार्रवाई के उपयोगकर्ता को सूचित करने की आवश्यकता है, डेटा के साथ, कई तरीकों से हो सकता है।

आम तौर पर, वैध प्रतिक्रिया देखने के लिए, हर कुछ सेकंड में अपने वेब सर्वर पर एक HTTP एपीआई को एक एजेक्स कॉल करना काफी आसान है।

ब्राउज़र तरफ, इस के रूप में सरल किया जा सकता है:


var timer = setInterval(function(){ 

    $.ajax({ 
    url: "/api/check-status", 
    success: function(data){ 
     if (data.complete){ 
     clearInterval(timer); 
     doSomeOtherWork(data); 
     } 
    }) 
    }); 

}); 

और एक्सप्रेस ऐप में दोबारा, हैंडलिंग "/ api/चेक-स्थिति", आप एक ही "someDataObject" मॉडल का प्रयोग करेंगे स्थिति की जांच करने के लिए:


var someDataObject = require("someDataObject"); 

var router = new express.Router(); 
router.get("/", checkStatus); 

function checkStatus(req, res, next){ 

    someDataObject.load(function(err, someData){ 
    if (err) { return next(err); } 

    res.json({ 
     complete: (someData.status === "complete"), 
     data: someData.data 
    }); 

    }); 

} 

यह उम्मीद है कि आपको सही रास्ते से नीचे ले जाना चाहिए। बेशक, मैंने बहुत सारे विवरण छोड़े हैं, लेकिन उम्मीद है कि आप लापता हिस्सों को भरने में सक्षम होंगे।

...

पी.एस .: मैं ब्राउज़र एक टाइमर पर स्थिति अपडेट की जांच मेरी RabbitMQ 4 Devs प्रशिक्षण पाठ्यक्रम में के अलावा यह सब, कवर किया। यह RabbitMQ और Node.js

+0

यह एक अच्छा तरीका है, मुझे लगता है कि इसे पूलिंग के बजाय पब/उप पैटर्न के साथ मिश्रित किया जा सकता है। – Sebastian

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