आप वेबपेज में डेटा के एक ही टुकड़े को संपादित करने वाले कई उपयोगकर्ताओं को कैसे संभालते हैं?


26

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

मैं इस परियोजना के विवरण को छोड़ने की कोशिश कर रहा हूं क्योंकि मैं निम्नलिखित स्थितियों को संभालने के लिए समग्र अवधारणा के साथ और अधिक जूझ रहा हूं, लेकिन अगर यह मदद करता है, तो मैं जावा, एक्लिप्सलिंक, और GWT के साथ RequestFactory लागू कर रहा हूं। डेटाबेस PostgreSQL है।

इसलिए मैं जिन वैचारिक समस्याओं का समाधान करने का प्रयास कर रहा हूं वे निम्नलिखित हैं:

  1. यदि एक एकल कार्य जो कई उपयोगकर्ताओं के लिए सामान्य है, किसी भी तरह से बदलता है जैसे कार्य पूरा, हटा दिया गया है, आदि, उन सभी उपयोगकर्ताओं की कार्य सूची, जिनके पास यह कार्य है, अपडेट किया जाएगा। ऐसे कौन से डिज़ाइन पैटर्न हैं जो इस फ़ंक्शन को लागू करने में सहायता करते हैं?

    • कुछ पैटर्न जो मैंने देखे हैं वे ऑब्जर्वर और मध्यस्थ हैं - क्या अन्य हैं जिन्हें इन पर विचार किया जाना चाहिए?
  2. कहते हैं कि दो उपयोगकर्ता एक ही समय में एक ही कार्य को बदल रहे हैं।

    • पहले, क्या मुझे उस स्थिति को होने देना चाहिए या क्या मुझे उस पर तब तक ताला लगाना चाहिए जब तक कि एक या दूसरे व्यक्ति को बदलाव करने के लिए नहीं किया जाता है?

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

मैं वास्तव में इस वेब ऐप के कई उदाहरणों के बीच डेटा को सही तरीके से सिंक करने के तरीके के बारे में बता सकता हूं। मैं इसकी बहुत सराहना करूंगा!

जवाबों:


17

मुझे लगता है कि व्हाइटबोर्ड # 1 के लिए आपकी पसंद का पैटर्न होगा, आपको एक आम जगह पर कार्यों (या अन्य साझा किए गए डेटा) में परिवर्तन पोस्ट करना चाहिए, इसलिए सभी इच्छुक पार्टियां उन्हें और डीटीआरटी देख सकती हैं।

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


7

मैं एक डेस्कटॉप एप्लिकेशन के लिए एक डिज़ाइन के साथ आया (जो अभी तक पूरी तरह से परीक्षण किया जाना है) समान आवश्यकताओं के साथ जो सहायक हो सकता है।

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

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

मेरे पास उन सभी परिवर्तनों के साथ एक पूर्ववत स्टैक भी था, ताकि उपयोगकर्ता वापस आ सकें।

यह एक वेब ऐप के लिए सबसे अच्छा मॉडल नहीं हो सकता है, क्योंकि चूंकि मॉडल को दृश्य में परिवर्तन प्रसारित करना था, जो कि सबसे आसान w / वेब क्लाइंट नहीं हो सकता है।


4

1. के लिए आपको यह देखना चाहिए कि प्रकाशित / सदस्यता पैटर्न बेहतर अनुकूल है या नहीं।
2 के लिए। यह आपकी स्थिति पर निर्भर करता है:

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

प्रश्न अधिक अकादमिक है, इसलिए मैं यह देखने के लिए बहुत बार कहूंगा कि यह सबसे खराब स्थिति में कैसे ध्यान रखा जाता है। पैटर्न संदर्भों के लिए +1।
हुल्केमिस्टर

@ kr1 pivotaltracker में संघर्ष चेतावनी का अभाव है और यह गैर-परस्पर विरोधी परिवर्तनों को मर्ज नहीं करता है, इसलिए इसे एक अच्छे रिकॉर्ड संपादन बहुउपयोगकर्ता एप्लिकेशन के एक अच्छे उदाहरण का उपयोग नहीं किया जाना चाहिए।
एडुआर्डो

0
  • लॉक रिकॉर्ड। यह पसंद नहीं है क्योंकि यह संक्षिप्तता को कम कर देगा और रिकॉर्ड को आवश्यकता से अधिक समय के लिए लॉक किया जा सकता है।
  • अन्य समवर्ती परिवर्तनों को ओवरराइट करने के लिए अंतिम। यूजर्स ऐसा नहीं चाहते हैं। कुछ सॉफ्टवेयर जैसे JIRA ऐसा करता है। https://community.atlassian.com/t5/Jira-questions/Edit-a-JIRA-Issue-at-the-same-time-by-two-Users-result-in-last/qaq-p/389243
  • समवर्ती संपादन। आवेदन को बदले जाने वाले रिकॉर्ड के केवल क्षेत्रों को प्रस्तुत करना चाहिए। इस तरह आप संघर्षों को रोकते हैं। अधिकांश विकी सॉफ़्टवेयर उसी टेक्स्ट फ़ील्ड में परिवर्तनों को मर्ज कर सकते हैं यदि कोई टकराव न हो: /programming/3411888/how-does-a-wiki-handle-multiple-simultaneous-edits उदाहरण के लिए देखें MediaWiki समवर्ती संपादन की अनुमति देता है और संघर्ष के मामले में एक अच्छा यूआई है: https://www.mediawiki.org/wiki/Extension:TwoColConflict

मेरी सिफारिश है कि यदि ऐसा होता है तो कभी भी संघर्ष को बंद न करें और रिपोर्ट करें।

कृपया, इस पर एक नज़र डालें:

https://github.com/spring-projects/spring-petclinic/issues/433

आप एक वीडियो और नमूना कोड देख सकते हैं।

क्या यह आपकी आवश्यकताओं को पूरा करेगा?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.