गो पर एक वेब एप्लिकेशन बनाने में कुछ खामियां

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

गो वेब प्रोग्रामिंग के बीच एक महत्वपूर्ण अंतर यह है कि परिणामस्वरूप, आपको आमतौर पर एक प्रोग्राम मिलता है जो एक वेब सर्वर है। इसलिए, आप वेब सर्वर आमतौर पर जवाब देने के लिए जिम्मेदार हो जाते हैं।

अगर हम तुलना करते हैं कि PHP और गो में हैलो वर्ल्ड कैसा दिखता है, तो हम देखेंगे

पीएचपी

<?php echo “Hello World”; ?> 

जाओ

 package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } 

जाओ भाषा साइट विकि से लिया गया

इसी कोड का उपयोग हब पर निम्नलिखित लेखों में किया जाता है: Go पर वेब विकास , हम Go पर एक वेब टर्मिनल एमुलेटर लिखते हैं , Websocket , Goblog: Go पर एक ब्लॉग के लिए होम-स्टैटिक इंजन , गो पर अपने वेब एप्लिकेशन को लिखते हैं

मैंने खुद को मेरा प्रमाणपत्र प्राधिकरण - 5 ओपनएसएसएल टीमों के लेख में , गो पर एक समान उदाहरण दिया।

संबंधित: भाषा जाओ एक छोटा क्लाइंट-सर्वर एप्लिकेशन , गो पर टीसीपी / आईपी प्रॉक्सी

गो का एक महत्वपूर्ण अंतर और लाभ यह है कि कैसे गो नेटवर्क के साथ काम करता है और उदाहरण के लिए, लंबे मतदान को लागू करने के लिए कई खुले कनेक्शन रख सकता है।

विभिन्न भाषाओं / प्लेटफार्मों में C10k (समस्या 10,000 कनेक्शन) के लेख में Erlang के बाद दूसरा परिणाम दिखा, जिसमें 10,000 में से 9,775 कनेक्शन खोले गए।

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

त्रुटि इन सभी उदाहरणों का दोष


नुकसान यह है कि कनेक्शन के लिए टाइमआउट (समय सीमा) डिफ़ॉल्ट रूप से 0 है (यानी टाइमआउट सेट नहीं है)। यदि क्लाइंट पैकेट नहीं भेजता है कि कनेक्शन बंद है, तो ऐसा कनेक्शन हमेशा के लिए लटका रहेगा। यह वेब सर्वर के जीवन के अंत तक अतिरिक्त मोड में गोरोइन को अवरुद्ध कर देगा। खुले कनेक्शन संसाधनों की संख्या आमतौर पर सीमित है। डिफ़ॉल्ट रूप से, लिनक्स पर, एक एप्लिकेशन 1024 फाइलें खोल सकता है (एक टीसीपी कनेक्शन एक फाइल के बराबर है)।

इसका अर्थ है गो पर बना एक सर्वर निम्नानुसार है

 http.ListenAndServe(":8080", nil) 

यह धीरे-धीरे गैर-बंद यौगिकों को जमा करेगा और हर दूसरे दिन, महीने या साल में उनमें डूब जाएगा।

इसलिए, टाइमआउट को सेट करना महत्वपूर्ण है, जो डिफ़ॉल्ट वेब सर्वर में डिफ़ॉल्ट रूप से स्थापित होते हैं।

उदाहरण के लिए

  // log.Fatal(http.ListenAndServe(":8085", nil)) { s := &http.Server{ Addr: ":8085", Handler: nil, ReadTimeout: 1000 * time.Second, WriteTimeout: 1000 * time.Second, MaxHeaderBytes: 1 << 20, } log.Fatal(s.ListenAndServe()) } 

दूसरा दोष वह पैरामीटर है जो अक्सर एक नियमित वेब सर्वर में इंगित किया जाता है वेब सर्वर खोलने के लिए तैयार होने वाले कनेक्शन की अधिकतम संख्या है। यदि यह सीमा समाप्त हो जाती है, तो वेब सर्वर, रखे-बनाए कनेक्शनों का त्याग करने या त्रुटि देने और कनेक्शनों को बंद करने के लिए शुरू होता है।

गो डिफ़ॉल्ट रूप से ऐसा नहीं करता है, और यह स्पष्ट नहीं है कि गो में कनेक्शन की संख्या को कैसे सीमित किया जाए या कनेक्शन की संख्या की गणना की जाए, या इस प्रक्रिया को कम नियंत्रित किया जाए।

कनेक्शन प्रबंधित करने के तरीके को समझने के लिए, आपको funcndServe और func (* Server) ListenAndServeTLS के फंक (* सर्वर) स्रोतों को देखने की जरूरत है, फिर हम देखेंगे कि दोनों फ़ंक्शन फंक (* सर्वर) सेवा का उपयोग करते हैं।

यह फ़ंक्शन एक तर्क के रूप में net.Listener इंटरफ़ेस प्राप्त करता है।
यहां हम कनेक्शन को सीमित करने और नियंत्रित करने के लिए इसे लागू कर सकते हैं।
Net.Listener इंटरफ़ेस के चारों ओर लपेटने का एक उदाहरण एक LimitListener है

[गो] टैग के साथ हब पर लेखों के माध्यम से जाने के बाद, मुझे कोई उदाहरण नहीं मिला जिसमें टाइमआउट, डेडलाइन स्थापित किया गया था या कनेक्शन की संख्या को नियंत्रित किया गया था।

यह देखते हुए कि गो को एक सुपर-समानांतर, नेटवर्क भाषा के रूप में बनाया गया था, कनेक्शन के साथ काम करने में सही और अच्छी तरह से सोची-समझी रणनीति का कार्यान्वयन गो एप्लीकेशन का एक अनिवार्य तत्व है।

Source: https://habr.com/ru/post/In197468/


All Articles