क्या एक एकल विफलता एक थोक संचालन को विफल कर सकती है?


11

एपीआई में मैं एक बड़ी संख्या में काम कर रहा हूं, जो आईडी के एक सरणी को स्वीकार करता है:

["1000", ..., "2000"]

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

try{
savepoint = conn.setSavepoint();

for(id : IDs)
    if( !deleteItem(id) ){
        conn.rollback(savepoint);
        sendHttp400AndBeDoneWithIt();
        return;
    }

conn.commit();
}

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


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

मैंने मामले पर कुछ मार्गदर्शन के लिए ऑनलाइन तलाश करने की कोशिश की, लेकिन मैं खाली हाथ आया हूं। इसलिए मैं आपके पास आता हूं: इस प्रकृति के थोक संचालन से सबसे अधिक क्या उम्मीद है? क्या मुझे और अधिक सख्त होना चाहिए, या क्या मुझे अधिक अनुमति होनी चाहिए?


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

1
@Becuzz उपयोगकर्ता एक या दो बचे हुए नोटों को देखेगा और उसके बारे में टिकट खोलेगा; वर्तमान स्थिति "omg Delete टूट गया है"। सौभाग्य से उपयोगकर्ता दालान से नीचे है इसलिए यह इस बार बहुत अधिक समस्या नहीं है। मुद्दा यह है कि, जब भी संभव हो , मैं सही काम करना पसंद करता हूं , और एक 10+ वर्षीय कोडबेस के साथ, भगवान जानता है कि कुछ चीजें सही ढंग से किए जाने के लिए खड़ी हो सकती हैं
रथ

मुझे लगता है कि यह इस बात पर भी निर्भर करता है कि आप स्केलेबिलिटी चाहते हैं या नहीं। यदि आपके पास बहुत अधिक आईडी होने का इरादा नहीं है, तो यह बहुत ज्यादा मायने नहीं रखना चाहिए। यदि आप एक लाख आईडी, या बेहतर अभी तक का इरादा रखते हैं, तो यह पूरी तरह सुनिश्चित नहीं है कि ऐसा नहीं होगा, तो आप आईडी को हटाने के लिए एक घंटे खर्च कर सकते हैं, क्योंकि यह 1 अमान्य आईडी के कारण पूरी तरह से रीसेट हो सकता है।
imnota4

1
@ imnota4 एक उत्कृष्ट बिंदु जिसे मैंने नहीं माना था। UI अनुरोध को लगभग 250 तक सीमित करता है, लेकिन बैकएंड में कोई प्रतिबंध नहीं है। मेई आपको जवाब के रूप में अपनी टिप्पणी को फिर से लिखने के लिए कहते हैं?
रथ

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

जवाबों:


9

डिलीट एंडपॉइंट का 'सख्त' या 'अच्छा' संस्करण करना ठीक है, लेकिन आपको उपयोगकर्ता को स्पष्ट रूप से बताने की जरूरत है कि क्या हुआ।

हम इस समापन बिंदु के साथ एक डिलीट एक्शन कर रहे हैं। संभावना DELETE /resource/bulk/या कुछ इसी तरह। मैं मीन मेख निकालने वाला नहीं हूं। यहां क्या मायने रखता है कि कोई फर्क नहीं पड़ता कि आप सख्त या अच्छे होने का फैसला करते हैं, आपको वास्तव में वही हुआ जो वापस रिपोर्ट करना है।

उदाहरण के लिए, एक एपीआई जिसके साथ मैंने काम किया था, एक DELETE /v1/student/समापन बिंदु था जो बल्क आईडी स्वीकार करता था । हम परीक्षण के दौरान अनुरोध को नियमित रूप से भेजेंगे, एक 200प्रतिक्रिया प्राप्त करेंगे और मान लेंगे कि सब कुछ ठीक था, केवल बाद में यह पता लगाने के लिए कि सूची में हर कोई दोनों डेटाबेस में अभी भी (निष्क्रिय करने के लिए सेट) था या वास्तव में एक त्रुटि के कारण नष्ट नहीं किया गया था भविष्य की कॉल को गड़बड़ कर दिया GET /v1/studentक्योंकि हमें वह डेटा वापस मिल गया जिसकी हमें उम्मीद नहीं थी।

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

नीचे पंक्ति, कोई फर्क नहीं पड़ता कि आप क्या करते हैं, सुनिश्चित करें कि आप अंतिम उपयोगकर्ता को यह बताने का एक तरीका प्रदान करते हैं कि क्या हो रहा है, और संभवतः इसका क्या चल रहा है। IE, यदि हमने एक सख्त प्रारूप चुना है, तो प्रतिक्रिया हो सकती है 400 - DELETE failed on ID 1221 not found। यदि हमने एक 'अच्छा' संस्करण उठाया, तो यह 207 - {message:"failed, some ids not deleted", failedids:{1221, 23432, 1224}}(मेरे खराब जॅन्सन फॉर्मेटिंग का बहाना) हो सकता है।

सौभाग्य!


6
207 Multi-Statusउस आंशिक विफलता की प्रतिक्रिया के लिए उपयुक्त हो सकता है
रिचर्ड टिंगल

1
हम वहाँ चलें! मैं वास्तव में इसे याद नहीं कर सका! मैं आगे जा रहा हूं और उस उत्तर को अपडेट कर रहा हूं, क्योंकि यह वास्तव में मानक तक है।
एडम वेल्स

2

एक सख्त और अनुमेय होना चाहिए।

आमतौर पर, बल्क लोड 2 चरणों में टूट जाते हैं:

  • मान्यकरण
  • लोड हो रहा है

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

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


मैं डीबी मूल्यों के खिलाफ आईडी को मान्य नहीं करता, मैं बस उन्हें हटाने की कोशिश करता हूं और देखता हूं कि कैसे जाता है, या यह हमेशा के लिए ले जाएगा। एन विफलताओं के बाद गर्भपात करना एक बहुत ही उचित सुझाव लगता है, +1
रथ

2

क्या एक एकल विफलता एक थोक संचालन को विफल कर सकती है?

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

प्रश्न 1 : 'अगर कोई व्यक्ति डिलीट नहीं करता है तो उपयोगकर्ता को क्या परिणाम होगा?'

उत्तर को बाकी डिज़ाइन / कार्यान्वित व्यवहार को चलाना चाहिए।

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

यदि उपयोगकर्ता द्वारा आगे बढ़ने से पहले विफल हटाए जाने को हल करने की आवश्यकता है, तो सख्त स्पष्ट रूप से बेहतर है।

उपयोगकर्ता को विकल्प देना (उदाहरण के लिए, अनिवार्य रूप से एक अनदेखा-विफल ध्वज या तो सख्त या डिफ़ॉल्ट के रूप में डिफ़ॉल्ट के साथ) सबसे उपयोगकर्ता के अनुकूल दृष्टिकोण हो सकता है।

प्रश्न 2 : 'डेटा स्टोर में अभी भी नहीं हटाए गए आइटमों के साथ प्रदर्शन किए जाने पर क्या कोई डेटा सुसंगतता / संगति समस्याएं होंगी?'

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


0

मुझे लगता है कि यह इस बात पर निर्भर करता है कि आप स्केलेबिलिटी चाहते हैं या नहीं। यदि आपके पास बहुत अधिक आईडी होने का इरादा नहीं है, तो यह बहुत ज्यादा मायने नहीं रखना चाहिए। यदि आप एक लाख आईडी, या बेहतर अभी तक का इरादा रखते हैं, तो यह पूरी तरह सुनिश्चित नहीं है कि ऐसा नहीं होगा, तो आप आईडी को हटाने के लिए एक घंटे खर्च कर सकते हैं, क्योंकि यह 1 अमान्य आईडी के कारण पूरी तरह से रीसेट हो सकता है।


-1

मैं यहां एक महत्वपूर्ण बात कहना चाहता हूं कि एक सामान को हटाने के लिए इसका क्या मतलब है।

क्या ये आईडी किसी तरह तार्किक रूप से संबंधित हैं, या यह सिर्फ एक सुविधा / प्रदर्शन है - इनका बैच समूहन?

किसी भी मामले में, यहां तक ​​कि शिथिल, जुड़े हुए, मैं इसके लिए जाऊंगा strict। यदि यह सिर्फ एक बैच मोड है (उदाहरण के लिए उपयोगकर्ता अपने काम के अंतिम मिनटों के लिए "सेव" पर क्लिक करता है, और उसके बाद ही बैच ट्रांसमिट होता है) तो मैं permissiveसंस्करण के लिए जाऊंगा ।

जैसा कि अन्य उत्तर में कहा गया है: किसी भी मामले में "उपयोगकर्ता" को बताएं कि वास्तव में क्या हुआ था।

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