2012-04-09 7 views
7

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

मुझे रेडिस के साथ एक खुले कनेक्शन को बनाए रखने के लिए this solution मिला, लेकिन यह कनेक्शन को पुनर्निर्मित करते समय सदस्यता के लिए जिम्मेदार नहीं है।

मैं वर्तमान में Redis pubsub संदेशों को संभालने कर रहा हूँ मेरी Global.asax फ़ाइल में:

public class Application : HttpApplication 
{ 
    protected void Application_Start() 
    { 
     var gateway = Resolve<RedisConnectionGateway>(); 
     var connection = gateway.GetConnection(); 
     var channel = connection.GetOpenSubscriberChannel(); 

     channel.PatternSubscribe("workers:job-done:*", OnExecutionCompleted); 
    } 

    /// <summary> 
    /// Handle messages received from workers through Redis.</summary> 
    private static void OnExecutionCompleted(string key, byte[] message) 
    { 
     /* forwarded the response to the client that requested it */ 
    } 
} 

समस्या तब होती है जब वर्तमान RedisConnection जो भी कारण के लिए बंद कर दिया है। कनेक्शन को रीसेट होने पर RedisConnectionGateway कक्षा से किसी ईवेंट को आग लगाना समस्या का सबसे आसान समाधान होगा, और एक नया RedisSubscriberChannel का उपयोग करके पुनः सदस्यता लें। हालांकि, चैनल रीसेट होने पर चैनल को प्रकाशित कोई भी संदेश खो जाएगा।

क्या इस स्थिति को संभालने के लिए अनुशंसित तरीकों के कोई उदाहरण हैं?

+0

मेरा समाधान वास्तव में एक लालसा कनेक्शन देता है यदि यह पहले से खुला है, या यदि नहीं तो एक खुलता है। मेरा मानना ​​है कि "पारंपरिक उपयोग" में कनेक्शन खुला रहेगा और आपको इसे अपने पबसब स्कीमा में नहीं छोड़ा जाएगा। कुछ कारणों से कनेक्शन बंद होने के दुर्लभ मामले में, आपको एक नया मिलेगा, और हाँ - कनेक्शन को रीसेट होने पर चैनल को प्रकाशित संदेश खो जाएंगे। लेकिन यह बहुत ही कम समय के लिए है, और यह नियमित आधार पर होने का अनुमान नहीं लगाता है। वैसे भी, चलो बुकस्लीव के लेखक इस पर प्रकाश डालें (सीसी @marcgravell)। –

+0

@OferZelig धन्यवाद, लेकिन '@ कोई' काम नहीं करता है जब तक कि मैं किसी भी तरह से पोस्ट में शामिल नहीं हूं; पी –

+0

@MarcGravell मुझे यह नहीं पता था; वैसे भी: 1) कोई अन्य एसई उपयोगकर्ता के साथ कुछ कैसे अपना ध्यान आकर्षित करने के लिए संवाद कर सकता है? मेरा मतलब है - एक एसई साइट के अंदर, जांच करके नहीं, प्रोफाइल है और उसके ब्लॉग या ऐसे में जाना; 2) आप एसई में एक सुविधा को कार्यान्वित कर सकते हैं जो इस और अलर्ट की पहचान करता है ( xxx पैटर्न, जहां xxx एक ज्ञात एसई उपयोगकर्ता नाम है)। धन्यवाद! –

उत्तर

7

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

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

+0

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

+1

@ जस्टिन इसे जोड़ा जाएगा - उम्मीद है कि इस सप्ताह –

+0

यह शानदार होगा! धन्यवाद! –