2012-12-26 19 views
13

में गारंटीकृत डिलीवरी मैं मध्यम लोड वेब एप्लिकेशन के लिए सिग्नलआर का मूल्यांकन कर रहा हूं।सिग्नलआर

हम ~ 500 msgs/sec की उम्मीद कर रहे हैं, जो सिग्नलआर के साथ कोई समस्या नहीं होनी चाहिए।

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

धन्यवाद!

+1

आप देख रहे हैं 100% गारंटी वितरण के लिए, SignalR अपने समाधान के लिए एक अच्छे उम्मीदवार नहीं है। आपको एक मजबूत क्यूइंग सिस्टम की आवश्यकता है। – EkoostikMartin

+0

आपको RabbitMQ (http://www.rabbitmq.com/) पर विचार करना चाहिए।जब भी क्लाइंट संदेश से खींचने के लिए उपलब्ध नहीं है, तब भी आप प्रत्येक क्लाइंट के लिए कतार पर संदेशों को कतारबद्ध कर सकते हैं। – rpgmaker

+0

+1 EkoostikMartin। यदि आप विश्वसनीय संदेश की तलाश में हैं तो आपको सिग्नलआर का उपयोग करने के शीर्ष पर लेयर करने की आवश्यकता है। – davidfowl

उत्तर

14

इसे संभालने का एक आसान तरीका प्रत्येक संदेश को प्रत्येक संदेश के साथ एक आईडी निर्दिष्ट करना होगा। क्लाइंट को उस नवीनतम संदेश का ट्रैक रखने की आवश्यकता होगी जिसे वह प्राप्त हुआ था, और पुन: कनेक्शन पर सर्वर पर उस संदेश आईडी को भेज दिया जाएगा; और सर्वर को क्लाइंट को सभी मिस्ड संदेशों को नीचे भेजने की आवश्यकता होगी। लागू करने के लिए उचित रूप से सरल होना चाहिए।

संपादित करें: मुझे नहीं लगता कि आपको सर्वर पर किसी भी वास्तविक स्थिति को उचित बनाए रखना होगा - मुझे लगता है कि लगभग सभी इसे आपके डेटास्टोर या आपके क्लाइंट को धक्का दे सकते हैं। ग्राहक आईडी या टाइमस्टैम्प अंतिम संदेश की है कि यह प्राप्त किया था ऊपर भेजना होगा:

$.connection.myHub.server.updateMe(lastMessageId);

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

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

+0

सिग्नलआर का उपयोग करके आप इसे कैसे कार्यान्वित कर सकते हैं? और यह भी, मुझे सर्वर पर एक राज्य रखने के लिए मजबूर करेगा, जो एक स्टेटलेस एफडब्ल्यू होने के लिए सिग्नलआर लक्ष्यों में से एक को याद करेगा। – ml123

+0

उपरोक्त मेरे संपादन देखें। –

+0

@ ml123 क्या आपने सिग्नलआर का उपयोग करके समाप्त किया? क्या यह अच्छी तरह से काम कर रहा है? Tks – Pascal

2

आप बिल्कुल लेकिन ढांचे queing किसी तरह का इस्तेमाल कर सकते हैं न्यूनतम प्रयास के साथ इस हासिल करने के लिए आप इसे इस प्रकार कर सकते हैं ...

serverside: http://pastebin.com/tuicQYGq Clientside: http://pastebin.com/a8EbusuG

मैं उपयोग कर रहा हूँ XSockets.NET यह एक रीयलटाइम संचार मंच है (200 9 से) और XSockets.NET में नियंत्रकों के पास राज्य है इसलिए यह करना आसान है।

संपादित करें: ओह ... उदाहरण के लिए क्रोम और सफारी के लिए दो ब्राउज़रों का उपयोग करने के लिए, फिर एक ब्राउज़र डिस्कनेक्ट करें ... दूसरे संदेशों से कुछ संदेश भेजें और संदेश देखने के लिए पुनः कनेक्ट करें। आपको स्थानीयहोस्ट पर दो अलग-अलग ब्राउज़रों का उपयोग करना होगा क्योंकि xsockets प्रत्येक ब्राउज़र को एक अद्वितीय स्टोरेज-आईडी देगा।

संपादित करें: कतार में जोड़ा गया Func ताकि आप विशिष्ट क्लाइंट को ऑफ़लाइन होने पर भी लक्षित कर सकें। यदि आप चाहें तो केवल मेल खाने वाली स्थितियों को संदेश मिलेगा।

सादर Uffe