बहु-उपयोगकर्ता अजाक्स वेब एप्लिकेशन को समवर्ती रूप से सुरक्षित करने के लिए कैसे डिज़ाइन करें


95

मेरे पास एक वेब पेज है जो सर्वर से बड़ी मात्रा में डेटा दिखाता है। संचार अजाक्स के माध्यम से किया जाता है।

हर बार जब उपयोगकर्ता इस डेटा को इंटरैक्ट करता है और बदलता है (कहो उपयोगकर्ता का नाम कुछ बदल जाता है) यह सर्वर को कार्रवाई करने के लिए कहता है और सर्वर नए बदले गए डेटा को वापस करता है।

यदि उपयोगकर्ता B उसी समय पृष्ठ पर पहुँचता है और एक नया डेटा ऑब्जेक्ट बनाता है तो वह फिर से सर्वर को ajax के माध्यम से बताएगा और सर्वर उपयोगकर्ता के लिए नई ऑब्जेक्ट के साथ वापस आ जाएगा।

A के पृष्ठ पर हमारे पास एक नामांकित वस्तु के साथ डेटा है। और बी के पेज पर हमारे पास एक नई वस्तु के साथ डेटा है। सर्वर पर डेटा का नाम बदलकर ऑब्जेक्ट और नई ऑब्जेक्ट दोनों होता है।

जब कई उपयोगकर्ता इसे समवर्ती उपयोग कर रहे हैं तो सर्वर के साथ पृष्ठ को सिंक में रखने के लिए मेरे पास क्या विकल्प हैं?

पूरे पेज को लॉक करने या उपयोगकर्ता को हर परिवर्तन पर पूरे राज्य को डंप करने जैसे विकल्प से बचा जाता है।

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

बाउंटी संपादित करें:

आप एक बहु-उपयोगकर्ता वेब एप्लिकेशन को कैसे डिज़ाइन करते हैं जो सर्वर के साथ संवाद करने के लिए अजाक्स का उपयोग करता है लेकिन संगामिति के साथ समस्याओं से बचा जाता है?

यानी किसी भी डेटा या राज्य के भ्रष्टाचार के जोखिम के बिना कार्यक्षमता पर डेटाबेस तक पहुंच और डेटाबेस पर डेटा


इतना ज़रूर नहीं लेकिन आपके पास फ़ेसबुक जैसा पेज हो सकता है जहाँ ब्राउज़र
एजैक्स

क्लाइंट स्टेट को सीरियलाइज़ करना और फिर यहाँ ajax के माध्यम से सर्वर को बताना मेरा राज्य है जिसे मुझे अपडेट करने की आवश्यकता है एक विकल्प है। लेकिन क्लाइंट को यह जानने की आवश्यकता है कि किसी भी और हर जानकारी को एक जगह कैसे अपडेट किया जाए।
रेयानोस

1
उपयोगकर्ता-अंत संगामिति का सबसे अच्छा समाधान केवल पुश वेरिएंट में से एक नहीं है? वेबस्कैट, धूमकेतु, इत्यादि
डेविन

@ डैविन यह काफी अच्छी तरह से हो सकता है। लेकिन मैं धूमकेतु से परिचित नहीं हूं और वेबसोकेट क्रॉस-ब्राउज़र समर्थन के लिए नहीं हैं।
रेयानोस

2
क्रॉस-ब्राउज़र समर्थन के लिए अच्छे पैकेज हैं, विशेष रूप से मैं सॉकेट.आईओ की सलाह देता हूं, हालांकि jWebSocket, और कई अन्य भी हैं। यदि आप सॉकेट.आईओ रास्ते पर जाते हैं, तो आप सभी प्रकार के नोड को शामिल कर सकते हैं। जेएस अच्छाइयां, जैसे चौखटे और (क्लाइंट-साइड)
टेंपलेटिंग

जवाबों:


157

अवलोकन:

  • पहचान
  • सर्वर आर्किटेक्चर
  • ग्राहक वास्तुकला
  • अद्यतन मामला
  • मामला दर्ज
  • संघर्ष का मामला
  • प्रदर्शन और मापनीयता

हाय रेन्नोस,

मैं यहां किसी विशेष उत्पाद पर चर्चा नहीं करूंगा। दूसरों ने जो उल्लेख किया है वह पहले से ही एक नज़र रखने के लिए एक अच्छा टूलसेट है (शायद उस सूची में नोड.जेएस जोड़ें)।

एक आर्किटेक्चर के दृष्टिकोण से, आपको वही समस्या है जो संस्करण नियंत्रण सॉफ़्टवेयर में देखी जा सकती है। एक उपयोगकर्ता एक वस्तु में परिवर्तन की जाँच करता है, दूसरा उपयोगकर्ता उसी वस्तु को दूसरे तरीके से बदलना चाहता है => संघर्ष। आपको उपयोगकर्ताओं को ऑब्जेक्ट में परिवर्तन को एकीकृत करना होगा, जबकि एक ही समय पर और कुशलता से अपडेट प्रदान करने में सक्षम होना चाहिए, ऊपर की तरह संघर्षों का पता लगाना और हल करना।

अगर मैं आपके जूते में होता तो मैं कुछ इस तरह से विकसित करता:

1. सर्वर-साइड:

  • एक उचित स्तर निर्धारित करें जिस पर आप परिभाषित करेंगे कि मैं "परमाणु कलाकृतियों" को क्या कहूंगा (पृष्ठ? वस्तुओं के अंदर मौजूद पृष्ठ; वस्तुओं के अंदर के अवशेष)। यह आपके वेबसर्वर, डेटाबेस और कैशिंग हार्डवेयर, # उपयोगकर्ता, # ऑब्जेक्ट्स, आदि पर निर्भर करेगा, न कि एक आसान निर्णय।

  • प्रत्येक परमाणु कलाकृतियों के लिए:

    • एक एप्लीकेशन-वाइड यूनिक-आई.डी.
    • एक वृद्धि संस्करण-आईडी
    • लेखन-अभिगम के लिए एक ताला तंत्र (शायद म्यूटेक्स)
    • रिंगबफ़र के अंदर एक छोटा इतिहास या "चैंजेलॉग" (साझा मेमोरी उन लोगों के लिए अच्छी तरह से काम करती है)। एक एकल कुंजी-मूल्य जोड़ी भले ही कम विस्तार योग्य हो, ठीक हो सकती है। http://en.wikipedia.org/wiki/Circular_buffer देखें
  • एक सर्वर या छद्म सर्वर घटक जो किसी जुड़े उपयोगकर्ता के लिए प्रासंगिक चैंज को कुशलतापूर्वक वितरित करने में सक्षम है । इसके लिए ऑब्जर्वर-पैटर्न आपका दोस्त है।

2. ग्राहक-पक्ष:

  • एक जावास्क्रिप्ट क्लाइंट जो ऊपर दिए गए सर्वर पर लंबे समय से चल रहे HTTP-Connection के लिए सक्षम है, या हल्के मतदान का उपयोग करता है।

  • एक जावास्क्रिप्ट विरूपण साक्ष्य- updater घटक जो साइट की सामग्री को ताज़ा करता है जब जुड़ा हुआ जावास्क्रिप्ट क्लाइंट देखे गए कलाकृतियों-इतिहास में परिवर्तनों की सूचना देता है। (फिर से एक पर्यवेक्षक पैटर्न एक अच्छा विकल्प हो सकता है)

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

  • एक जावास्क्रिप्ट संघर्ष-सॉल्वर एक मानव के लिए अनुमति देता है जो परिवर्तन-का-सही निर्णय है। आप केवल उपयोगकर्ता को यह बताना नहीं चाहेंगे "कोई व्यक्ति आपसे अधिक तेज था। मैंने आपका परिवर्तन हटा दिया है। रोएं"। बल्कि तकनीकी अंतर या अधिक उपयोगकर्ता के अनुकूल समाधान से कई विकल्प संभव लगते हैं।

तो यह कैसे रोल करेगा ...

केस 1: अपडेट करने के लिए तरह-का-अनुक्रम-आरेख:

  • ब्राउज़र रेंडर पेज
  • जावास्क्रिप्ट "कलाकृतियों" को देखता है, जिनमें से प्रत्येक में कम से कम एक मूल्य क्षेत्र होता है, अद्वितीय- और एक संस्करण-आईडी
  • जावास्क्रिप्ट क्लाइंट शुरू हो जाता है, अपने पाए गए संस्करणों से शुरू हुई कलाकृतियों के इतिहास को "देखने" का अनुरोध करता है (पुराने परिवर्तन दिलचस्प नहीं हैं)
  • सर्वर प्रक्रिया अनुरोध को नोट करती है और इतिहास को लगातार जांचती है और / या भेजती है
  • इतिहास प्रविष्टियों में सरल सूचनाएं हो सकती हैं "विरूपण साक्ष्य x बदल गया है, ग्राहक pls अनुरोध डेटा" ग्राहक को स्वतंत्र रूप से या पूर्ण डेटासेट को सर्वेक्षण करने की अनुमति देता है "विरूपण साक्ष्य x मूल्य मान में बदल गया है"
  • जावास्क्रिप्ट विरूपण साक्ष्य- updater करता है कि यह नए मूल्यों को प्राप्त करने के लिए क्या कर सकता है जैसे ही वे अद्यतन होने के लिए ज्ञात हो जाते हैं। यह नए ajax अनुरोधों को निष्पादित करता है या जावास्क्रिप्ट क्लाइंट द्वारा फीड किया जाता है।
  • DOM-content के अपडेट होने के बाद, उपयोगकर्ता वैकल्पिक रूप से अधिसूचित हो जाता है। इतिहास-दर्शन जारी है।

केस 2: अब करने के लिए:

  • विरूपण साक्ष्य-कमिट उपयोगकर्ता इनपुट से वांछित नया मूल्य जानता है और सर्वर में परिवर्तन-अनुरोध भेजता है
  • सर्वराइड म्यूटेक्स का अधिग्रहण किया जाता है
  • सर्वर को "अरे, मैं 123 के संस्करण से विरूपण साक्ष्य x की स्थिति जानता हूं, मुझे इसे foo pls मान करने के लिए सेट करें।"
  • यदि विरूपण साक्ष्य x का सर्वरसाइड संस्करण बराबर है (कम नहीं हो सकता है) 123 से नया मूल्य स्वीकार किया जाता है, तो 124 का नया संस्करण आईडी उत्पन्न होता है।
  • नई राज्य-सूचना "संस्करण 124 में अद्यतन" और वैकल्पिक रूप से नए मूल्य फू को आर्टिफिशियल एक्स के रिंगबफ़र (चैंजेलोग / इतिहास) की शुरुआत में रखा जाता है।
  • सर्वरसाइड म्यूटेक्स जारी किया जाता है
  • विरूपण साक्ष्य कमिट करने का अनुरोध नई आईडी के साथ एक साथ एक पुष्टि प्राप्त करने के लिए खुश है।
  • इस बीच सर्वरसाइड सर्वर घटक जुड़े क्लाइंट्स को रिंगबफ़र को पोलिंग / पुश करता रहता है। विरूपण साक्ष्य के बफ़र को देखने वाले सभी ग्राहकों को उनके सामान्य विलंबता के भीतर नए राज्य की जानकारी और मूल्य मिलेगा (देखें मामला 1.)

केस 3: संघर्षों के लिए:

  • विरूपण साक्ष्य कम्यूटेटर उपयोगकर्ता इनपुट से वांछित नया मूल्य जानता है और सर्वर में परिवर्तन-अनुरोध भेजता है
  • इस बीच एक अन्य उपयोगकर्ता ने उसी कलाकृति को सफलतापूर्वक अपडेट किया (देखें मामला 2)। लेकिन विभिन्न अक्षांशों के कारण यह हमारे अन्य उपयोगकर्ता के लिए अभी तक अज्ञात है।
  • इसलिए एक सर्वराइड म्यूटेक्स का अधिग्रहण किया जाता है (या तब तक इंतजार किया जाता है जब तक कि "तेज" उपयोगकर्ता ने अपना परिवर्तन नहीं किया)
  • सर्वर को "अरे, मैं 123 के संस्करण से विरूपण साक्ष्य की स्थिति जानता हूं, मुझे इसे फू फू के लिए सेट करने दें।"
  • सर्वर्साइड पर विरूपण साक्ष्य x का संस्करण अब पहले से ही 124 है। अनुरोध करने वाले ग्राहक को उस मूल्य का पता नहीं चल सकता है जो वह ओवर राइटिंग करेगा।
  • जाहिर है कि सर्वर को परिवर्तन के अनुरोध को अस्वीकार करना होगा (ईश्वर-हस्तक्षेप करने वाली प्राथमिकताओं में मत गिनना), म्यूटेक्स जारी करता है और क्लाइंट को सीधे नए संस्करण-आईडी और नए मूल्य वापस भेजने के लिए पर्याप्त है।
  • अस्वीकार किए गए अनुरोध के साथ सामना किया और मूल्य-परिवर्तन का अनुरोध करने वाले उपयोगकर्ता को अभी तक पता नहीं था, जावास्क्रिप्ट विरूपण साक्ष्य कमिटर संघर्ष रिज़ॉल्वर को संदर्भित करता है जो उपयोगकर्ता को मुद्दा दिखाता है और समझाता है।
  • उपयोगकर्ता, जो स्मार्ट संघर्ष-रिज़ॉल्वर जेएस द्वारा कुछ विकल्पों के साथ प्रस्तुत किया जा रहा है, को मूल्य बदलने के एक और प्रयास की अनुमति है।
  • एक बार जब उपयोगकर्ता ने एक मान का चयन किया, वह सही है, तो प्रक्रिया 2 से शुरू होती है (या केस 3 यदि कोई और तेज था, फिर से)

प्रदर्शन और स्केलेबिलिटी पर कुछ शब्द

HTTP पोलिंग बनाम HTTP "पुशिंग"

  • मतदान अनुरोध बनाता है, प्रति सेकंड एक, 5 प्रति सेकंड, जो आप एक स्वीकार्य विलंबता के रूप में मानते हैं। यह आपके बुनियादी ढांचे के लिए क्रूर हो सकता है यदि आप अपने (अपाचे?) और (php?) को अच्छी तरह से कॉन्फ़िगर नहीं करते हैं तो "हल्के" शुरुआत करने के लिए पर्याप्त है। सर्वराइड पर मतदान अनुरोध को अनुकूलित करना वांछनीय है ताकि यह मतदान अंतराल की लंबाई की तुलना में बहुत कम समय तक चले। आधे भाग में विभाजन का मतलब अच्छी तरह से आपके पूरे सिस्टम लोड को 50% तक कम करना हो सकता है,
  • HTTP के माध्यम से पुश करना (वेबवर्क को संभालने के लिए बहुत दूर हैं) आपको हर समय प्रत्येक उपयोगकर्ता के लिए एक अपाचे / lighthttpd प्रक्रिया उपलब्ध कराने की आवश्यकता होगी । इनमें से प्रत्येक प्रक्रिया और आपके सिस्टम की कुल मेमोरी के लिए आरक्षित निवासी मेमोरी एक बहुत ही निश्चित स्केलिंग सीमा होगी जिसका आप सामना करेंगे। कनेक्शन के मेमोरी फ़ुटप्रिंट को कम करना आवश्यक होगा, साथ ही साथ निरंतर सीपीयू और I / O राशि को सीमित करना होगा (इनमें से प्रत्येक में आपको बहुत सारी नींद / निष्क्रिय समय चाहिए)

बैकेंड स्केलिंग

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

स्केलिंग बढ़ाएँ

  • भले ही आप मतदान कर रहे हों या "पुश" प्राप्त कर रहे हों, एक चरण में सभी देखी गई कलाकृतियों की जानकारी प्राप्त करने का प्रयास करें।

"रचनात्मक" tweaks

  • यदि ग्राहक मतदान कर रहे हैं और कई उपयोगकर्ता समान कलाकृतियों को देखते हैं, तो आप उन कलाकृतियों के इतिहास को एक स्थिर फ़ाइल के रूप में प्रकाशित करने का प्रयास कर सकते हैं, जो अपाचे को इसे कैश करने की अनुमति देते हैं, फिर भी कलाकृतियों में परिवर्तन होने पर इसे सर्वर पर ताज़ा किया जा सकता है। यह अनुरोधों के लिए खेल से बाहर PHP / memcache लेता है। Lighthttpd स्थैतिक फ़ाइलों की सेवा करने में कुशल है।
  • आर्टिकल इतिहास को आगे बढ़ाने के लिए cotendo.com जैसे कंटेंट डिलीवरी नेटवर्क का उपयोग करें। पुश-लेटेंसी बड़ी होगी लेकिन स्केलेबिलिटी एक सपना है
  • एक वास्तविक सर्वर (HTTP का उपयोग नहीं करना) लिखना जो उपयोगकर्ता जावा या फ्लैश (?) का उपयोग करने के लिए कनेक्ट करते हैं। आपको एक सर्वर-थ्रेड में कई उपयोगकर्ताओं की सेवा करने से निपटना होगा। खुले सॉकेट्स के माध्यम से साइकिल चलाना, आवश्यक कार्य करना (या प्रतिनिधि करना)। फोर्किंग प्रक्रियाओं या अधिक सर्वर शुरू करने के माध्यम से स्केल कर सकते हैं। म्यूटेक्स को हालांकि वैश्विक रूप से अद्वितीय रहना है।
  • लोड परिदृश्यों पर निर्भर करता है कि आप अपने फ्रंटएंड और बैकएंड-सर्वरों को आर्टिफिशियल-आईडी रेंज के आधार पर बनाएं। यह लगातार मेमोरी के बेहतर उपयोग के लिए अनुमति देगा (कोई डेटाबेस में सभी डेटा नहीं है) और म्यूटिंग को स्केल करना संभव बनाता है। आपकी जावास्क्रिप्ट को एक ही समय में कई सर्वर से कनेक्शन बनाए रखना होता है।

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

क्रिस्टोफ़ स्ट्रैसन


1
@ChristophStrasen नोड .js जैसे ईवेंटेड सर्वर को देखें जो प्रति उपयोगकर्ता एक थ्रेड पर निर्भर नहीं होते हैं। यह धक्का तकनीक को कम मेमोरी खपत के साथ नियंत्रित करने की अनुमति देता है। मुझे लगता है कि एक नोड.जेएस सर्वर और टीसीपी वेबस्केट्स पर भरोसा करने से वास्तव में स्केलिंग में मदद मिलती है। यह पूरी तरह से क्रॉस ब्राउज़र अनुपालन को बर्बाद कर देता है।
रेयानोस

मैं पूरी तरह सहमत हूं और आशा करता हूं कि मेरा राइटअप पहिया को मजबूत करने को प्रोत्साहित नहीं करेगा! हालांकि कुछ पहिये थोड़े नए हैं, बस शुरुआत के लिए जाना जाता है और अच्छी तरह से समझाया नहीं जाता है ताकि इंटरमीडिएट स्तर के सॉफ्टवेयर आर्किटेक्ट एक विशिष्ट विचार के लिए इसके आवेदन का न्याय कर सकें। IMHO। Node.js थोड़े "डमीज़" पुस्तक के लिए योग्य हैं;)। मैं जरूर खरीदूंगा।
क्रिस्टोफ़ स्ट्रैसेन

2
+500 आप एक यह एक है। बहुत अच्छा जवाब है।
रेयनोस

1
@luqmaan यह उत्तर फरवरी 2011 से है। वेबसैट अभी भी एक नवीनता थी, और केवल अगस्त के आसपास क्रोम में उपसर्ग जारी किया गया था। धूमकेतु और सॉकेट.आईओ ठीक थे, हालांकि मुझे लगता है कि यह एक अधिक प्रदर्शनकारी दृष्टिकोण के लिए एक सुझाव था।
रिकार्डो टोमासी

1
और अगर Node.js आपके कम्फर्ट ज़ोन (या ऑपरेशंस टीम के कम्फर्ट ज़ोन से थोड़ा बहुत दूर है, लेकिन सवाल के व्यावसायिक-संदर्भ के बारे में निश्चित है) तो आप जावा बेस्ड सर्वर के साथ सॉकेट का उपयोग भी कर सकते हैं। टॉम्कट और जेट्टी दोनों सर्वर-पुश तरह के सेटअप के लिए थ्रेड-कम कनेक्शन का समर्थन करते हैं (उदाहरण के लिए देखें: wiki.eclipse.org/Jetty/Feature/Continuations )
टॉमस

13

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगा कि मैं इसमें झंकार करूंगा।

ओटी (परिचालन परिवर्तन) समवर्ती और लगातार बहु-उपयोगकर्ता संपादन के लिए आपकी आवश्यकता के लिए एक अच्छा फिट लगता है। यह Google डॉक्स में उपयोग की जाने वाली तकनीक है (और इसका उपयोग Google वेव में भी किया गया था):

Google Wave टीम के सदस्य द्वारा लिखित ऑपरेशनल ट्रांसफ़ॉर्म - ShareJS ( http://sharejs.org/ ) का उपयोग करने के लिए एक JS- आधारित लाइब्रेरी है ।

और यदि आप चाहें, तो एक पूर्ण MVC वेब-फ्रेमवर्क है - DerbyJS ( http://derbyjs.com/ ) ShareJS पर बनाया गया है जो आपके लिए यह सब करता है।

यह सर्वर और क्लाइंट के बीच संचार के लिए BrowserChannel का उपयोग करता है (और मेरा मानना ​​है कि WebSockets समर्थन कार्यों में होना चाहिए - यह पहले Socket.IO के माध्यम से था, लेकिन Socket.io के साथ डेवलपर के मुद्दों के कारण इसे निकाल लिया गया था) शुरुआत डॉक्स हालांकि, इस समय थोड़ा विरल।


5

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


यह एक उपयोगी बिंदु है। यह मुझे हमारे डेटाबेस में "LastEdited" फ़ील्ड को डिज़ाइन बिंदु से अधिक समझने में भी मदद करता है।
रेयानोस

बिल्कुल सही। यह साइट एक "दिल की धड़कन" का उपयोग करती है, जिसका अर्थ है कि सर्वर के लिए AJAX अनुरोध भेजने के समय की प्रत्येक x राशि, और यह डेटा की आईडी के साथ-साथ जाँच करने के लिए, साथ ही उस डेटा के लिए संशोधित टाइमस्टैम्प के साथ गुजरता है। तो चलिए बताते हैं हम प्रश्न # 1029 पर हैं। प्रत्येक AJAX अनुरोध, सर्वर केवल प्रश्न # 1029 के लिए संशोधित टाइमस्टैम्प को देखता है। यदि यह कभी पता चलता है कि क्लाइंट के पास डेटा का पुराना संस्करण है, तो यह एक नई प्रति के साथ हियरिंगबीट का जवाब देता है। ग्राहक तब पृष्ठ को फिर से लोड कर सकता है (ताज़ा कर सकता है), या नए डेटा के बारे में चेतावनी देने वाले उपयोगकर्ता को किसी प्रकार का संदेश प्रदर्शित कर सकता है।
क्रिस बेकर

संशोधित डाक टिकट हमारे वर्तमान "डेटा" की तुलना में बहुत अच्छे हैं और दूसरी तरफ हैश के साथ तुलना करते हैं।
Raynos

1
ध्यान रखें कि विसंगतियों से बचने के लिए क्लाइंट और सर्वर के पास ठीक उसी समय तक पहुंच होनी चाहिए।
प्रेयरलेयर

3

जैसे ही वे db के लिए किए जाते हैं, उपयोगकर्ता को परिवर्तनों का प्रचार करने के लिए आपको पुश तकनीक (जिसे धूमकेतु या रिवर्स अजाक्स के रूप में भी जाना जाता है) का उपयोग करने की आवश्यकता है। इसके लिए वर्तमान में उपलब्ध सबसे अच्छी तकनीक अजाक्स लंबी मतदान लगती है, लेकिन यह हर ब्राउज़र द्वारा समर्थित नहीं है, इसलिए आपको कमियां चाहिए। सौभाग्य से पहले से ही समाधान हैं जो आपके लिए इसे संभालते हैं। उनमें से हैं: orbited.org और पहले से उल्लेख किया गया सॉकेट ।io।

भविष्य में ऐसा करने का एक आसान तरीका होगा जिसे वेब पॉकेट्स कहा जाता है, लेकिन यह निश्चित नहीं है कि यह मानक प्राइम टाइम के लिए कब तैयार होगा क्योंकि मानक की वर्तमान स्थिति के बारे में सुरक्षा चिंताएं हैं।

नई वस्तुओं के साथ डेटाबेस में समसामयिक समस्याएं नहीं होनी चाहिए। लेकिन जब कोई उपयोगकर्ता किसी वस्तु को संपादित करता है तो सर्वर को कुछ तर्क की आवश्यकता होती है जो यह जांचता है कि इस बीच वस्तु को संपादित किया गया है या हटा दिया गया है। यदि ऑब्जेक्ट हटा दिया गया है तो समाधान फिर से, सरल है: बस संपादन को छोड़ दें।

लेकिन सबसे कठिन समस्या तब दिखाई देती है, जब कई उपयोगकर्ता एक ही समय में एक ही ऑब्जेक्ट को संपादित कर रहे होते हैं। यदि उपयोगकर्ता 1 और 2 एक ही समय में किसी ऑब्जेक्ट को संपादित करना शुरू करते हैं, तो वे दोनों एक ही डेटा पर अपना संपादन करेंगे। मान लीजिए कि उपयोगकर्ता 1 में किए गए परिवर्तन पहले सर्वर पर भेजे गए हैं, जबकि उपयोगकर्ता 2 अभी भी डेटा संपादित कर रहा है। फिर आपके पास दो विकल्प हैं: आप उपयोगकर्ता 2 के डेटा में उपयोगकर्ता 1 के परिवर्तनों को मर्ज करने का प्रयास कर सकते हैं या आप उपयोगकर्ता 2 को बता सकते हैं कि उसका डेटा पुराना है और जैसे ही उसका डेटा सर्वर को भेजता है, उसे एक त्रुटि संदेश प्रदर्शित करता है। उत्तरार्द्ध यहां बहुत उपयोगकर्ता के अनुकूल विकल्प नहीं है, लेकिन पूर्व को लागू करना बहुत कठिन है।

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

सामान को एक साथ संपादित करना वास्तव में आसान नहीं है, क्योंकि विलंबता के कारण वेब पर परमाणु संचालन करना संभव नहीं है। शायद यह लेख आपको विषय के बारे में अधिक जानने में मदद करे।


2

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

मैंने पाया है कि उल्का रूपरेखा यह अच्छी तरह से करता है ( http://docs.meteor.com/#reactivity )।

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

"इस सरल पैटर्न (प्रतिक्रियाशील संगणना + प्रतिक्रियाशील डेटा स्रोत) में व्यापक प्रयोज्यता है। प्रोग्रामर को अनसब्सक्राइब / कॉल पुनर्वितरित करने और यह सुनिश्चित करने से बचाया जाता है कि उन्हें सही समय पर कॉल किया जाता है, डेटा प्रचार कोड की पूरी कक्षाओं को समाप्त कर देता है जो अन्यथा आपके ऊपर नहीं चढ़ता है। त्रुटि-प्रवण तर्क के साथ आवेदन। "


1

मैं विश्वास नहीं कर सकता कि किसी ने उल्का का उल्लेख नहीं किया है । यह सुनिश्चित करने के लिए एक नया और अपरिपक्व ढांचा है (और केवल आधिकारिक तौर पर एक डीबी का समर्थन करता है), लेकिन यह सभी ग्रंट काम लेता है और पोस्टर जैसे बहु-उपयोगकर्ता ऐप के बारे में सोच रहा है। वास्तव में, आप एक बहु-उपयोगकर्ता लाइव-अपडेटिंग ऐप नहीं बना सकते हैं। यहाँ एक त्वरित सारांश है:

  • सब कुछ नोड.जेएस (जावास्क्रिप्ट या कॉफीस्क्रिप्ट) में है, इसलिए आप क्लाइंट और सर्वर के बीच मान्यताओं जैसे सामान साझा कर सकते हैं।
  • यह वेबस्कैट का उपयोग करता है, लेकिन पुराने ब्राउज़रों के लिए वापस आ सकता है
  • यह स्थानीय ऑब्जेक्ट के तत्काल अपडेट पर ध्यान केंद्रित करता है (यानी यूआई झंझट महसूस करता है), पृष्ठभूमि में सर्वर को भेजे गए परिवर्तनों के साथ। केवल परमाणु अपडेट को मिक्सिंग अपडेट को सरल बनाने की अनुमति है। सर्वर पर अस्वीकार किए गए अपडेट वापस रोल किए गए हैं।
  • एक बोनस के रूप में, यह आपके लिए लाइव कोड पुनः लोड करता है, और जब ऐप मौलिक रूप से बदलता है तब भी उपयोगकर्ता स्थिति को संरक्षित करेगा।

उल्का काफी सरल है कि मैं आपको सुझाव दूंगा कि आप कम से कम विचारों की चोरी करने के लिए इसे देख लें।


1
मैं वास्तव में कुछ प्रकार के ऐप्स के लिए डर्बी और उल्का के विचार को पसंद करता हूं .. दस्तावेज़ / रिकॉर्ड स्वामित्व और अनुमतियाँ केवल वास्तविक दुनिया के मुद्दों की एक जोड़ी हैं जो कि अच्छी तरह से imho हल नहीं कर रहे हैं। इसके अलावा, लंबे समय से एमएस दुनिया बनाने से आ रहा है कि 80% वास्तव में आसान है, और अन्य 20% पर बहुत अधिक समय बिताने के बाद, मैं ऐसे PFM (शुद्ध च ** राजा जादू) समाधान का उपयोग करने में संकोच कर रहा हूं।
ट्रैकर 1

1

ये विकिपीडिया पृष्ठों के बारे में सीखने के लिए ऐड परिप्रेक्ष्य में मदद मिल सकती संगामिति और समवर्ती कंप्यूटिंग एक डिजाइन करने के लिए ajax वेब अनुप्रयोग है कि या तो खींचतान या है धक्का दे दिया राज्य घटना ( EDA ) संदेशों एक में संदेश भेजने के पैटर्न । मूल रूप से, संदेशों को चैनल सब्सक्राइबर को दोहराया जाता है जो घटनाओं और सिंक्रनाइज़ेशन अनुरोधों को बदलने के लिए प्रतिक्रिया देते हैं।

समवर्ती वेब-आधारित सहयोगी सॉफ्टवेयर के कई रूप हैं ।

Etherpad-lite , एक सहयोगी वास्तविक समय संपादक के लिए कई HTTP API क्लाइंट लाइब्रेरी हैं

django-realtime- खेल का मैदान Django में विभिन्न रियल-टाइम तकनीकों जैसे Socket.io के साथ एक रीयलटाइम चैट ऐप लागू करता है ।

AppEngine और AppScale दोनों AppEngine चैनल एपीआई को लागू करते हैं ; जो Google रीयलटाइम एपीआई से अलग है , जिसे googledrive / realtime- खेल के मैदान द्वारा प्रदर्शित किया जाता है


0

सर्वर-साइड पुश तकनीकें यहां जाने का रास्ता हैं। धूमकेतु एक शब्द है (या था?)।

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

विशेष रूप से, लाइब्रेरी के लेखक द्वारा इस प्रदर्शन को देखें , जो आपके द्वारा वर्णित स्थिति के लगभग सटीक रूप से प्रदर्शित करता है।


यह काम के साथ मुद्दों को कम करने के लिए एक महान पुस्तकालय है, लेकिन मैं आवेदन डिजाइन करने के तरीके के बारे में उच्च स्तरीय जानकारी की तलाश कर रहा था
रेयनोस

1
बस ध्यान दें, कि सॉकेट.आईओ (और सिग्नलआर) ऐसे फ्रेमवर्क हैं जो वेबसोकेट को प्रथम श्रेणी के विकल्प के रूप में उपयोग करते हैं, लेकिन इसमें अन्य तकनीकों जैसे कि धूमकेतु, लंबे मतदान, फ्लैश सॉकेट और हमेशा के लिए वर्कफ़्लो का उपयोग करने के लिए संगत कमियां हैं।
ट्रैकर 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.