आप एक लाइव वेबसाइट की तैनाती के बग की संख्या को कम करने के लिए क्या कर सकते हैं?


11

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

जैसे ही आप नया संस्करण अपलोड करते हैं, सब कुछ टूट जाता है। अब, समस्या को ठीक करने में केवल 20 मिनट लग सकते हैं, लेकिन समग्र तनाव जो आप सहन करते हैं, और कंपनी को वित्तीय और सद्भावना क्षति कभी-कभी भूलने योग्य नहीं होती है।

इस प्रकार के कीड़े को कम करने के तरीके क्या हैं जो नए संस्करण परिनियोजन के प्रारंभिक कॉन्फ़िगरेशन से उत्पन्न होते हैं?

पुनश्च: कृपया चेक-सूचियों का उल्लेख न करें, क्योंकि हमारे पास पहले से ही है। चेक-लिस्ट के साथ समस्या यह है कि, उन्हें हमेशा अपडेट रहना चाहिए, लेकिन वे नहीं करेंगे।


6
जब आप इसे अपडेट करते हैं तो आपको अपनी वेबसाइट नहीं तोड़नी चाहिए। यदि आप ... तो आपकी प्रक्रिया गलत है।
रामौध

10
"चेक-लिस्ट के साथ समस्या यह है कि, उन्हें हमेशा अपडेट रहना चाहिए, लेकिन वे नहीं करेंगे" उस स्थिति में, आप बर्बाद हैं। हम आपको एक अच्छी चीजें करने के लिए कह सकते हैं, और - बस चेक-लिस्ट की तरह - यह काम नहीं करेगा। यदि आप चेकलिस्ट को अद्यतित नहीं रख सकते हैं, तो आपको यह विचार करना चाहिए कि दूसरी तरह की नौकरी में त्रुटियां थीं और सुस्ती को बेहतर तरीके से सहन किया जाता है। शायद सरकारी सेवा।
S.Lott

5
यदि आपने सब कुछ पता नहीं लगाया है, तो आपको तैनाती नहीं करनी चाहिए।
HLGEM

यदि कोई परिनियोजन विफल हो जाता है, तो आपको इसे वापस रोल करना होगा।
ट्यूलेंस कोर्डोवा

जवाबों:


28

दो चीज़ें:

  • स्टेजिंग वातावरण, जहाँ आप परीक्षण तैनाती करते हैं, के समान वातावरण।
  • तैनाती के बाद इस वातावरण का पर्याप्त परीक्षण। स्वचालित और गैर-स्वचालित।

अन्य काम हैं जो किए जा सकते हैं।

मेरा सुझाव है कि ट्रॉय हंट द्वारा स्वचालित तैनाती के बारे में 5 भाग ब्लॉग श्रृंखला पढ़ें । वह जिस टूलिंग का उपयोग करता है वह एमएस स्टैक विशिष्ट है, लेकिन अवधारणाएं सार्वभौमिक हैं।


आपका मतलब है कि पूरी दुनिया में सभी वेबसाइटों का मंचन का माहौल है
सईद नेमाटी

15
इनमें से सभी नहीं। यही कारण है कि उन्हें तैनाती के साथ ऐसी समस्याएं हैं। महत्वपूर्ण आकार की कोई भी साइट जिसके साथ मैंने काम किया है वह एक है।
ऊदबिलाव

@ सईद नेमाती - निश्चित रूप से यह सटीक कारण नहीं है कि कई वेबसाइटें वास्तव में काम नहीं करती हैं, जैसे कि उन्हें (यानी मेरे क्रेडिट यूनियनों को बाहरी भार भुगतान वेबसाइट) करना चाहिए, जब ऐसा होता है कि आपके क्षेत्र के ग्राहक केवल आप पर हंसते हैं। मेरे मामले में मेरे पास अपनी क्रेडिट यूनियनों की वेबसाइट का उपयोग करने का विकल्प है।
रामहाउंड

6
@saeed: मैं दुनिया के लिए नहीं बोल सकता लेकिन सभी मेरा धिक्कार है।
व्याट बार्नेट

1
@ सभी अच्छे लोग करते हैं।
HLGEM

13

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

सबसे पहले, आपकी तैनाती आपके भंडार पर स्थिर शाखा का सिर्फ एक क्लोन होना चाहिए। कॉन्फिगरेशन फाइल, एसक्यूएल फाइल्स, इनस्टॉल / अपडेट सहित सब कुछ जरूरी है कि संस्करण को नियंत्रित किया जाए।

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

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

अंत में अपने लाइव परिनियोजन प्रतिलिपि पर मचान क्षेत्र परिवर्तन को मर्ज करें।

आपके मंचन क्षेत्र की जटिलता आपके ऐप की जटिलता और दायरे को दर्शाती है। लेकिन किसी भी मामले में संस्करण नियंत्रण अपरिहार्य है।

बेशक अगर आप संस्करण नियंत्रण का उपयोग नहीं करते हैं - इसमें से कोई भी लागू नहीं होता है - लेकिन फिर यह उतना ही भोला है जितना कि लोगो में डेटाबेस लिखना।


3
+1 लेकिन मैं यह उल्लेख नहीं किया क्योंकि मैं सिर्फ मान लिया है संस्करण नियंत्रण समझ में आ गया था ...
maple_shaft

3
हां, आश्चर्यजनक है कि कितने लोग केवल उन कोडों को नियंत्रित करते हैं, जिनकी वे देखभाल करते हैं और कॉन्फ़िगरेशन, एसक्यूएल आदि जैसी चीजों के बारे में नहीं
HLGEM

1
@HLGEM, आप सही दुखी हैं, मैं सब कुछ नियंत्रित करता हूं, मेरे पास एक सबवर्जन सर्वर भी है जो घर पर चल रहे गैर-सरकारी दस्तावेजों के लिए है जैसे मेरे घर पर मेरा फिर से शुरू और खाना पकाने की विधि है। :)
maple_shaft

2
@maple_shaft, ओह, मैंने कभी भी अपने फिर से शुरू होने वाले संस्करण को नियंत्रित करने के बारे में नहीं सोचा था, क्या शानदार विचार है।
एचएलजीईएम

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

6

जैसा कि सुझाव दिया गया है, एक स्टेजिंग सिस्टम का उपयोग करें । यह आपको एक जीवित वातावरण में अपने परिवर्तनों का परीक्षण करने का अवसर देता है।

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

एक और बात: अपनी तैनाती प्रक्रिया को स्वचालित करें । चींटी माइग्रेट के साथ db माइग्रेशन करें, नवीनतम संस्करण svn से capistrano आदि के माध्यम से तैनात करें। जब आप कुछ तैनात करते हैं, तो आपको अधिक नहीं करना चाहिए, बस एक क्लिक और सब कुछ स्वचालित है। विशेष रूप से उन वेबसाइटों के लिए जिन्हें कुछ कॉन्फ़िगरेशन सेटअप की आवश्यकता होती है, परिनियोजन के लिए आवश्यक मैन्युअल चरण एक बुरे सपने हैं और संभावना है कि कुछ गलत हो जाता है।


6

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

बोनस अंक के लिए, C जोड़ें और सुनिश्चित करें कि आपके सिस्टम भौगोलिक रूप से अलग हैं इसलिए भूकंप उनमें से 2 को एक साथ बाहर नहीं ले जाएगा।

कई अनुप्रयोगों के लिए, मैं मानता हूं कि यह ओवरकिल है।

यह आपके द्वारा किए जाने वाले किसी भी लेन-देन प्रबंधन को भी जटिल बनाता है, लेकिन समस्याएँ कम करने योग्य नहीं हैं।


1
यह सही उत्तर है

2
धन्यवाद। लेकिन वर्जनिंग, स्टेजिंग सिस्टम और एक टच डिप्लॉय सभी आवश्यक भी हैं।
बिल माइकेल

5

हां, आपको एक ऐसे परीक्षण या मंचन के माहौल की आवश्यकता है जहां आप सभी चरणों से गुजरते हैं, लेकिन अलग-अलग वातावरण के लिए अलग-अलग कॉन्फ़िगरेशन फ़ाइलों को रखना आवश्यक है।

Environments
|_property_files
    |_ dev
        |_ com.bla.util
        |    |_ example.properties
        |_ com.bla.beans
        |    |_ someconfig.xml
    |_ test
        ....
    |_ production
        ....
|_database_updates
    |_ dev
        |_ insert_new_static_data.sql
        |_ ...

...

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

मैं एक कस्टम बिल्ड कार्य के साथ ऐसा कर सकता था, लेकिन मैं वास्तव में मेरे लिए ऐसा करने के लिए कुछ JUnit परीक्षणों का उपयोग करता हूं। यदि कोई SQL अपवाद उत्पन्न होता है तो परीक्षण विफल हो जाता है और इस प्रकार तैनाती विफल हो जाती है। आम तौर पर एसक्यूएल लिपियों में भी बुद्धिमत्ता होती है, यदि आवश्यक डेटा पहले से ही पर्यावरण में मौजूद है तो वे इन्सर्ट या अपडेट को छोड़ देते हैं।

मेरे पास बैच या शेल स्क्रिप्ट के लिए समान निर्देशिका है जो मुझे एक विशिष्ट वातावरण के लिए चलाने की आवश्यकता है।

आपके प्रश्न में सभी इस प्रकार है: उन्हें हमेशा अपडेट रहना चाहिए, लेकिन वे नहीं करेंगे।

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

संक्षेप में, निरंतर एकीकरण (CI) सिद्धांतों को अधिक से अधिक अपनाने से उत्पादन रिलीज के दर्द को दूर करने में मदद मिलेगी।


4

1) पहले टेस्ट साइट पर जाएँ और अपने परिवर्तनों का परीक्षण करें

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


और किसी कोड की समीक्षा करना सुनिश्चित करें जो प्रत्येक अलग वातावरण के लिए कॉन्फ़िगरेशन।
HLGEM

4

पूर्व-उत्पादन वातावरण के लिए ऊपर दिए गए उत्कृष्ट सुझावों के अलावा और स्वचालित परीक्षण का उपयोग करें:

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

कोडबेस को सेगमेंट करें । एक आम तरीका इसे अलग करना है:

  • कुछ मुख्य भाग जो धीरे-धीरे बदलते हैं और साइट पर साझा किए जाते हैं
  • कई पत्ती वाले हिस्से जो अधिक तेज़ी से बदल सकते हैं लेकिन प्रत्येक केवल साइट के एक छोटे हिस्से को प्रभावित करते हैं

आपके कोड आधार की यह समझ आपको अपने विकास और परीक्षण को मुख्य भागों पर केंद्रित करने की अनुमति देती है, क्योंकि बग्स में सबसे कठोर प्रभाव होगा।


3

एक अच्छी तरह से निष्पादित रिलीज योजना और संचार के बारे में है। तो रिलीज से पहले इन सवालों पर विचार करें:

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

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

  3. मेरी आकस्मिक योजनाएँ क्या जारी होनी चाहिए? उदाहरण के लिए, यदि रिलीज़ खराब हो जाती है, तो क्या हमें वापस रोल करना चाहिए और सिस्टम को उस तरह से बहाल करना चाहिए, जिस तरह से हम ऑफ़लाइन हैं? और यदि ऐसा है, तो एक अच्छी तरह से प्रलेखित रिलीज को वापस लाने के लिए कदम हैं? या समस्या होने पर समस्या निवारण में सहायता करने के लिए मेरे पास कॉल पर या हाथ पर सही लोग होने चाहिए। व्यक्तिगत रूप से, मुझे लगता है कि किसी भी रिलीज की योजना के दृष्टिकोण का सबसे अच्छा तरीका यह है कि रिलीज के साथ कुछ गलत हो जाएगा। इस तरह मैंने खुद को समय से पहले इनमें से कुछ मुद्दों पर सोचने के लिए मजबूर किया है।

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

फिर अभ्यास परिनियोजन पूरा हो गया है, अपने नोट्स देखें और देखें कि क्या आप त्रुटियों को खत्म करने की प्रक्रिया को परिष्कृत कर सकते हैं। फिर इसे फिर से करें । जब तक कोई रिलीज निर्देश निष्पादित नहीं करता है, तब तक अभ्यास करते रहें, जैसे कि एक सरल निर्देश पत्र का पालन करना, जैसे कि "इस मशीन में लॉगिन करें, इस कमांड को निष्पादित करें; फिर डेटाबेस में लॉगिन करें और इस एसक्यूएल कमांड को निष्पादित करें; तब ..."

ऊपर दी गई बातें एक ऑपरेशन या रिलीज़ प्रबंधन टीम है जो रिलीज़ को सुचारू रूप से चलाने में मदद कर सकती है। लेकिन एक रिलीज में जोखिमों को कम करने में इंजीनियरिंग क्या कर सकती है?

  1. छोटे को जारी रखें। सीधे शब्दों में कहें, एक रिलीज के द्वारा कोड परिवर्तन का सेट जितना जटिल होगा, रिलीज उतना ही जोखिम भरा हो जाएगा। एक ही समय में बड़ी रिलीज़ की एक छोटी संख्या के बजाय बड़ी संख्या में छोटी रिलीज़ करने की योजना बनाकर अपने ऑपरेशन टीम पर एहसान करें।

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

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


1

यहाँ कई उत्तर आपको पहले ही बता देते हैं कि समस्या के अपने विशिष्ट समाधान को कैसे लागू किया जाए, लेकिन, जहाँ तक मैं बता सकता हूँ, असली समस्या किसी वेबसाइट के ठीक से माइग्रेट करने / अपडेट करने की नहीं है। हो सकता है कि इसके पीछे का डिजाइन / वास्तुकला नाजुक हो।

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

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

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